2013-02-20 158 views
10

我在TFS2010服務器上有一個x64平臺C#解決方案(VS2012)。我附加了一個單元測試項目(也是x64)到這個解決方案並創建了一個構建定義。當我排隊構建時,它會成功,但單元測試用例不會被執行。這是因爲MSTest是一個32位應用程序。所以,我決定自定義默認的構建過程模板(DefaultTemplate.xaml)來調用VSTest(VSTest.console.exe)而不是MSTest。這非常複雜,我無法將構建活動添加到VSTest的工具箱中。使用VSTest運行單元測試用例而不是MSTest

有沒有人做過這種定製?我也考慮過其他方法,比如配置.runsettings文件。我們是否有可以添加到.runsettings文件中的VSTest適配器接口?

回答

15

通過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 
+0

太好了。特別是查找生成的trx文件的部分。謝謝。 – paulroho 2014-07-02 09:05:40

+0

爲什麼'MSTestpath'聲明並從未使用過? '$ TestResDir'在哪裏聲明,它是什麼設置的? – 2016-04-08 07:32:58

0

這並不直接回答你的問題,但它可能有幫助。我爲TeamCity做了類似的事情。我使用命令行來調用vstest.console.exe並創建了一個.runsettings文件。

我用這個Microsoft template作爲runsettings文件。但請注意,在我的機器上,第5行註釋中提到的路徑與.runsettings位置相關,而不是.sln。

如果使用vstest.console.exe的/ logger:trx選項,它將以與MSTest相同的格式(適用於結果可視化)生成輸出。

4

我同樣需要使用VSTest.Console.exe而不是MSTest.exe來編譯VS2012/.NET 4.5 x64應用程序的TFS2010構建過程,同時等待升級到TFS2012開始。

我採取的方法是編輯構建腳本XAML,刪除單元測試的現有工作流程,並將其替換爲構建VSTest.Console.exe參數的自定義工作流程,然後通過以下方式執行VSTest.Console.exe: InvokeProcess。然後,我確保在Finally塊中,無論測試結果如何,我們都會使用構建服務器上的VS2012安裝中的MSTest.exe將測試結果和代碼覆蓋率發佈到TFS。

不幸的是,我不能在回答中發佈XAML,因爲它超過了字符長度,但是我確實有一個文本文件,其中包含要在DefaultTemplate.xaml中替換的代碼段以及用什麼代替它。該文件可以找到here。請注意,雖然這種方法起作用,但它是一種破解。

另一種方法是使用NUnit代替MSTest或VSTest.Console,因爲它支持64位二進制文​​件。這個article解釋瞭如何將NUnit集成到TFS2010構建腳本中,並鏈接到實現此目的所需的工具和資源。 NUnit的唯一問題是代碼覆蓋率(需要另外一個工具,並且計算出如何將這些結果發佈到TFS)以及使用諸如DeploymentItem和TestContext等屬性的屬性進行MSTest風格的集成測試,這就是爲什麼我選擇工作的原因VSTest.Console.exe方法。

從我讀過的內容可以看出,TFS2012提供了從構建腳本輕鬆集成到VSTest.Console.exe的功能,因此如果您曾經升級到TFS2012,那麼我記錄的VSTest.Console.exe可能不是必需的。

+0

我已經發現有與指定測試類別,尤其是當你想設置測試執行忽略屬於特定測試類別測試的問題。我通過向構建XAML添加一個名爲TestCaseFilter的新參數並設置VSTest.Console來克服這個問題。如果已經指定了構建定義的TestCaseFilter參數,則使用exe的TestCaseFilter參數。在Misc下的構建定義中,您可以將TestCaseFilter設置爲您需要的任何內容,在我的示例中爲「TestCategory!= IntegrationTest」 – 2013-03-26 04:36:32

+0

非常感謝Kosta :)我能夠爲單元測試執行vstest執行部分通過PowerShell腳本案例。但是我在發佈結果時遇到了一些問題。虐待通過你的解決方案。再次感謝! – Arkanoid 2013-03-29 04:52:04

+0

你好@Arkanoid,你可能不一定需要拋棄你的PowerShell腳本,因爲從我收集它將會做與我在XAML中完成的一樣的事情。只要在PowerShell腳本中獲得VSTest.Console.exe來生成TRX文件,您就可以調用MSTest.exe將該TRX文件發佈到TFS,並且無論是否使用VSTest.Console,都可以調用MSTest.exe。 .exe成功。 – 2013-03-30 05:09:16

相關問題