(Azure DevOps)Azure Pipelines で.NET Framework + xUnit のユニットテストの実行と集計方法について
.NET Framework を使ってちょっとしたプログラムを作っていたのですが、ユニットテスト プロジェクトにxUnit を使った場合のAzure Pipelines のタスク設定方法がわからなかったので備忘録として残しておきます。
Azure Pipelines でのテスト タスクは.NET Core
のサンプルとかはよくブログに書いていることが多いんですが、.NET Framework
に関する内容はかなり少ないです。
ちなみに.NET Core
でのテストであればdotntet test
コマンドで実行できるので実はそれほど迷わないんですよね~。
動作環境
- 開発環境 : Visual Studio 2017 Community
- 言語 : C#
- .NET Framework : 4.7.1
- xUnit : 2.4.0
- その他:xunit.runner.console
予め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 とかに表示したいですよね?
じゃあ、どうやるの?といろいろ試した結果、以下の方法で実現できました。
上記はJenkins を使ったやり方ですが、Azure Pipelines にも応用できます。 具体的には以下の通り。
- タスクから
Command Line
を追加する。 Script
を貼り付ける。- 他はそのままでOK
- タスクから
Publish Test Results
を追加する。 Test result format
にxUnit
を選択し、Test results files
に2.で設定したテスト結果ファイルパスを入力する。- 他はそのままで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 のテスト結果ウィジェットにも結果が反映されるようになります。
めでたしめでたし。