web-dev-qa-db-ja.com

MSTestの代わりにVSTestを使用して単体テストケースを実行する

TFS2010サーバーにx64プラットフォームのC#ソリューション(VS2012)があります。このソリューションに単体テストプロジェクト(x64も)を添付し、ビルド定義を作成しました。ビルドをキューに入れると成功しますが、単体テストケースは実行されません。これは、MSTestが32ビットアプリケーションであるためです。そこで、デフォルトのビルドプロセステンプレート(DefaultTemplate.xaml)をカスタマイズして、MSTestではなくVSTest(VSTest.console.exe)を呼び出すことにしました。これは非常に複雑で、VSTestのツールボックスにビルドアクティビティを追加できません。

誰かがこの種のカスタマイズをしましたか? .runsettingsファイルの構成などの他のアプローチも検討しました。 .runsettingsファイルに追加できるVSTestアダプターインターフェイスはありますか?

12
Arkanoid

VSTestを介して単体テストを実行し、MSTestを介してテスト結果を公開すると、成功した結果が得られました。以下に、Powershellスクリプトを示します。

#  Get the UnitTest Binaries
$files = Get-ChildItem $TestAssembliesDir\*est*.dll

#  VSTest.console.exe path
$VSTestPath = 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe'

#  MSTest path
$MSTestpath = "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\mstest.exe"
#  Loop through the test assemblies and add them to the VSTestFiles

$VSTestFiles = ''  
foreach($file in $files)  
{   
    $VSTestFiles += "`"$file`"" 
    $VSTestFiles += " "
} 

#  Run the UnitTests using VSTest 
&$VSTestPath  $vstestplatform "/Framework:Framework45" "/InIsolation" $VSTestFiles "/logger:trx"

#  Get TRX files
$TrxFilesList = Get-ChildItem $TestResDir\*.trx
$TrxFiles = ''  
$loop = 1
foreach($file in $TrxFilesList)  
{   
    $TrxFiles = "$file" 
    # copy the trx file into a space-less named trx
    $newTrxFileName = "$BuildUri" + "_" + "$loop" + ".trx"

    copy-item $TrxFiles -destination $TestResDir\$newTrxFileName

    $loop = $loop + 1
    $newTrxFile += "$TestResDir\$newTrxFileName"
    $newTrxFile += " "
} 

#  specify MSTest arguments 
$mspubl = "/publish:"+$TeamProjColUri
$msteampr = "/teamproject:" + $TeamProj
$mspublbuild = "/publishbuild:" +$BuildUri
$mspubresfile = "/publishresultsfile:" +"`"$newTrxFile`""
#Publish test results through MSTest
&$MSTestpath  $mstestplatform $flavor $mspubl $msteampr $mspublbuild $mspubresfile
17
Arkanoid

私も、TFS2012へのアップグレードが開始されるのを待っている間に、VS2012/.NET 4.5 x64アプリケーションをコンパイルするTFS2010ビルドプロセスに、MSTest.exeの代わりにVSTest.Console.exeを使用する必要があります。

私が採用したアプローチは、ビルドスクリプトXAMLを編集し、単体テストの既存のワークフローを削除して、VSTest.Console.exeパラメーターをビルドし、InvokeProcessを介してVSTest.Console.exeを実行するカスタマイズされたワークフローに置き換えることでした。次に、Finallyブロックで、テスト結果に関係なく、ビルドサーバー上のVS2012インストールからMSTest.exeを使用してテスト結果とコードカバレッジをTFSに公開することを確認しました。

残念ながら、XAMLは文字の長さを超えているため、回答に投稿できませんが、DefaultTemplate.xamlで置き換えるスニペットとその置き換え対象で構成されるテキストファイルがあります。ファイルは見つかります ここ 。このアプローチは機能しますが、ハックであることに注意してください。

もう1つの方法は、64ビットバイナリをサポートするため、MSTestまたはVSTest.Consoleの代わりにNUnitを使用することです。この 記事 は、TFS2010ビルドスクリプトにNUnitを統合する方法を説明し、これを実現するために必要なツールとリソースへのリンクがあります。 NUnitの唯一の問題は、コードカバレッジ(さらに別のツールが必要であり、これらの結果をTFSに公開する方法を検討する必要があります)と、DeploymentItemなどの属性とTestContextなどのプロパティを使用したMSTestスタイルの統合テストです。 VSTest.Console.exeアプローチ。

そして、私が読んだことから、TFS2012はビルドスクリプトからVSTest.Console.exeに簡単に統合できるので、TFS2012にアップグレードする場合は、私が文書化したVSTest.Console.exeハックは必要ないかもしれません。

4
Kosta Tenedios

これはあなたの質問に直接答えるものではありませんが、役立つかもしれません。 TeamCityでも同様のことをしました。コマンドラインを使用してvstest.console.exeを呼び出し、.runsettingsファイルを作成しました。

私はこれを使用しました Microsoftテンプレート runsettingsファイルに。ただし、私のマシンでは、5行目のコメントに記載されているパスは、.slnではなく.runsettingsの場所を基準にしていることに注意してください。

Vstest.console.exeの/ logger:trxオプションを使用すると、MSTestと同じ形式で出力が生成されます(結果の視覚化に適しています)。

1
Wilbert