在介紹完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的測試
這個時候設定都完成了,執行結匯得到結果:
並且可以看到執行結果:
結語
到目前為止,已經介紹完了三個常見的測試framework,不過會發現其實這3個方法有很多重複性的功能。作為工程師,第一大忌就是copy and paste
,所以為了將來更好維護, 我們將進入Refactor階段。
下篇將會介紹如何refactor我們的task。