คุณเรียกใช้การทดสอบ NUnit จาก Jenkins ได้อย่างไร


108

ฉันต้องการเรียกใช้การทดสอบ NUnit อัตโนมัติสำหรับแอปพลิเคชัน C # ทุกคืนและในแต่ละครั้งที่ส่งไปยัง svn

นี่คือสิ่งที่ Jenkins-CI สามารถทำได้หรือไม่?
มีบทช่วยสอนออนไลน์หรือเอกสารวิธีการที่ใช้เอกสารการตั้งค่าที่คล้ายกันที่ฉันสามารถดูได้หรือไม่?


มีอะไรอีกที่คุณกำลังมองหา?
jglouie

1
ฉันกำลังมองหาเอกสารแนะนำหรือวิธีการที่มีการตั้งค่าที่คล้ายกัน
blueberryfields

1
คุณมี NUnit ที่รันการทดสอบตามที่คุณต้องการจาก commandline หรือไม่? ถ้าไม่ใช่นั่นคือขั้นตอนที่ 1
jglouie

คำตอบ:


120

ฉันต้องทำในสิ่งที่คุณทำนี่คือวิธีที่ฉันตั้งค่าให้เจนกินส์ทำสิ่งนี้:

  1. เพิ่ม NUnit Plugin ให้กับ Jenkins
  2. ในโปรเจ็กต์ของคุณไปที่Configure -> Build -> Add a build step
  3. ในเมนูแบบเลื่อนลงให้เลื่อนลงไปที่ -> ดำเนินการ Windows Batch Command
  4. ตรวจสอบให้แน่ใจว่าขั้นตอนนี้อยู่หลังขั้นตอน MSBuild ของคุณ
  5. เพิ่มสิ่งต่อไปนี้แทนที่ตัวแปร:

การทดสอบ dll เดี่ยว:

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

การทดสอบ dll หลายรายการโดยใช้โครงการทดสอบ NUnit :

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

  1. ภายใต้การโพสต์สร้างการกระทำเห็บเผยแพร่ NUnit รายงานผลการทดสอบ
  2. สำหรับXML ของรายงานการทดสอบกล่องข้อความให้ป้อนnunit-result.xml

เมื่อคุณสร้างโปรเจ็กต์แล้ว NUNit จะทำงานและผลลัพธ์จะสามารถดูได้ทั้งบนแดชบอร์ด (หากคุณวางเมาส์เหนือไอคอนรายงานสภาพอากาศ) หรือบนหน้าโปรเจ็กต์ภายใต้ผลการทดสอบล่าสุดผลการทดสอบล่าสุด

คุณยังสามารถเรียกใช้คำสั่งจากภายใน Visual Studio หรือเป็นส่วนหนึ่งของกระบวนการสร้างภายในเครื่องของคุณ

นี่คือสองบล็อกโพสต์ที่ฉันใช้อ้างอิง ฉันไม่พบสิ่งใดที่ตรงกับความต้องการของฉัน:
1-Hour Guide to Continuous Integration Setup: Jenkins ตรงตาม. Net (2011)
คำแนะนำในการสร้างโครงการ. NET โดยใช้ Hudson (2008)


ฉันไม่เห็นว่ามันเพียงพอแค่ไหน เป็นเรื่องปกติหรือไม่ที่จะมีการทดสอบ dll เพียงรายการเดียว เรามีจำนวนมากและมีการสร้างและลบบ่อยครั้ง ไม่ควรมีวิธีทำโดยไม่ต้องฮาร์ดโค้ดการทดสอบในเจนกินส์?
André C. Andersen

ชี้ขั้นตอนการสร้างไปที่การใช้ไฟล์. bat หรือ. cmd ภายใต้การควบคุมแหล่งที่มาซึ่งเริ่มต้นคำสั่ง NUnit ของคุณ ตอนนี้คุณสามารถแก้ไขการทดสอบที่จะเรียกใช้บ่อยเท่าที่คุณต้องการโดยไม่ต้องเปลี่ยน Jenkins คุณควรดู NUnit Test Projects ด้วยเพราะอาจช่วยคุณได้เช่นกัน กุญแจสำคัญคือการบอกเจนกินส์ว่าจะใช้ไฟล์ xml ใดสำหรับรายงานการทดสอบ
Ralph Willgoss

