在上篇介紹完如何整合Xunit做測試之後,在這篇我們將會看看在.Net世界裡面另外一個常用的測試Framework,NUnit。
sample 程式在 github devops-psake sample/chapter11
同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-runTest-Nunit.html (部落格的格式會漂亮一些)
再詳細介紹如何整合Nunit之前,我們要先瞭解,Nunit和Xunit到底有和不同?
其實兩個的步奏基本一樣,只是參數不同(在Nunit 2.X系列 甚至連執行的參數也都一樣,只是參數一個用-來分割,一個用/而已,不過在這篇我們會使用Nunit 3.x) ,所以雖然這篇和上篇會很類似,但是為了完整性,這篇還是會完整介紹如何整併Nunit。
需要先建立一個Library專案,這個專案裡面要放一個Nunit的測試。
建立好一個Library專案之後,要安裝兩個Nuget Package
Install-Package nunit -Version 3.5.0
- 安裝nunit libraryInstall-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,我們會先在build專案安裝一個nunit的console runner,然後我們會在psake裡面取得那些需要跑test,並且最後執行nunit的測試。
在build專案安裝Nunit Console: Install-Package NUnit.Console
先定義好要執行NUnitTest執行的task
task NunitTest -depends Compile -description "執行Nunit測試" `
{
}
要執行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]$_ }
要執行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
}
上面都準備好了之後,我們就可以執行我們的build語法:
然後我們能夠看到產出的結果是nunit3的xml結構格式:
到目前為止,NUnit的部分也完成了。Nunit和Xunit不同,內建並不支援匯出html的結果。所以,之後我們會需要使用別的方式產生出人比較看得懂的結果,不過以目前來說,我們 會進入下一個常見的測試工具,MSTest。