2012-02-02 183 views
97

我期待爲C#應用程序運行自動化NUnit測試,每晚和每次提交到svn。你如何從Jenkins運行NUnit測試?

這是Jenkins-CI可以做的事嗎?
是否有在線教程或操作方法記錄哪些文檔可以查看類似的設置?

+0

還有什麼你正在尋找? – jglouie 2012-02-06 18:06:15

+1

我正在尋找一個教程或如何使用類似的設置文件。 – blueberryfields 2012-02-15 17:52:31

+1

如果你想從命令行運行NUnit,你有NUnit嗎?如果不是,那就是第1步 – jglouie 2012-02-15 18:28:36

回答

109

我需要做的正是你做什麼,這是我的設置詹金斯如何做到這一點:

  1. 添加NUnit的插件詹金斯
  2. 在你的項目中去配置 - >構建 - >添加構建步驟
  3. 在下拉向下滾動到 - >執行的Windows批處理命令
  4. 確保這一步放在你的MSBuild步驟之後
  5. 添加以下,替換變量:

單個DLL測試:

[PathToNUnit] \ BIN \ NUnit的,console.exe [PathToTestDll] \ Selenium.Tests.dll /xml=nunit-result.xml

多個DLL測試全光照克NUnit test projects

[PathToNUnit] \ BIN \ NUnit的-console.exe [PathToTests] \ Selenium.Tests.nunit /xml=nunit-result.xml

  1. 郵-build操作,剔發佈NUnit的測試結果報告
  2. 對TextBox 測試報告個XML,進入個nunit結果。XML

一旦項目已經建成,NUnit現在運行,其結果將是在儀表盤查看或者(如果你將鼠標懸停在天氣報告圖標)或項目頁面下最後的測試結果

您也可以在Visual Studio中運行命令或作爲您本地構建過程的一部分。

這裏有兩篇博客文章供我參考。我沒有找到任何安裝我的要求正是:
1-Hour Guide to Continuous Integration Setup: Jenkins meets .Net(2011)
Guide to building .NET projects using Hudson(2008)

+0

我真的不知道這是否足夠。只有一個(或幾個)測試dll是否正常?我們有他們的負載,他們經常創建和刪除。難道沒有辦法做到這一點,而不必將測試硬編碼到詹金斯? – 2012-10-25 09:40:17

+0

將構建步驟指向在源代碼管理下使用.bat或.cmd文件,這會啓動您的NUnit命令。現在,您可以修改將按照您的需要頻繁運行的測試,而無需更改Jenkins。你也應該看看NUnit測試項目,因爲這也可以幫助你。關鍵是告訴Jenkins哪個XML文件用於測試報告。 – 2012-10-25 13:21:34

+4

只需使用* .nunit文件作爲參數而不是DLL文件,例如'「C:\ Program Files(x86)\ NUnit 2.6.3 \ bin \ nunit-console-x86.exe」UnitTests/UnitTests.nunit「。爲我完美工作。 – JCH2k 2014-01-08 15:04:01

1

詹金斯確實有插件,將支持。確切的配置將取決於您的項目設置。有針對nUnit,MSBuild,nAnt等的特定插件。首先查看插件頁面,但不應該非常難以弄清楚。

8

這很好,我已經設置過。

配置NUnit將結果輸出到XML文件並將NUnit Jenkins Plugin配置爲使用此XML文件。結果將在儀表板上提供。

現在,您如何調用NUnit取決於您。我們這樣做的方式是: Jenkins作業執行NAnt目標執行NUnit測試套件。

您可以將Jenkins作業配置爲在提交時運行和/或在特定時間進行調度。

+0

這幾乎就是我所做的,但是我無法從管道/工作流程中獲得NUnit插件。我使用了XUnit插件而不是工作正常。 – demoncodemonkey 2016-04-29 10:59:17

2

我覺得這是更好地構建失敗時,它沒有通過,所以你不部署它。做這樣的事情:

C:\YourNUnitDir\nunit-console.exe C:\YourOutDir\YourLib.dll /noshadow 
if defined ERRORLEVEL if %ERRORLEVEL% neq 0 goto fail_build 

