iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 5
0
DevOps

從.Net工程師的角度來看DevOps - 到底能夠幫助什麼 之 再戰江湖系列 第 5

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

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

sample 程式在 github devops-psake sample/chapter11

同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-runTest-Nunit.html (部落格的格式會漂亮一些)

Nunit和Xunit有和不同?

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

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

準備Nunit測試專案

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

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

Install-Package nunit -Version 3.5.0 - 安裝nunit library
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語法:

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

執行結果

結語

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


上一篇
[iThome第8屆鐵人賽 10]執行測試 1 - XUnit .Net
下一篇
[iThome第8屆鐵人賽 12]執行測試 3 - MSTest
系列文
從.Net工程師的角度來看DevOps - 到底能夠幫助什麼 之 再戰江湖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言