2013-02-20 18 views
10

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

誰でもこのようなカスタマイズを行っていますか?私は.runsettingsファイルの設定のような他のアプローチも考慮しました。 .runsettingsファイルに追加できるVSTestアダプタインターフェイスがありますか?

答えて

15

VSTestを使用して単体テストを実行し、MSTestを使用してテスト結果を公開すると、私は成功しました。

# 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 
+0

特に、生成されたtrxファイルを見つけるための部分。ありがとうございました。 – paulroho

+0

なぜ '$ MSTestpath'が宣言され、使用されていないのですか? '$ TestResDir'はどこに宣言されていますか、それは何に設定されていますか? –

0

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

runsettingsファイルにはMicrosoft templateを使用しました。ただし、私のマシンでは、行5のコメントに記載されているパスは、.slnではなく、.runsettingsの位置に関連しています。

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

4

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

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

残念ながら、文字の長さを超えるため、XAMLを回答に投稿できません。ただし、DefaultTemplate.xamlで置き換えられるスニペットで構成されるテキストファイルがあり、それを置き換えるものがあります。ファイルはhereです。このアプローチは動作しますが、ハックです。

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

TFS2012は、ビルドスクリプトからVSTest.Console.exeへの簡単な統合を提供しています。したがって、TFS2012にアップグレードすると、私が文書化したVSTest.Console.exeハックは必要ない場合があります。

+0

私はあなたが特定のテストカテゴリに属する​​テストを無視するようにテスト実行を設定したい場合は特に、テストカテゴリを指定することに問題があることを発見した:下記のPowerShellスクリプトです。私はTestCaseFilterという名前のビルドXAMLに新しい引数を追加し、VSTest.Consoleを設定することでこれを克服しました。ビルド定義のTestCaseFilter引数が指定されている場合は、exeのTestCaseFilterパラメータ。 Miscのビルド定義では、TestCaseFilterを私の場合 "TestCategory!= IntegrationTest"で必要なものに設定することができます –

+0

ありがとうKosta :)私は単体テストのvstest実行部分を実行することができましたPowerShellスクリプトを使用してしかし、結果を公表する際にいくつかの問題に直面しています。病気はあなたの解決策を見てください。再度、感謝します! – Arkanoid

+0

こんにちは@Arkanoid、あなたがPowerShellスクリプトを投げ捨てる必要はありません。私が収集しているものは、私がXAMLで直したことと同じことをしているからです。 PowerShellスクリプトでVSTest.Console.exeを取得してTRXファイルを生成すると、そのTRXファイルをTFSに公開するためにMSTest.exeを呼び出すことができ、MSTest.exeへの呼び出しはVSTest.Console .exeは成功しました。 –

関連する問題