13

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

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

4

3 に答える 3

17

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
于 2013-08-20T05:13:16.753 に答える
4

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

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

于 2013-03-26T01:55:10.457 に答える
1

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

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

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

于 2013-02-20T09:36:59.843 に答える