2016年12月25日 星期日

[iThome第8屆鐵人賽 12]執行測試 3 - MSTest

在介紹完Xunit和Nunit測試之後,這篇將要來看最後一個常見的測試Framework,Visual Studio內建的MSTest。

MSTest 和其他測試有和不同?

MSTest和其他幾個Test Framework最大的差異在於,MSTest的console程式不能額外安裝,而是和Visual Studio一起安裝,所以在取得console程式的地方是比較不同。

這篇為了完整性,也會把整個步奏記錄下來。

準備測試專案

如果有照著一開始建立專案來做,還記得那個時候在建立Asp .net Mvc的時候有勾選建立測試的專案,因此我們不需要做任何事情就會有一個MSTest的測試專案在裡面了。

所以可以直接進入準備script的部分。

準備build script - task定義

這個部分會準備task要執行所需要的東西。由於MSTest的console無法獨立下載,所以我們不需要在buildProject加入任何package。

1. 定義Task

先定義好MSTest執行的Task:

task MSTest -depends Compile -description "執行MSTest測試" `
{
 
}

2. 準備build script - 參數定義

要執行build script之前,我們會需要幾個參數:

取得執行MSTest的Console Runner位置 - $msTestExe
這個會在visual studio安裝路徑找到

測試結果要儲存的位置 - $msTestResultDirectory
我們 會把不同測試Framework分開放,所以會建立一個專門放msTest

要執行測試的路徑確認 - $msTestPath
這個邏輯是透過看看建制出來的專案有沒有 MSTest 用到的dll - 有就算是要被執行。這裡面取得的結果是DirectoryInfo,原因我們稍後提到。
$msTestExe = ((Get-ChildItem("C:\Program Files (x86)\Microsoft Visual Studio*\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe")).FullName |
                    Sort-Object $_ | select -Last 1)

$msTestResultDirectory= "$buildTestResultDirectory\MSTest" 

$msTestPath =  Get-ChildItem $buildTempDirectory -Recurse -Filter Microsoft.VisualStudio.QualityTools.UnitTestFramework.resources.dll | 
  Select -ExpandProperty DirectoryName -Unique | 
  % { [io.directoryinfo]$_ } 

3. 準備執行 MSTest

要執行console runner有些參數是必要傳入進去的,其中一個重要的就是要執行測試的dll清單。

在上面參數定義我們已經找到了是ms test專案的project清單,我們就可以用這個清單來產生出要執行的dll測試路徑。

這裡面考慮到,如果有多個的話,每個用空格分開

# 組執行的dll
$testDlls = $msTestPath  | % {$_.FullName + "\" + $_.Name + ".dll" }
 
$testDllsJoin = [string]::Join(" ", $testDlls)

再來就是執行測試的部分

MS Test很可惜,沒有參數能夠把結果執行別的路徑,因此我們需要自己移動進去儲存結果的路徑然後執行

再來,MS Test預設會把測試結果放在 TestResults這個資料夾,因此我們會做一點處理,把測試內容移動上去

# MSTest 無法設定結果輸出位置,因此移動進去
Push-Location $msTestResultDirectory
exec {& $msTestExe $testDllsJoin /Logger:trx}
Pop-Location

$msTestDefaultResultPath = "$msTestResultDirectory\TestResults"
$msTestResult = "$msTestResultDirectory\MsTest.trx"

Write-Host "把測試結果移動到 $msTestResult"
Move-Item -Path $msTestDefaultResultPath\*.trx -Destination $msTestResult
Remove-Item $msTestDefaultResultPath

再來Test task加上 MSTest 作為相依的task

task Test -depends Compile, Clean, XunitTest, NunitTest, MSTest -description "執行Test" { 
 Write-Host $testMsg
}

執行MSTest的測試

這個時候設定都完成了,執行結匯得到結果:

image
測試結果

並且可以看到執行結果:

image
執行結果

結語

到目前為止,已經介紹完了三個常見的測試framework,不過會發現其實這3個方法有很多重複性的功能。作為工程師,第一大忌就是copy and paste,所以為了將來更好維護, 我們將進入Refactor階段。

下篇將會介紹如何refactor我們的task。


沒有留言 :

張貼留言