在介紹完Xunit和Nunit測試之後,這篇將要來看最後一個常見的測試Framework,Visual Studio內建的MSTest。
sample 程式在 github devops-psake sample/chapter12
同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-runTest-MsTest.html (部落格的格式會漂亮一些)
MSTest和其他幾個Test Framework最大的差異在於,MSTest的console程式不能額外安裝,而是和Visual Studio一起安裝,所以在取得console程式的地方是比較不同。
這篇為了完整性,也會把整個步奏記錄下來。
如果有照著一開始建立專案來做,還記得那個時候在建立Asp .net Mvc的時候有勾選建立測試的專案,因此我們不需要做任何事情就會有一個MSTest的測試專案在裡面了。
所以可以直接進入準備script的部分。
這個部分會準備task要執行所需要的東西。由於MSTest的console無法獨立下載,所以我們不需要在buildProject加入任何package。
先定義好MSTest執行的Task:
task MSTest -depends Compile -description "執行MSTest測試" `
{
}
要執行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]$_ }
要執行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
}
這個時候設定都完成了,執行結匯得到結果:
並且可以看到執行結果:
到目前為止,已經介紹完了三個常見的測試framework,不過會發現其實這3個方法有很多重複性的功能。作為工程師,第一大忌就是copy and paste,所以為了將來更好維護, 我們將進入Refactor階段。
下篇將會介紹如何refactor我們的task。