Bagaimana Anda menjalankan tes NUnit dari Jenkins?

108

Saya mencari untuk menjalankan tes NUnit otomatis untuk aplikasi C #, setiap malam dan setiap komit ke svn.

Apakah ini sesuatu yang bisa dilakukan Jenkins-CI?
Apakah ada tutorial online atau dokumen panduan yang mendokumentasikan pengaturan serupa yang dapat saya lihat?

blueberryfields
sumber
apakah ada hal lain yang kamu cari?
jglouie
1
Saya mencari tutorial atau dokumen cara dengan pengaturan serupa.
blueberryfields
1
Apakah Anda memiliki NUnit yang menjalankan pengujian seperti yang Anda inginkan dari baris perintah? Jika tidak, itulah langkah 1
jglouie

Jawaban:

120

Saya perlu melakukan apa yang Anda lakukan, berikut cara saya mengatur Jenkins untuk melakukan ini:

  1. Tambahkan Plugin NUnit ke Jenkins
  2. Dalam proyek Anda, buka Configure -> Build -> Add a build step
  3. Pada menu dropdown, gulir ke bawah ke -> Execute Windows Batch Command
  4. Pastikan langkah ini ditempatkan setelah langkah MSBuild Anda
  5. Tambahkan berikut ini, ganti variabel:

Tes dll tunggal:

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

Beberapa tes dll menggunakan proyek uji NUnit :

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

  1. Di bawah Post-build Actions , centang Publikasikan laporan hasil pengujian NUnit
  2. Untuk XML laporan pengujian kotak teks , masukkan nunit-result.xml

Setelah proyek Anda dibuat, NUNit sekarang akan berjalan dan hasilnya akan dapat dilihat di Dasbor (jika Anda mengarahkan kursor ke ikon Laporan cuaca) atau di halaman proyek di bawah Hasil Tes Terakhir .

Anda juga dapat menjalankan perintah dari dalam Visual Studio atau sebagai bagian dari proses pembuatan lokal Anda.

Berikut dua posting blog yang saya gunakan untuk referensi. Saya tidak menemukan apa pun yang benar-benar sesuai dengan persyaratan saya:
Panduan 1 Jam untuk Penyiapan Integrasi Berkelanjutan: Jenkins memenuhi .Net (2011)
Panduan untuk membangun proyek .NET menggunakan Hudson (2008)

Ralph Willgoss
sumber
Saya tidak begitu mengerti bagaimana ini sudah cukup. Apakah normal untuk hanya memiliki satu (atau beberapa) dll pengujian? Kami memiliki banyak konten, dan file tersebut sering dibuat dan dihapus. Bukankah seharusnya ada cara untuk melakukan ini tanpa harus melakukan hard code test ke jenkins?
André C. Andersen
Arahkan langkah build ke file use a .bat atau .cmd di bawah kontrol sumber, yang akan memulai perintah NUnit Anda. Sekarang, Anda dapat mengubah pengujian yang akan dijalankan sesering yang Anda inginkan tanpa mengubah Jenkins. Anda juga harus melihat Proyek Uji NUnit, karena itu mungkin membantu Anda juga. Kuncinya memberi tahu Jenkins file xml mana yang akan digunakan untuk laporan pengujian.
Ralph Willgoss
4
cukup gunakan file * .nunit Anda sebagai parameter alih-alih file DLL, mis "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit. Bekerja dengan sempurna untuk saya.
JCH2k
3
Anda dapat menggunakan file * .sln sebagai pengganti DLL, Lihat dokumentasi
Martin
2
Ahhh. Kesalahan logis saya adalah bahwa plugin NUnit membuat jenis "Build-Task" baru. Voodoo ajaibnya adalah acara Pasca-Pembangunan. (Dan seseorang hanya menggunakan baris perintah biasa untuk menghasilkan .xml)
granadaCoder
16

Jika Anda tidak ingin membuat hardcode proyek pengujian unit Anda, Anda lebih baik menulis skrip untuk mengambil semua dll proyek Unit Test Anda. Kami melakukannya dengan Powershell dan mengikuti konvensi khusus untuk penamaan Proyek Pengujian Unit kami. Berikut adalah konten file PowerShell yang menjalankan pengujian unit kami:

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

Skripnya cukup kuat sehingga kami digunakan kembali untuk semua pekerjaan build kami. Jika Anda tidak menyukai jalur lengkap ke konsol NUnit, Anda selalu dapat meletakkan lokasi itu di variabel lingkungan PATH Anda.

Kemudian kami meletakkan file RunUnitTests.ps1 di server build kami dan menggunakan perintah batch ini:

powershell.exe -file "{full-path-to-script-direcory}\RunUnitTests.ps1"
Daniel McQuiston
sumber
bekerja dengan baik tetapi saya memiliki dua masalah. pertama adalah direktori sumber. Saya harus mengubah direktori sumber ke [string] $sourceDirectory = $(get-location)dan untuk jalur dengan spasi saya harus mengubah izin perakitan ke nUnit ke$cFiles = $cFiles + '"' + $file + '"' + " "
Choco Smith
Jika kami memiliki Test, yang kami jalankan dengan Test Playlist. Bisakah kita menjalankan daftar putar tes untuk Jenkins, Dengan menggunakan .dll?
Ishita Shah
15