:: any other command 

: fail_build 
endlocal 
exit %ERRORLEVEL% 

參考:http://www.greengingerwine.com/index.php/2013/01/tip-check-errorlevel-in-your-post-build-steps-when-using-nunit/

+0

這是否比單獨的第一行做什麼更多?我不這麼認爲。如果nunit-console.exe返回!= 0,那麼構建失敗,如果測試失敗它會執行。 – JCH2k 2014-01-14 16:29:55

+0

我忘了說在我的Jenkins工作中調用了nunit-console.exe後我有一些命令。詹金斯認爲只是最後一個命令ERRORLEVEL,所以它不適合我。 – 2014-01-16 12:45:47

+0

這是否會阻止發佈步驟的好處?我希望插件在失敗的測試配置上有一個簡單的標記構建爲「」。 – 2017-04-19 19:21:38

4

拉夫Willgoss該解決方案的工作很好,但我改變了兩兩件事,使之偉大:

一)我使用的NUnit的項目,而不是的DLL文件直接。這使得在NUnit GUI中添加更多組件或配置測試變得更加容易。

B)我增加了一個線批次,以防止構建從失敗測試失敗時:

[PathToNUnit]\bin\nunit-console.exe [PathToTestProject]\UnitTests.nunit /xml=nunit-result.xm 
exit 0 

NUnit的插件不穩定自動提到標記構建,這是我想要什麼,只要測試失敗。它顯示一個黃點。

+2

如果單元測試失敗,你爲什麼不* *想讓構建失敗?不應該失敗的測試表明你不想繼續部署? – 2014-03-24 22:49:25

+1

我也與詹金斯建立我的夜牀,我不希望他們失敗,如果他們編譯,所以我可以測試其他一切。 「不穩定的」狀態給了我一個暗示,並非所有事情都按照假設的方式運行。不穩定。如果發佈版本不穩定,我不會部署它。 – JCH2k 2014-03-25 08:46:28

16

如果你不想硬編碼你的單元測試項目,你最好寫一個腳本來抓住你所有的單元測試項目的DLL。我們使用Powershell來實現,並按照特定的慣例命名我們的單元測試項目。這裏是運行單元測試PowerShell的文件的內容:

param(
[string] $sourceDirectory = $env:WORKSPACE 
, $fileFilters = @("*.UnitTests.dll", "*_UnitTests.dll", "*UnitTests.dll") 
, [string]$filterText = "*\bin\Debug*" 
) 

#script that executes all unit tests available. 
$nUnitLog = Join-Path $sourceDirectory "UnitTestResults.txt" 
$nUnitErrorLog = Join-Path $sourceDirectory "UnitTestErrors.txt" 

Write-Host "Source: $sourceDirectory" 
Write-Host "NUnit Results: $nUnitLog" 
Write-Host "NUnit Error Log: $nUnitErrorLog" 
Write-Host "File Filters: $fileFilters" 
Write-Host "Filter Text: $filterText" 

$cFiles = "" 
$nUnitExecutable = "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" 

# look through all subdirectories of the source folder and get any unit test assemblies. To avoid duplicates, only use the assemblies in the Debug folder 
[array]$files = get-childitem $sourceDirectory -include $fileFilters -recurse | select -expand FullName | where {$_ -like $filterText} 

foreach ($file in $files) 
{ 
    $cFiles = $cFiles + $file + " " 
} 

# set all arguments and execute the unit console 
$argumentList = @("$cFiles", "/framework:net-4.5", "/xml=UnitTestResults.xml") 

$unitTestProcess = start-process -filepath $nUnitExecutable -argumentlist $argumentList -wait -nonewwindow -passthru -RedirectStandardOutput $nUnitLog -RedirectStandardError $nUnitErrorLog 

if ($unitTestProcess.ExitCode -ne 0) 
{ 
    "Unit Test Process Exit Code: " + $unitTestProcess.ExitCode 
    "See $nUnitLog for more information or $nUnitErrorLog for any possible errors." 
    "Errors from NUnit Log File ($nUnitLog):" 
    Get-Content $nUnitLog | Write-Host 
} 

