Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[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。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus