Alan Tsai 的學習筆記


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

[iThome第8屆鐵人賽 11]執行測試 2 - NUnit .Net

在上篇介紹完如何整合Xunit做測試之後,在這篇我們將會看看在.Net世界裡面另外一個常用的測試Framework,NUnit。

Nunit和Xunit有和不同?

再詳細介紹如何整合Nunit之前,我們要先了解,Nunit和Xunit到底有和不同?

其實兩個的步奏基本一樣,只是參數不同(在Nunit 2.X系列 甚至連執行的參數也都一樣,只是參數一個用-來分割,一個用/而已,不過在這篇我們會使用Nunit 3.x) ,所以雖然這篇和上篇會很類似,但是為了完整性,這篇還是會完整介紹如何整并Nunit。

準備Nunit測試專案

需要先建立一個Library專案,這個專案裡面要放一個Nunit的測試。

建立好一個Library專案之後,要安裝兩個Nuget Package

  1. Install-Package nunit -Version 3.5.0 - 安裝nunit library
  2. Install-Package Microsoft.AspNet.Mvc -Version 5.2.3 - 等一下要測試mvc的controller,所以要加入mvc的library

Library建立好之後,我們就建立一個ControllerTest,這次就測試About的部分:

[TestFixture]
public class HomeControllerTest
{
 [Test]
 public void About()
 {
  // Arrange
  HomeController controller = new HomeController();

  // Act
  ViewResult result = controller.About() as ViewResult;

  // Assert
  Assert.IsNotNull(result);
 }
}

專案準備好之後,就到了準備script的部分

準備build script - task 定義

接下來我們會調整我們的build script,我們會先在build專案安裝一個nunit的console runner,然後我們會在psake裡面取得那些需要跑test,並且最後執行nunit的測試。

1. 在build專案安裝Nunit Console

在build專案安裝Nunit Console: Install-Package NUnit.Console

2. 定義NUnintTest的task

先定義好要執行NUnitTest執行的task

task NunitTest -depends Compile -description "執行Nunit測試" `
{

}

3. 準備build script - 參數定義

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

取得執行Nunit的Console Runner位置 - $nunitExe
由於我們buildProject有加入nunit的 console runner,因此在package可以找到

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

要執行測試的路徑確認 - $nunitTestPath
這個邏輯是透過看看建制出來的專案有沒有 nunit 開頭的dll - 有就算是要被執行。這裡面取得的結果是DirectoryInfo,原因我們稍後提到。
$nunitExe = ((Get-ChildItem("$solutionDirectory\packages\NUnit.ConsoleRunner*")).FullName |
 Sort-Object $_ | select -Last 1) + "\tools\nunit3-console.exe"

$nunitTestResultDirectory = "$buildTestResultDirectory\Nunit
 
$nunitTestPath =  Get-ChildItem $buildTempDirectory -Recurse -Filter nunit*.dll | 
 Select -ExpandProperty DirectoryName -Unique | % { [io.directoryinfo]$_ }

4. 準備執行 nunit console runner

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

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

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

# 組執行的dll
$testDlls = $nunitTestPath | % {$_.FullName + "\" + $_.Name + ".dll" }

$testDllsJoin = [string]::Join(" ", $testDlls)

再來就是要確認執行console runne所會使用的參數:

$dll 路徑
這個就是上面組出來的參數
-result $路徑
執行結果要用 xml 格式 儲存在某個路徑

最後,我們的NunitTesttask變成:

# 取得nunit project的路徑
$nunitTestPath =  Get-ChildItem $buildTempDirectory -Recurse -Filter nunit*.dll | 
     Select -ExpandProperty DirectoryName -Unique | % { [io.directoryinfo]$_ }

if(Test-Path $nunitTestPath){
 Write-Host "建立Nunit測試結果的資料夾 $nunitTestResultDirectory"
 New-Item $nunitTestResultDirectory -ItemType Directory | Out-Null

 Write-Host "總共有 $($nunitTestPath.Count) 個專案"

 Write-Host ($nunitTestPath | Select $_.Name)

 Write-Host "準備執行Nunit測試"
}

# 組執行的dll
$testDlls = $nunitTestPath | % {$_.FullName + "\" + $_.Name + ".dll" }

$testDllsJoin = [string]::Join(" ", $testDlls)

Write-Host "執行的 Dll: $testDllsJoin"

exec{ & $nunitExe $testDllsJoin --result=$nunitTestResultDirectory\nUnit.xml}

最後在Test task 加上 NunitTest 相依性

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

執行Nunit測試

上面都準備好了之後,我們就可以執行我們的build語法:

image
執行Nunit的結果

然後我們能夠看到產出的結果是nunit3的xml結構格式:

image
執行結果

結語

到目前為止,NUnit的部分也完成了。Nunit和Xunit不同,內建並不支援匯出html的結果。所以,之後我們會需要使用別的方式產生出人比較看得懂的結果,不過以目前來說,我們 會進入下一個常見的測試工具,MSTest。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付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