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 格式 儲存在某個路徑
最後,我們的
NunitTest
task變成:# 取得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語法:
然後我們能夠看到產出的結果是nunit3的xml結構格式:
結語
到目前為止,NUnit的部分也完成了。Nunit和Xunit不同,內建並不支援匯出html的結果。所以,之後我們會需要使用別的方式產生出人比較看得懂的結果,不過以目前來說,我們 會進入下一個常見的測試工具,MSTest。