Wie führen Sie NUnit-Tests von Jenkins aus?

108

Ich möchte jeden Abend und bei jedem Commit für svn automatisierte NUnit-Tests für eine C # -Anwendung ausführen.

Kann Jenkins-CI das?
Gibt es ein Online-Tutorial oder eine Anleitung, die ein ähnliches Setup dokumentiert, das ich mir ansehen kann?

Blaubeerfelder
quelle
Gibt es noch etwas, das Sie suchen?
Jglouie
1
Ich suche nach einem Tutorial oder einer Anleitung mit einem ähnlichen Setup.
blueberryfields
1
Lassen Sie NUnit die Tests über die Befehlszeile ausführen, wie Sie möchten? Wenn nicht, ist das Schritt 1
jglouie

Antworten:

120

Ich musste genau das tun, was Sie tun. So richte ich Jenkins ein:

  1. Fügen Sie das NUnit Plugin zu Jenkins hinzu
  2. Gehen Sie in Ihrem Projekt zu Konfigurieren -> Erstellen -> Build-Schritt hinzufügen
  3. Scrollen Sie in der Dropdown-Liste nach unten zu -> Windows- Stapelbefehl ausführen
  4. Stellen Sie sicher, dass dieser Schritt nach Ihrem MSBuild-Schritt platziert ist
  5. Fügen Sie Folgendes hinzu und ersetzen Sie die Variablen:

Einzelner DLL-Test:

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

Mehrfach-DLL-Test mit NUnit-Testprojekten :

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

  1. Unter Post-Build - Aktionen , tick Publish Ergebnis NUnit Testbericht
  2. Für die Textbox Prüfbericht XMLs , geben Sie nunit-result.xml

Sobald Ihr Projekt erstellt wurde, wird NUNit ausgeführt und die Ergebnisse können entweder im Dashboard (wenn Sie den Mauszeiger über das Wetterberichtsymbol bewegen) oder auf der Projektseite unter Letztes Testergebnis angezeigt werden .

Sie können den Befehl auch in Visual Studio oder als Teil Ihres lokalen Erstellungsprozesses ausführen.

Hier sind zwei Blog-Beiträge, die ich als Referenz verwendet habe. Ich habe keine gefunden, die genau meinen Anforderungen entsprach:
1-stündiger Leitfaden zur Einrichtung der kontinuierlichen Integration: Jenkins erfüllt .Net (2011)
Leitfaden zum Erstellen von .NET-Projekten mit Hudson (2008)

Ralph Willgoss
quelle
Ich sehe nicht wirklich, wie das genug ist. Ist es normal, nur eine (oder einige) Test-DLLs zu haben? Wir haben eine Menge von ihnen, und sie werden oft erstellt und entfernt. Sollte es nicht eine Möglichkeit geben, dies zu tun, ohne den Test hart in Jenkins codieren zu müssen?
André C. Andersen
Zeigen Sie mit dem Erstellungsschritt auf die Verwendung einer .bat- oder .cmd-Datei unter Quellcodeverwaltung, wodurch Ihr NUnit-Befehl gestartet wird. Jetzt können Sie die Tests ändern, die so oft ausgeführt werden, wie Sie möchten, ohne Jenkins zu ändern. Sie sollten sich auch NUnit-Testprojekte ansehen, da dies auch hilfreich sein kann. Der Schlüssel teilt Jenkins mit, welche XML-Datei für den Testbericht verwendet werden soll.
Ralph Willgoss
4
Verwenden Sie einfach Ihre * .nunit-Datei als Parameter anstelle der DLL-Datei, z "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit. Hat perfekt für mich funktioniert.
JCH2k
3
Sie können die * .sln-Datei anstelle der DLL verwenden. Siehe Dokumentation
Martin
2
Ähhh. Mein logischer Irrtum war, dass das NUnit-Plugin einen neuen "Build-Task" -Typ erstellt hat. Sein magischer Voodoo ist das Post-Build-Event. (Und man benutzt nur die reguläre Kommandozeile, um die .xml zu generieren)
granadaCoder
16

Wenn Sie Ihre Unit-Test-Projekte nicht fest codieren möchten, schreiben Sie besser ein Skript, um alle DLLs Ihrer Unit-Test-Projekte abzurufen. Wir machen das mit Powershell und befolgen eine spezielle Konvention für die Benennung unserer Unit-Testing-Projekte. Hier ist der Inhalt der Powershell-Datei, die unsere Unit-Tests ausführt:

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

Das Skript ist robust genug, dass wir es für alle Build-Jobs wiederverwenden. Wenn Ihnen der vollständige Pfad zur NUnit-Konsole nicht gefällt, können Sie diesen Speicherort jederzeit in Ihre Umgebungsvariable PATH einfügen.

Dann legen wir die Datei RunUnitTests.ps1 auf unserem Build-Server ab und verwenden diesen Batch-Befehl:

powershell.exe -file "{full-path-to-script-direcory}\RunUnitTests.ps1"
Daniel McQuiston
quelle
funktionierte gut, aber ich hatte zwei Probleme. Zuerst war das Quellverzeichnis. Ich musste ändern Quellverzeichnis zu [string] $sourceDirectory = $(get-location)und für Pfade mit Leerzeichen i der Anordnung nUnit passieren ändern musste$cFiles = $cFiles + '"' + $file + '"' + " "
Choco Smith
Wenn wir einen Test haben, den wir über die Test-Playlist ausführen. Können wir diese Test-Playlist für Jenkins mit .dll ausführen?
Ishita Shah
15

