Seleniumを使ったシステムテストをAzure DevOpsに導入した話

この内容はAzure DevOps Advent Calendar 2020の1日目の記事です
qiita.com

Seleniumを使ったシステムテストをAzure DevOpsに導入した話

僕のホビープロジェクト、マンガログサービスマンガ読んだ!!は、フレームワークにBlazor、CI/CDにAzure DevOpsを使っています。作り出してから3年以上経ちますが、ずっとシステムテストを導入していなかったので、今回導入することにしました(この話はソフトウェアテスト Advent Calendar 2020にも書きます!)。

SeleniumをAzure DevOpsで動かす

BlazorはSPAのためシステムテストにはSeleniumを使いました。最初SeleinumをAzure DevOpsで動かすのは設定が色々大変かと思っていましたが、実はNuGetでSeleniumを指定さえしていれば、Azure DevOpsでは特に何も設定しなくても動きます。それよりもそもそもAzure DevOpsのPipelineでMsTestが動いてくれないことの方が悩みました(この解決はQittaにAzure DevOpsのPipelineのtaskでMSTestを動かす方法を書きました)。とりあえず設定出来てAzure DevOpsでSeleinumを使ったシステムテストは無事動くようになりました。

clickイベントに失敗する場合の対応

Azure DevOpsでテストが動くようになって、最初に躓いたのが、ローカルではオールグリーンになっているけれど、Azure DevOps上でのみ失敗になるケースです。最初は、clickイベントが全て失敗していました。これは、画面を最大化することで回避出来ました。RemoteWebDriverでウィンドウを最大化してやればOKです。

Driver.Manage().Window.Maximize();

タイムアウトの対応

次はAzure DevOps上のみで出るタイムアウトがありました。Seleniumタイムアウトはさまざまあるので、どこの設定かで悩みがちです。今知っているのは5個のタイムアウトの設定があります。今回僕がタイムアウトとして解決するにはChromeDriverの第三引数で指定するタイムアウトでした。最初はPageLoadのタイムアウトだと思っていたので、あれ?変わらないと悩みました。それぞれマニュアルを読んで正しいタイムアウト値を設定するようにしましょう。

Driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), new ChromeOptions(), TimeSpan.FromSeconds(120));
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(120);
Driver.Manage().Timeouts().PageLoad = TimeSpan.FromMinutes(10);
Driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromMinutes(10);
DriverWait = new WebDriverWait(Driver, TimeSpan.FromSeconds(60));

不明なエラー対応に画面キャプチャ

そして、これ以外にも、Azure DevOps上のみで出る理由が分からないエラーがありました。Azure DevOpsは実際Seleinumで実行しているUIを見ることが出来ないのでエラーの特定が難しくなります。せめてエラーが出た瞬間の画面キャプチャが見られれば大分楽になるので、それが出来る仕組みが欲しくなりました。(これもQittaにAzure DevOpsでSeleniumを使ったシステムテストがエラーの場合に画面キャプチャを見る方法を書きました)。画面キャプチャなくエラー対応するのは結構厳しいと思います。

まとめ

Seleniumを使ったシステムテストをAzure DevOpsに導入するには、実はAzure DevOpsとしては殆どやることはなく、むしろMsTestでの設定をやっておく必要があります。ただ、ローカルでは起きなくても、Azure DevOpsで動かしたことで起きる問題はままあるので、その対応がむしろ大変かなと思います。その際にはエラー時に画面キャプチャがあると大分違うので是非設定しておくことをオススメします。