Azure DevOpsでSeleniumを使ったシステムテストがエラーの場合に画面キャプチャを見る方法
Seleniumを使ったシステムテストを作った場合、テストがエラーになった場合にその時の画面キャプチャが見られると便利です。特にAzure Devopsで動かした場合、実際の実行状況を見ることが出来ないので、画面キャプチャは重要な情報です。結論から言うとAzure DevOpsの設定は特に必要なくローカルでしかるべき設定をしておけば、それだけでエラーの場合に画面キャプチャを見ることが出来ます。
Seleniumで画面キャプチャを生成する方法
先ず、Seleniumで実行している画面のキャプチャは、Seleniumの機能で撮ることが出来ます。RemoteWebDriverにGetScreenshotというメソッドがあるので、この戻り値のclassのメソッドでSaveAsFileにフルパスのファイル名を指定すれば任意の場所にその画面キャプチャが生成出来ます。
var screenshot = Driver.GetScreenshot();
screenshot.SaveAsFile(@"C:\temp\Capture.jpg");
画面キャプチャを欲しいタイミングに限定する方法
この画面キャプチャは全テストで欲しいわけでありません。成功したテストの場合はいらないので、限定するにはテストの結果が分かる必要があります。これはTestContextを使えば取得できます。TestCleanupで、TestContextのCurrentTestOutcomeプロパティを見ればテストの結果も分かるし、またTestNameプロパティでテスト名も取れるので、この名前をファイル名にすれば自動的にユニークに出来ます。ただMSTestでTestContextを使う場合ちょっと癖があります。
TestContextの設定
TestContextのインスタンスをプロパティで1個、staticフィールドで1個、合計2つ持つ必要があります。そして、ClassInitializeで、staticフィールドのTestContextにコピーして、実際に使う時は何も設定しないプロパティのTestContextを使います。プロパティのTestContextを使わずにTestCleanupで_testContextをチェックするとこのテストは何個回していても全て同じテスト名が来てしまいます。何故か何も設定していないプロパティのテスト名は更新されています。staticプロパティ1個だけにすると今度はテストが実行できなくなります。stackoverflowにも書いてありましたが、この2個持ち以外の方法ではうまく行きませんでした。。。
public TestContext TestContext { get; set; }
private static TestContext _testContext;
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
_testContext = testContext;
//TestContext = testContext; //x:フィールドには入れずにプロパティだけに入れると何故かテストが実行できない
[TestCleanup]
public void TestCelean()
{
_testContext.CurrentTestOutcome //x:本来こっちで良い気がするが、このインスタンスは最初のテスト情報しか入らない
TestContext.CurrentTestOutcome //〇:本来こっちには何も入れてない気がするが、このインスタンスはその時動いたテスト情報が入る
テストが成功しなかった時に画面キャプチャを添付する方法
さて、TestContextでテストの結果が取れるようになったので、あとはTestCleanupで、_testContext.CurrentTestOutcomeが成功の場合はreturnしてやります。成功「以外」の場合とすることで、タイムアウトや例外の場合なども対象となります。この状態でTestContextにAddResultFileすればそのファイルを関連画像として扱う事が出来ます。
[TestCleanup]
public void TestCelean()
{
if (TestContext.CurrentTestOutcome == UnitTestOutcome.Passed) return;
var screenshot = Driver.GetScreenshot();
var screenshotFile = Path.Combine(Directory.GetCurrentDirectory(), $"{TestContext.TestName}.png");
screenshot.SaveAsFile(screenshotFile);
TestContext.AddResultFile(screenshotFile);
}
これで実際にテストが失敗した時にテストエクスプローラーでみるとこんな感じになります。
Azure DevOpsでエラーの場合に画面キャプチャを見る
この設定をしておけば、Azure DevOpsでテストタスクを実行するだけで、自動的にエラーの場合に画面キャプチャを見ることが出来ます!実際にPipelineで画像をみたい時は、Pipelineの結果画面で、1.Testsをクリック。実際にエラーになったテストが表示されるので、2.テスト名をクリック、3.Attachmentsをクリックすると4にエラーの場合の画面キャプチャが表示されます。便利!