Azure DevOpsのPipelineのtaskでMSTestを動かす方法


結論

PipelineのtaskでVSTestは使わず、DotNetCoreCLIのtestを使うこと

Azure DevOpsのテストの設定にはまる

Azure DevOpsのPipelineでMSTestを動かしたいと思いました。以前ユニットテストをAzure DevOpsにのせた時は特に苦労した覚えもなかったので(以前試したのは.NET FrameworkでAzure DevOpsもyamlではなくGUIで設定していました)、今回も特に苦労することは無いだろうと思っていました。ところがいざPipelineで動かそうと思ったら設定にめちゃめちゃはまりました。結局結論で解決出来たのですが、それまでに結構時間を取られたのでその行程を書いておきます。

Pipelineで動かす具体例

プロジェクトを作って、以下のようなテストを作ります。

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            int a = 1;
            Assert.AreEqual(a, 1);
        }

        [TestMethod]
        public void TestMethod2()
        {
            int a = 2;
            Assert.AreEqual(a, 1);
        }
    }
}

ローカルでVisual Studioのテストエクスプローラーで動かせばTestMethod2は当然失敗します。

ところがこのプロジェクトをAzure DevOpesのPipelineのTaskにVSTestを作って動かした場合、このタスクは成功します!?

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

VSTestの設定を変えてみる

つまり、VSTestのデフォルトの設定ではテスト結果に連動して成功、失敗を返さない状態です。なんでデフォルトがこの状態になっているのか謎です。しょうがないので設定を変えてみました。先ずSelect tests usingという項目があって、Test assembliesになっていたので、Test runを選択してみました。runなら実行するだろうと。

これで無事タスクは失敗になりました。

ところがです。実はこれテストが成功の状態でも失敗になってしまいます。つまりただの設定ミスです。

エラーを調べてみる

##[error]Input validation failed with exception: Invalid on demand test run id 0. Has to be greater than 0.
##[error]Error: The process 'D:\a\_tasks\VSTest_ef087383-ee5e-42c7-9a53-ab56c98420f9\2.170.1\Modules\DTAExecutionHost.exe' 

エラーをググってみるとstackoverflowGitHubのissuesMSの公式ドキュメントなど色々情報は出ます。設定が悪い、バージョンが悪いパスが悪いVisual Studio Test Platform Installerを入れろなど。調べた感じ掲示板で質問だけ投げていて答えが返ってない例や、色々話したけれど結局解決していない例なども出るのでみんなはまっているけれど解決出来ていないのかな?と思います。これ以外にもVSTestの設定を色々変えて、何十回もトライ&エラーしましたが、結局テスト結果と連動してVSTestが動くように出来ませんでした。(むしろこの解決方法は誰か教えて下さい)

Azure DevOpesのtaskを変えてみる

で、MSTestをテスト結果と連動して動かす方法ですが、VSTestを使わないことで解決しました。具体的には.NET Coreのtaskでtestを選ぶ。これだけです。

- task: DotNetCoreCLI@2
  inputs:
    command: 'test'

これで、何の設定を加えなくてもちゃんと実際のテスト結果と連動して動く状態になりました。

成功した場合

失敗した場合

まとめ

MSTestを動かすのであれば、どう考えてもVSTest一択だと思っていたので、設定を色々変えて試した見ましたが、結局はVSTestを使わずDotNetCoreCLIのtestを使うという結論でした。Azure DevopsのデフォルトのyamlでもVSTestが設定されているので、VSTestのデフォルトの設定のままで普通にテスト結果と連動して動くようにして欲しいです。。