Für Nunit 3 oder höher:

  1. Erstellungsschritt (Windows-Befehlszeile) "c:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe" c:\AutomationTraining\CSharpSelenium\bin\Debug\test.dll --result=TestR.xml;format=nunit2

  2. Nach dem Schritt für die Veröffentlichung des Nunit-Berichts wird nur die Testergebnisdatei im Jenkins-Arbeitsbereichsverzeichnis angezeigt , nicht in Ihrem Projekt: TestR.xml

Wir müssen Testergebnisse im Nunit2-Format erstellen, da das Jenkins Nunit-Plugin das Nunit3-Ergebnisformat jetzt nicht erkennt. Auch das Format der --result=TestR.xml;format=nunit2 Optionszeichenfolge ist unterschiedlich: NICHT /xml=nunit-result.xml

Winston33
quelle
8

Das funktioniert gut, ich habe das schon einmal eingerichtet.

Konfigurieren Sie NUnit so, dass die Ergebnisse in eine XML-Datei ausgegeben werden, und konfigurieren Sie das NUnit Jenkins-Plugin so, dass diese XML-Datei verwendet wird. Die Ergebnisse werden im Dashboard verfügbar sein.

Nun liegt es an Ihnen, wie Sie NUnit aufrufen. So haben wir es gemacht: Jenkins Job führt NAnt-Ziel aus NUnit-Testsuite.

Sie können Jenkins-Jobs so konfigurieren, dass sie beim Festschreiben ausgeführt und / oder zu einem bestimmten Zeitpunkt geplant werden.

jglouie
quelle
Dies ist fast das, was ich wollte, aber ich konnte das NUnit-Plugin nicht über eine Pipeline / einen Workflow zum Laufen bringen. Ich habe stattdessen das XUnit-Plugin verwendet, das gut funktioniert hat.
Demoncodemonkey
4

Die Lösung von Ralph Willgoss funktioniert gut, aber ich habe zwei Dinge geändert, um sie großartig zu machen:

a) Ich habe ein NUnit-Projekt anstelle der DLL-Datei direkt verwendet. Dies erleichtert das Hinzufügen weiterer Assemblys oder das Konfigurieren des Tests in der NUnit-GUI.

b) Ich habe dem Stapel eine weitere Zeile hinzugefügt, um zu verhindern, dass der Build fehlschlägt, wenn ein Test fehlschlägt:

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

Das erwähnte NUnit Plugin markiert den Build automatisch als UNSTABLE , was genau das ist, was ich will, wenn ein Test fehlschlägt. Es zeigt mit einem gelben Punkt.

JCH2k
quelle
3
Warum würden Sie nicht wollen , dass die Build fehl , wenn die Unit - Test fehlschlägt? Sollte der fehlgeschlagene Test nicht anzeigen, dass Sie nicht mit einer Bereitstellung fortfahren möchten?
Kirk Woll
1
Ich baue meine Nightlies auch mit Jenkins und ich möchte nicht, dass sie versagen, wenn sie kompiliert werden, damit ich alles andere testen kann. Der "instabile" -Status gibt mir einen Hinweis, dass nicht alles wie angenommen läuft. Instabil. Wenn ein Release-Build instabil ist, werde ich ihn nicht bereitstellen.
JCH2k
2

Ich denke, es ist besser, den Build zu scheitern, wenn er nicht erfolgreich ist, damit Sie ihn nicht bereitstellen. Mach so etwas:

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%

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

Akira Yamamoto
quelle
Tut dies mehr als die erste Zeile allein? Ich glaube nicht. Der Build schlägt trotzdem fehl, wenn nunit-console.exe! = 0 zurückgibt, was der Fall ist, wenn ein Test fehlschlägt.
JCH2k
Ich habe vergessen zu sagen, dass ich einige Befehle hatte, nachdem ich nunit-console.exe in meinem Jenkins-Job aufgerufen hatte. Jenkins betrachtet nur den letzten Befehl ERRORLEVEL, also hat es bei mir nicht funktioniert.
Akira Yamamoto
Verhindert dies die Vorteile des Veröffentlichungsschritts? Ich wünschte, das Plugin hätte bei einer fehlgeschlagenen Testkonfiguration eine einfache Markierung als "" erstellt.
Tommy Holman
1

Jenkins hat Plugins, die das unterstützen. Die genaue Konfiguration hängt stark von Ihrem Projekt-Setup ab. Es gibt spezielle Plugins für nUnit, MSBuild, nAnt usw. Schauen Sie sich zunächst die Plugins-Seite an, aber es sollte nicht besonders schwierig sein, dies herauszufinden.

Matt
quelle
1

Dies ist meine Lösung zum Ausführen von OpenCover mit vstest in Jenkins:

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

Jede Test-DLL wird in einem eigenen Prozess ausgeführt, da wir Probleme hatten, alle Test-DLLs in einem einzigen Prozess auszuführen (Probleme beim Laden von Assemblys).

MeJ
quelle
0

Für .Net Core reicht es aus, den Build-Schritt "Shell ausführen" mit folgendem Skript hinzuzufügen:

#!bash -x

cd $my_project_dir
rm -rf TestResults   # Remove old test results.
dotnet test -l trx

Fügen Sie anschließend die Post-Build-Aktion "MSTest-Testergebnisbericht veröffentlichen" hinzu, um die Testergebnisse sichtbar zu machen.

Der Standardpfad für Testberichte sollte **/*.trxund wird alle erstellten .trxDateien veröffentlichen.

Stop-Cran
quelle