mstest.exe を手動で呼び出して msbuild/tfsbuild から手動でテストを実行していますが、エラー MSB3073 と ExitCode 1 で予期せず失敗します。
$(OutDir) フォルダー内の *UnitTests.DLL の接尾辞を持つすべての DLL を検索するこのターゲットがあります。次に実行されるコマンドライン ステートメントを作成します。
<Target Name="RunUnitTests">
<CreateItem Include="$(OutDir)\*.UnitTests.dll"
AdditionalMetadata="TestContainerPrefix=/testcontainer:">
<Output TaskParameter="Include"
ItemName="UnitTestAssemblies" />
</CreateItem>
<Exec Timeout="120000"
Command=""$(VS110COMNTOOLS)..\IDE\mstest.exe" @(UnitTestAssemblies->'%(TestContainerPrefix)"%(FullPath)"',' ') /testsettings:"$(OutDir)..\..\Sources\mysettings.testsettings"" >
<Output TaskParameter="ExitCode" PropertyName="ExitCode"/>
</Exec>
<Error Condition=" '$(ExitCode)' != '0' And '$(ExitCode)' != '2'" Text="An error [$(ExitCode)] occurred running unit tests." />
<OnError ExecuteTargets="MarkBuildStepAsFailed" />
</Target>
いくつかのグーグルがこれを示唆したため、上記の Timeout プロパティを追加しましたが、違いはありませんでした。
これは、以下のようにビルドログ ファイルで同一視されます (引用符が含まれています) (フォルダー名は変更しましたが、関連する場所にスペースを残しましたが、あまり長くは見えません)。
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\..\IDE\mstest.exe" /testcontainer:"C:\b\someprojectfolder\anotherfolder\Binaries\..\..\debug\some.unittests.dll" /testsettings:"C:\b\someprojectfolder\anotherfolder\Sources\..\..\mysettings.testsettings"
テスト結果フォルダーがディスク上に作成されるのを見ることができるので、テストはビルド プロセスの一部としてビルド サーバー上で実行されます (つまり、上記のターゲットを呼び出します)。すべての単体テストは期待どおりに合格します。ビルド ログにも MSTest.exe コンソール出力が表示されます (実行の開始、テストと結果のリスト、結果ファイルのリストなど)。
さらに、ビルド サービス アカウントとしてビルド サーバーに RDC を実行し、CMD を使用して上記のコマンドラインを手動で実行すると、動作します。(テスト結果 (*.trx) とフォルダーがあります)。
また、自分のローカル開発者マシンで CMD を使用して上記のコマンドラインを手動で呼び出すときにも機能します。テスト結果のファイルとフォルダーが作成されます。
参考までに、ローカル マシンで Visual Studio 2012 Ultimate を使用しており、ビルド サーバーにもインストールされています。
参考までに、アップグレード プロセス定義で TFS 2012 を使用しています。
引用符やアポストロフィの「解析」/エスケープに関係していると感じていますか、それともパスで ..\ を使用している可能性がありますか?
ビルド サーバーのイベント ログを確認しましたが、エラーや情報は表示されません。他に確認できるログはありますか? または、実際のエラーコードを「見る」ために定義できるプロパティはありますか?
注:<RunTest>
スタイルの msbuild/tfs ビルド構文を使用できることはわかっていますが、ビルド プロセスの都合のよいときにこれらのテストを手動でトリガーします。