你如何运行Jenkins的NUnittesting?

我正在寻找运行自动化的NUnittesting的C#应用​​程序,每晚和每个提交到SVN。

Jenkins-CI能做些什么?
是否有在线教程或如何logging哪些文档可以查看类似的设置?

我需要做你正在做的,这是我如何设置jenkins做到这一点:

  1. 将NUnit插件添加到Jenkins
  2. 在你的项目中,进入configuration – > 生成 – > 添加 生成 步骤
  3. 在下拉菜单中向下滚动到 – > 执行Windows批处理命令
  4. 确保这一步放在你的MSBuild步骤之后
  5. 添加以下内容,replacevariables:

单一的dlltesting:

[PathToNUnit] \ bin \ nunit-console.exe [PathToTestDll] \ Selenium.Tests.dll /xml=nunit-result.xml

使用NUnittesting项目的多个dlltesting:

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

  1. 构build后操作下 ,勾选发布NUnittesting结果报告
  2. 对于文本框“ testing报告XML” ,inputnunit-result.xml

项目build成后,NUNit将立即运行,结果将在仪表盘(如果将鼠标hover在“天气报告”图标上)或“ 最后testing结果”下的项目页面上显示

您也可以在Visual Studio中运行该命令,或者作为本地构build过程的一部分运行。

这里有两篇博客post供我参考。 我没有发现有什么符合我的要求:
1小时持续集成指南设置:Jenkins符合.Net (2011)
使用Hudson构build.NET项目的指南 (2008)

如果你不想硬编码你的unit testing项目,你最好写一个脚本来抓住你所有的unit testing项目的DLL。 我们使用Powershell来实现,并按照特定的惯例命名我们的unit testing项目。 这里是运行我们的unit testing的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 

该脚本足够强大,我们正在重复使用所有的构build作业。 如果您不喜欢NUnit控制台的完整path,则可以将该位置置于PATH环境variables中。

然后我们把RunUnitTests.ps1文件放在我们的构build服务器上,并使用这个批处理命令:

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

这很好,我已经设置了。

configurationNUnit将结果输出到XML文件并configurationNUnit Jenkins插件来使用此XML文件。 结果将在仪表板上提供。

现在,你如何调用NUnit取决于你。 我们这样做的方式是:Jenkins作业执行NAnt目标执行NUnittesting套件。

您可以将Jenkins作业configuration为在提交时运行和/或在特定时间进行调度。

对于Nunit 3或以上远距离作业:

  1. 构build步骤(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报告发布的后续步骤,它只显示Jenkins工作区目录中的testing结果文件,而不是在您的项目中: TestR.xml

我们需要以nunit2格式来制作testing结果,因为现在Jenkins Nunit插件不能识别Nunit3的结果格式。 另外选项string格式不同: --result=TestR.xml;format=nunit2 NOT /xml=nunit-result.xml

来自Ralph Willgoss的解决scheme运行良好,但我改变了两件事情,使其成为伟大的:

a)我直接使用NUnit项目而不是DLL文件。 这使得在NUnit GUI中添加更多的程序集或configurationtesting变得更容易。

b)我在批处理中增加了一行,以防止在testing失败时构build失败:

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

上面提到的NUnit插件会自动标记为UNSTABLE ,这正是我想要的,只要testing失败。 它显示一个黄点。

我认为最好是在不通过构build的时候失败,所以你不要部署它。 做这样的事情:

 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-ununit/

jenkins确实有插件,将支持。 确切的configuration将取决于你的项目设置。 有特定的插件nUnit,MSBuild,nAnt等开始看看插件页面,但它不应该是非常困难的弄清楚。

这是我在Jenkins用vstest运行OpenCover的解决scheme:

 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 

每个testingdll都在一个自己的进程中执行,因为我们有麻烦在一个进程中执行所有的testingdll(带有程序集加载的问题)。