wake-up-neo.com

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

Ich bin auf der Suche nach automatisierten NUnit-Tests für eine C # -Anwendung, die jede Nacht und bei jeder Übergabe an svn durchgeführt werden.

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

104
blueberryfields

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

  1. Fügen Sie das NUnit-Plugin zu Jenkins hinzu
  2. Gehen Sie in Ihrem Projekt zu Konfigurieren -> Erstellen -> Füge einen Build-Schritt hinzu
  3. Scrollen Sie in der Dropdown-Liste nach unten zu -> Windows Batch-Befehl 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

Mehrere DLL-Tests mit NUnit-Testprojekte :

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

  1. Aktivieren Sie unter Aktionen nach dem Erstellen das Kontrollkästchen NUnit-Testergebnisbericht veröffentlichen .
  2. Geben Sie für das Textfeld Testbericht-XMLs nunit-result.xml ein

Sobald Ihr Projekt erstellt wurde, wird NUNit jetzt ausgeführt und die Ergebnisse werden entweder im Dashboard (wenn Sie den Mauszeiger über das Wetterberichtssymbol halten) oder auf der Projektseite unter Letztes Testergebnis .

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

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

114
Ralph Willgoss

Wenn Sie Ihre Unit-Test-Projekte nicht hart codieren möchten, sollten Sie ein Skript schreiben, um alle Ihre Unit-Test-Projekt-DLLs abzurufen. Wir machen das mit Powershell und befolgen eine bestimmte Konvention zur Benennung unserer Unit Testing-Projekte. Hier ist der Inhalt der Powershell-Datei, in der unsere Komponententests ausgeführt werden:

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 unsere 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 aufnehmen.

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

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

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 von Nunit-Berichten 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 Optionszeichenfolge ist unterschiedlich: --result=TestR.xml;format=nunit2 NICHT /xml=nunit-result.xml

13
Winston33

Das funktioniert gut, das habe ich schon mal eingerichtet.

Konfigurieren Sie NUnit, um die Ergebnisse in eine XML-Datei auszugeben, und konfigurieren Sie NUnit Jenkins Plugin , um diese XML-Datei zu verwenden. Die Ergebnisse werden im Dashboard angezeigt.

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

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

8
jglouie

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 Datei DLL 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 UNSTABLE automatisch, was genau das ist, was ich will, wenn ein Test fehlschlägt. Es zeigt mit einem gelben Punkt.

4
JCH2k

Ich denke, es ist besser, den Build nicht zu bestehen, wenn er nicht bestanden wird, sodass 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/

2
Akira Yamamoto

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 mit dem Laden der Assembly).

1
MeJ

Jenkins hat Plugins, die das unterstützen. Die genaue Konfiguration hängt in hohem Maße von Ihrer Projekteinrichtung ab. Es gibt spezielle Plugins für nUnit, MSBuild, nAnt usw. Schauen Sie sich zunächst die Plugins-Seite an, aber es sollte nicht schwierig sein, dies herauszufinden.

1
Matt

Für .Net Core genügt es, 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 Postbuild-Aktion "MSTest-Testergebnisbericht veröffentlichen" hinzu, um die Testergebnisse sichtbar zu machen.

Der Standardpfad für Testberichte sollte **/*.trx Sein und veröffentlicht alle produzierten .trx - Dateien.

0
stop-cran