Untuk Nunit 3 atau lebih tinggi:

  1. Building Step (baris perintah 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. Langkah posting untuk penerbitan laporan Nunit, ini hanya menunjukkan file hasil tes di direktori ruang kerja Jenkins, bukan di proyek Anda: TestR.xml

Kita perlu membuat hasil tes dalam format nunit2 karena sekarang plugin Jenkins Nunit tidak mengenali format hasil Nunit3. Juga pilihan format string berbeda: --result=TestR.xml;format=nunit2 NOT /xml=nunit-result.xml

Winston33
sumber
8

Ini berfungsi dengan baik, saya telah mengatur ini sebelumnya.

Konfigurasi NUnit untuk mengeluarkan hasil ke file XML dan konfigurasikan Plugin NUnit Jenkins untuk menggunakan file XML ini. Hasilnya akan tersedia di dasbor.

Sekarang, cara Anda memanggil NUnit terserah Anda. Cara kami melakukannya adalah: tugas Jenkins mengeksekusi target NAnt menjalankan rangkaian pengujian NUnit.

Anda dapat mengonfigurasi tugas Jenkins untuk dijalankan pada commit dan / atau dijadwalkan pada waktu tertentu.

jglouie.dll
sumber
Ini hampir apa yang saya cari, tetapi saya tidak bisa mendapatkan plugin NUnit untuk bekerja dari pipeline / workflow. Saya menggunakan plugin XUnit sebagai gantinya yang berfungsi dengan baik.
demoncodemonkey
4

Solusi dari Ralph Willgoss berfungsi dengan baik, tetapi saya mengubah 2 hal untuk menjadikannya hebat:

a) Saya menggunakan proyek NUnit alih-alih file DLL secara langsung. Ini membuatnya lebih mudah untuk menambahkan lebih banyak rakitan atau mengonfigurasi pengujian di GUI NUnit.

b) Saya menambahkan satu baris lagi ke batch untuk mencegah build gagal saat pengujian gagal:

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

Plugin NUnit yang disebutkan menandai build UNSTABLE secara otomatis, yang persis seperti yang saya inginkan, setiap kali pengujian gagal. Itu terlihat dengan titik kuning.

JCH2k
sumber
3
Mengapa Anda tidak ingin build gagal jika pengujian unit gagal? Bukankah pengujian yang gagal menunjukkan bahwa Anda tidak ingin melanjutkan penerapan?
Kirk Woll
1
Saya juga membangun nightlies saya dengan jenkins dan saya tidak ingin mereka gagal jika dikompilasi sehingga saya dapat menguji yang lainnya. the "unstable" -status memberi saya petunjuk bahwa tidak semuanya berjalan seperti yang diharapkan. Tidak stabil. Jika rilis build tidak stabil, saya tidak akan menerapkannya.
JCH2k
2

Saya pikir lebih baik gagal membangun ketika tidak lulus sehingga Anda tidak menerapkannya. Lakukan sesuatu seperti ini:

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%

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

Akira Yamamoto
sumber
apakah ini melakukan sesuatu yang lebih dari baris pertama saja? saya rasa tidak. build gagal lagi jika nunit-console.exe kembali! = 0 yang dilakukannya jika pengujian gagal.
JCH2k
Saya lupa mengatakan bahwa saya memiliki beberapa perintah setelah memanggil nunit-console.exe dalam pekerjaan Jenkins saya. Jenkins hanya mempertimbangkan perintah terakhir ERRORLEVEL jadi tidak berfungsi untuk saya.
Akira Yamamoto
Apakah ini mencegah manfaat dari langkah publikasi? Saya berharap plugin memiliki tanda sederhana yang dibuat sebagai "" pada konfigurasi pengujian yang gagal.
Tommy Holman
1

Jenkins memang memiliki plugin yang akan mendukungnya. Konfigurasi yang tepat akan sedikit bergantung pada penyiapan proyek Anda. Ada plugin khusus untuk nUnit, MSBuild, nAnt dll. Mulailah dengan melihat halaman plugin, tetapi seharusnya tidak terlalu sulit untuk mengetahuinya.

Matt
sumber
1

Ini adalah solusi saya untuk menjalankan OpenCover dengan vstest di 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

Setiap dll pengujian dijalankan dalam proses sendiri karena kami memiliki masalah untuk menjalankan semua dll pengujian dalam satu proses (masalah dengan pembebanan perakitan).

MeJ
sumber
0

Untuk .Net Core, cukup menambahkan langkah build "eksekusi shell" dengan skrip berikut:

#!bash -x

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

Setelah itu tambahkan tindakan pasca-build "Publikasikan laporan hasil pengujian MSTest" untuk membuat hasil pengujian terlihat.

Jalur laporan pengujian default harus **/*.trxdan akan menerbitkan semua .trxfile yang dihasilkan .

stop-cran
sumber