2016年12月25日 星期日

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


沒有留言 :

張貼留言