4
เพียงแค่ใช้ไฟล์ .nunit * คุณเป็นพารามิเตอร์แทนแฟ้ม DLL "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunitเช่น ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
JCH2k

3
คุณสามารถใช้ไฟล์ * .sln แทน DLL ได้ดูเอกสาร
Martin

2
อ่า ความเข้าใจผิดเชิงตรรกะของฉันคือปลั๊กอิน NUnit ได้สร้างประเภท "Build-Task" ใหม่ ลัทธิวูดูเวทย์มนตร์ของมันคือเหตุการณ์หลังสร้าง (และอีกหนึ่งใช้บรรทัดคำสั่งปกติเพื่อสร้าง. xml)
granadaCoder

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"

ทำงานได้ดี แต่ฉันมีสองประเด็น อันดับแรกคือไดเร็กทอรีต้นทาง ฉันต้องเปลี่ยนเส้นทางที่มา[string] $sourceDirectory = $(get-location)และสำหรับเส้นทางที่มีช่องว่างฉันต้องเปลี่ยนบัตรผ่านประกอบเป็น nUnit เป็น$cFiles = $cFiles + '"' + $file + '"' + " "
Choco Smith

หากเรามีการทดสอบซึ่งเรากำลังดำเนินการโดย Test Playlist เราสามารถเรียกใช้เพลย์ลิสต์ทดสอบนี้สำหรับเจนกินส์โดยใช้. dll ได้หรือไม่
Ishita Shah

15

สำหรับ Nunit 3 หรือสูงกว่าการทำฟาร์ม:

  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 จะแสดงเฉพาะไฟล์ผลการทดสอบในไดเรกทอรีพื้นที่ทำงานของ Jenkins ไม่ใช่ในโครงการของคุณ: TestR.xml

เราจำเป็นต้องสร้างผลการทดสอบในรูปแบบ nunit2 เนื่องจากตอนนี้ปลั๊กอิน Jenkins Nunit ไม่รู้จักรูปแบบผลลัพธ์ของ Nunit3 รูปแบบสตริงตัวเลือกยังแตกต่างกัน: --result=TestR.xml;format=nunit2 ไม่ /xml=nunit-result.xml


8

มันใช้งานได้ดีฉันเคยตั้งค่านี้มาก่อน

กำหนดค่า NUnit เพื่อส่งออกผลลัพธ์ไปยังไฟล์ XML และกำหนดค่าปลั๊กอิน NUnit Jenkinsเพื่อใช้ไฟล์ XML นี้ ผลลัพธ์จะพร้อมใช้งานบนแดชบอร์ด

ตอนนี้วิธีเรียกใช้ NUnit ขึ้นอยู่กับคุณ วิธีที่เราทำคือ: Jenkins job executes NAnt target executes NUnit test suite.

คุณสามารถกำหนดค่างานของ Jenkins ให้ทำงานบนคอมมิตและ / หรือกำหนดเวลาในช่วงเวลาหนึ่งได้


นี่เกือบจะเป็นสิ่งที่ฉันเลือก แต่ฉันไม่สามารถทำให้ปลั๊กอิน NUnit ทำงานจากไปป์ไลน์ / เวิร์กโฟลว์ได้ ฉันใช้ปลั๊กอิน XUnit แทนซึ่งใช้งานได้ดี
demoncodemonkey

4

วิธีแก้ปัญหาจาก Ralph Willgoss ใช้งานได้ดี แต่ฉันเปลี่ยน 2 อย่างเพื่อให้มันยอดเยี่ยม:

ก) ฉันใช้โครงการ NUnit แทนไฟล์ DLL โดยตรง ทำให้ง่ายต่อการเพิ่มแอสเซมบลีเพิ่มเติมหรือกำหนดค่าการทดสอบใน NUnit GUI

b) ฉันเพิ่มอีกหนึ่งบรรทัดในชุดงานเพื่อป้องกันการสร้างไม่ให้ล้มเหลวเมื่อการทดสอบล้มเหลว:

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

NUnit Plugin ที่กล่าวถึงทำเครื่องหมายการสร้างUNSTABLEโดยอัตโนมัติซึ่งเป็นสิ่งที่ฉันต้องการทุกครั้งที่การทดสอบล้มเหลว จะแสดงด้วยจุดสีเหลือง


3
เหตุใดคุณจึงไม่ต้องการให้บิวด์ล้มเหลวหากการทดสอบหน่วยล้มเหลว การทดสอบที่ล้มเหลวควรระบุว่าคุณไม่ต้องการดำเนินการปรับใช้หรือไม่
Kirk Woll

1
ฉันยังสร้างชุดราตรีของฉันด้วยเจนกินส์และฉันไม่ต้องการให้พวกเขาล้มเหลวหากรวบรวมเพื่อให้ฉันสามารถทดสอบทุกอย่างได้ สถานะ "ไม่เสถียร" ทำให้ฉันมีคำใบ้ว่าทุกอย่างไม่เป็นไปตามที่ควร ไม่เสถียร หากรุ่นรุ่นไม่เสถียรฉันจะไม่ปรับใช้
JCH2k

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/


สิ่งนี้ทำอะไรมากกว่าบรรทัดแรกเพียงอย่างเดียวหรือไม่? ฉันไม่คิดอย่างนั้น การสร้างจะล้มเหลวอย่างไรก็ตามหาก nunit-console.exe ส่งคืน! = 0 ซึ่งจะทำหากการทดสอบล้มเหลว
JCH2k

ฉันลืมบอกว่าฉันมีคำสั่งบางอย่างหลังจากเรียก nunit-console.exe ในงาน Jenkins ของฉัน Jenkins พิจารณาเพียงคำสั่งสุดท้าย ERRORLEVEL ดังนั้นจึงไม่ได้ผลสำหรับฉัน
Akira Yamamoto

สิ่งนี้ขัดขวางประโยชน์ของขั้นตอนการเผยแพร่หรือไม่ ฉันหวังว่าปลั๊กอินจะมีการสร้างเครื่องหมายง่ายๆเป็น "" ในการกำหนดค่าการทดสอบที่ล้มเหลว
Tommy Holman

1

Jenkins มีปลั๊กอินที่รองรับ การกำหนดค่าที่แน่นอนจะขึ้นอยู่กับการตั้งค่าโครงการของคุณเล็กน้อย มีปลั๊กอินเฉพาะสำหรับ nUnit, MSBuild, nAnt เป็นต้นเริ่มต้นด้วยการดูที่หน้าปลั๊กอิน แต่ไม่น่าจะยากที่จะเข้าใจ


1

นี่คือทางออกของฉันสำหรับการเรียกใช้OpenCoverด้วยvstestใน 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

dll การทดสอบแต่ละรายการดำเนินการในกระบวนการของตัวเองเนื่องจากเรามีปัญหาในการดำเนินการทดสอบ dll ทั้งหมดใน procress เดียว (probmels พร้อมการโหลดแอสเซมบลี)


0

สำหรับ. Net Core เพียงพอที่จะเพิ่มขั้นตอนการสร้าง "execute shell" ด้วยสคริปต์ต่อไปนี้:

#!bash -x

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

หลังจากนั้นให้เพิ่มการดำเนินการหลังการสร้าง "เผยแพร่รายงานผลการทดสอบ MSTest" เพื่อให้เห็นผลการทดสอบ

เส้นทางรายงานการทดสอบเริ่มต้นควรเป็น**/*.trxและจะเผยแพร่.trxไฟล์ที่สร้างขึ้นทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.