$exitCode = $unitTestProcess.ExitCode 

exit $exitCode 

劇本是足夠強大,我們重用爲我們所有的建設工作。如果您不喜歡NUnit控制檯的完整路徑,那麼您可以始終將該位置置於PATH環境變量中。

然後我們把RunUnitTests.ps1文件我們構建服務器上,並使用此批處理命令:

powershell.exe -file "{full-path-to-script-direcory}\RunUnitTests.ps1" 
+0

運行良好,但我有兩個問題。首先是源目錄。我必須將_sourcedirectory_改成'[string] $ sourceDirectory = $(get-location)',對於帶有空格的路徑,我必須將彙編傳遞改爲nUnit到'$ cFiles = $ cFiles +'''+ $ file +' 「'+」「' – 2014-09-26 08:25:55

1

這是我在詹金斯運行OpenCovervstest解決方案:

param(
[string] $sourceDirectory = $env:WORKSPACE 
, $includedFiles = @("*Test.dll") 
, $excludedFiles = @("*.IGNORE.dll") 
, [string]$filterFolder = "*\bin\Debug*" 
) 

# Executables 
$openCoverExecutable = "C:\Users\tfsbuild\AppData\Local\Apps\OpenCover\OpenCover.Console.exe" 
$unitExecutable = "F:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" 

# Logs 
$openCoverReport = Join-Path $sourceDirectory "opencover.xml" 
$openCoverFilter = "+[*]* -[*Test]*" 

Write-Host "`r`n==== Configuration for executing tests ====" 
Write-Host "Source: `"$sourceDirectory`"" 
Write-Host "Included files: `"$includedFiles`"" 
Write-Host "Excluded files: `"$excludedFiles`"" 
Write-Host "Folder filter: `"$filterFolder`"" 
Write-Host "" 
Write-Host "OpenCover Report: `"$openCoverReport`"" 
Write-Host "OpenCover filter: `"$openCoverFilter`"" 

# look through all subdirectories of the source folder and get any unit test assemblies. To avoid duplicates, only use the assemblies in the Debug folder 
[array]$files = get-childitem $sourceDirectory -include $includedFiles -exclude $excludedFiles -recurse | select -expand FullName | where {$_ -like $filterFolder} | Resolve-Path -Relative 

$exitCode = 0 
$failedTestDlls = "" 

foreach ($file in $files) 
{ 
    Write-Host "`r`nCurrent test dll: $file" 

    # set all arguments and execute OpenCover 
    $argumentList = @("-target:`"$unitExecutable`"", "-targetargs:`"$file /UseVsixExtensions:false /Logger:trx`"", "-register:user -filter:`"$openCoverFilter`" -mergeoutput -mergebyhash -skipautoprops -returntargetcode -output:`"$openCoverReport`"") 

    $unitTestProcess = start-process -filepath $openCoverExecutable -argumentlist $argumentList -wait -nonewwindow -passthru -WorkingDirectory $sourceDirectory 

    if ($unitTestProcess.ExitCode -ne 0) 
    { 
     $failedTestDlls = $failedTestDlls + $file + "`r`n" 
     $exitCode = $unitTestProcess.ExitCode 
    } 
} 

if ($exitCode -ne 0) 
{ 
    Write-Host "`r`n==== Executing tests in following dlls failed ====" 
    Write-Host "$failedTestDlls" 
} 

exit $exitCode 

每個測試dll都在一個自己的進程中執行,因爲我們在單個進程中執行所有測試dll時遇到了麻煩(帶有程序集加載的probmels)。

7

對於NUnit的3或以上farmework:

  1. 建築步驟(Windows命令行) "c:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe" c:\AutomationTraining\CSharpSelenium\bin\Debug\test.dll --result=TestR.xml;format=nunit2

  2. 爲NUnit的報告發布發佈步驟中,它示出了在詹金斯工作空間目錄僅測試結果文件,不是在你的項目中: TestR.xml

我們需要以nunit2格式製作測試結果,因爲現在Jenkins Nunit插件不能識別Nunit3結果格式。 此外選項字符串格式是不同的: --result=TestR.xml;format=nunit2/xml=nunit-result.xml