やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

(Azure DevOps)Azure Pipelines で.NET Framework + xUnit のユニットテストの実行と集計方法について

.NET Framework を使ってちょっとしたプログラムを作っていたのですが、ユニットテスト プロジェクトにxUnit を使った場合のAzure Pipelines のタスク設定方法がわからなかったので備忘録として残しておきます。 Azure Pipelines でのテスト タスクは.NET Core のサンプルとかはよくブログに書いていることが多いんですが、.NET Framework に関する内容はかなり少ないです。 ちなみに.NET Core でのテストであればdotntet testコマンドで実行できるので実はそれほど迷わないんですよね~。

動作環境

予めxunit.runner.consoleはNuGet から追加しておく必要があります。

Azure Pipelines からタスクを追加する

初見だとVisual Studio Testを追加してしまいがちなんですが。実はこれが罠。 Visual Studio Testだと、xUnit プロジェクトのビルドとテストの実行はしてくれますが、テスト結果を集計してくれません。 そもそもvstest.console.exeが実行されてしまいます。

<実行されるログの例>

vstest.console.exe 
"D:\a\1\s\Tests\hogehoge\bin\Release\hogehoge.Tests.dll"
/EnableCodeCoverage
/logger:"trx"
/TestAdapterPath:"D:\a\1\s"
/InIsolation
Starting test execution, please wait...

やっぱりテストを実行したからにはテスト結果を集計してDashboards とかに表示したいですよね?

じゃあ、どうやるの?といろいろ試した結果、以下の方法で実現できました。

iyemon018.hatenablog.com

上記はJenkins を使ったやり方ですが、Azure Pipelines にも応用できます。 具体的には以下の通り。

  1. タスクからCommand Lineを追加する。
  2. Scriptを貼り付ける。
  3. 他はそのままでOK
  4. タスクからPublish Test Resultsを追加する。
  5. Test result formatxUnitを選択し、Test results filesに2.で設定したテスト結果ファイルパスを入力する。
  6. 他はそのままでOK

Scriptはこんな感じです。

packages\xunit.runner.console.2.4.0\tools\<.NET Versionによって異なる>\xunit.console.exe
$(System.DefaultWorkingDirectory)\Tests\<ユニットテスト プロジェクト フォルダ>\bin\$(BuildConfiguration)\<テストアセンブリ名>.dll -xml ./test-results.xml

.NET Framework のバージョンやプロジェクトの名前によって必要な箇所は適宜修正して使ってください。 xunit.runner.console.exe を使って-xml <テスト結果ファイル名>としてやればいいです。 このテスト結果ファイル名Publish Test Resultsでも使用するので注意してください。

この状態でビルドを実行すると、[Pipelines] - [Builds] - [History] - [Tests] にテスト結果が集計されます。 ここまで来たらDashboards のテスト結果ウィジェットにも結果が反映されるようになります。

f:id:iyemon018:20190317155622p:plain

めでたしめでたし。