Làm thế nào để bạn chạy các bài kiểm tra NUnit từ Jenkins?


108

Tôi đang tìm cách chạy các bài kiểm tra NUnit tự động cho một ứng dụng C #, hàng đêm và trên mỗi lần cam kết với svn.

Đây có phải là điều mà Jenkins-CI có thể làm?
Có tài liệu hướng dẫn trực tuyến hoặc cách lập tài liệu nào cho một thiết lập tương tự mà tôi có thể xem không?


có điều gì khác bạn đang tìm kiếm?
jglouie

1
Tôi đang tìm kiếm một tài liệu hướng dẫn hoặc hướng dẫn cách thiết lập tương tự.
blueberryfields

1
Bạn có NUnit chạy các bài kiểm tra như bạn muốn từ dòng lệnh không? Nếu không, đó là bước 1
jglouie

Câu trả lời:


120

Tôi cần phải làm chính xác những gì bạn làm, đây là cách tôi thiết lập Jenkins để làm điều này:

  1. Thêm Plugin NUnit vào Jenkins
  2. Trong dự án của bạn, đi tới Cấu hình -> Xây dựng -> Thêm bước xây dựng
  3. Trong menu thả xuống, hãy cuộn xuống -> Thực thi lệnh hàng loạt của Windows
  4. Đảm bảo bước này được đặt sau bước MSBuild của bạn
  5. Thêm phần sau, thay thế các biến:

Kiểm tra dll đơn:

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

Kiểm tra nhiều dll bằng cách sử dụng các dự án thử nghiệm NUnit :

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

  1. Trong Hành động sau khi tạo , đánh dấu vào Xuất bản báo cáo kết quả kiểm tra NUnit
  2. Đối với hộp văn bản XML báo cáo kiểm tra , hãy nhập nunit-result.xml

Sau khi dự án của bạn đã được xây dựng, NUNit bây giờ sẽ chạy và kết quả sẽ có thể xem được trên Trang tổng quan (nếu bạn di chuột qua biểu tượng Báo cáo thời tiết) hoặc trên trang dự án trong Kết quả kiểm tra lần cuối .

Bạn cũng có thể chạy lệnh từ bên trong Visual Studio hoặc như một phần của quy trình xây dựng cục bộ.

Đây là hai bài đăng trên blog tôi đã sử dụng để tham khảo. Tôi không tìm thấy bất kỳ thứ nào phù hợp với yêu cầu của mình một cách chính xác:
Hướng dẫn 1 giờ để thiết lập tích hợp liên tục: Jenkins đáp ứng .Net (2011)
Hướng dẫn xây dựng dự án .NET bằng Hudson (2008)


Tôi thực sự không thấy như thế nào là đủ. Có bình thường không khi chỉ có một (hoặc một vài) con thử nghiệm? Chúng tôi có một số lượng lớn chúng và chúng được tạo và xóa thường xuyên. Không có cách nào để làm điều này mà không cần phải viết mã thử nghiệm vào jenkins?
André C. Andersen

Trỏ bước xây dựng đến sử dụng tệp .bat hoặc .cmd dưới quyền kiểm soát nguồn, khởi động lệnh NUnit của bạn. Bây giờ, bạn có thể sửa đổi các bài kiểm tra sẽ được chạy thường xuyên như bạn muốn mà không cần thay đổi Jenkins. Bạn cũng nên xem các Dự án thử nghiệm NUnit, vì điều đó cũng có thể giúp ích cho bạn. Điều quan trọng là cho Jenkins biết tệp xml nào sẽ sử dụng cho báo cáo thử nghiệm.
Ralph Willgoss

4
chỉ sử dụng tệp * .nunit của bạn làm tham số thay vì tệp DLL, ví dụ "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit. Làm việc hoàn hảo cho tôi.
JCH2k

3
Bạn có thể sử dụng tệp * .sln thay vì DLL, Xem tài liệu
Martin

2
Ahhh. Sai lầm hợp lý của tôi là plugin NUnit đã tạo ra một loại "Build-Task" mới. Voodoo ma thuật của nó là sự kiện Hậu xây dựng. (Và người ta chỉ sử dụng dòng lệnh thông thường để tạo .xml)
granadaCoder

16

Nếu bạn không muốn mã hóa các dự án kiểm thử đơn vị của mình, tốt hơn hết bạn nên viết một tập lệnh để lấy tất cả dll dự án Kiểm thử đơn vị của mình. Chúng tôi làm điều đó với Powershell và tuân theo một quy ước cụ thể để đặt tên cho các Dự án kiểm tra đơn vị của chúng tôi. Đây là nội dung của tệp powershell chạy các bài kiểm tra đơn vị của chúng tôi:

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

Tập lệnh đủ mạnh để chúng tôi sử dụng lại cho tất cả các công việc xây dựng của mình. Nếu bạn không thích đường dẫn đầy đủ đến bảng điều khiển NUnit, bạn luôn có thể đặt vị trí đó trong biến môi trường PATH của mình.

Sau đó, chúng tôi đặt tệp RunUnitTests.ps1 trên máy chủ xây dựng của chúng tôi và sử dụng lệnh lô này:

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

hoạt động tốt nhưng tôi có hai vấn đề. đầu tiên là thư mục nguồn. Tôi đã phải thay đổi sourcedirectory đến [string] $sourceDirectory = $(get-location)và cho đường dẫn với không gian tôi đã phải thay đổi lắp ráp vượt qua nUnit đến$cFiles = $cFiles + '"' + $file + '"' + " "
Choco Smith

Nếu chúng tôi có Kiểm tra, mà chúng tôi đang thực hiện bằng Danh sách phát kiểm tra. Chúng tôi có thể thực hiện danh sách phát thử nghiệm này cho Jenkins, bằng cách sử dụng .dll không?
Ishita Shah

15

Đối với nông trại Nunit 3 trở lên:

  1. Bước xây dựng (dòng lệnh 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. Đăng bước để xuất bản báo cáo Nunit, nó chỉ hiển thị tệp kết quả kiểm tra trong thư mục không gian làm việc Jenkins, không có trong dự án của bạn: TestR.xml

Chúng ta cần đưa ra kết quả kiểm tra ở định dạng nunit2 vì hiện tại plugin Jenkins Nunit không nhận dạng được định dạng kết quả Nunit3. Ngoài ra, định dạng chuỗi tùy chọn cũng khác: --result=TestR.xml;format=nunit2 KHÔNG /xml=nunit-result.xml


8

Điều này hoạt động tốt, tôi đã thiết lập điều này trước đây.

Định cấu hình NUnit để xuất kết quả ra tệp XML và định cấu hình Plugin NUnit Jenkins để sử dụng tệp XML này. Kết quả sẽ có trên bảng điều khiển.

Bây giờ, cách bạn gọi NUnit là tùy thuộc vào bạn. Cách chúng tôi đã làm là: Công việc Jenkins thực hiện NAnt target thực thi bộ thử nghiệm NUnit.

Bạn có thể cấu hình các công việc Jenkins để chạy theo cam kết và / hoặc được lên lịch vào một thời điểm nhất định.


Đây gần như là những gì tôi đã cố gắng, nhưng tôi không thể làm cho plugin NUnit hoạt động từ một đường ống / quy trình làm việc. Tôi đã sử dụng plugin XUnit thay thế, nó hoạt động tốt.
Devilcodemonkey

4

Giải pháp từ Ralph Willgoss đang hoạt động tốt, nhưng tôi đã thay đổi 2 điều để làm cho nó trở nên tuyệt vời:

a) Tôi đã sử dụng một dự án NUnit thay vì trực tiếp tệp DLL. Điều này giúp dễ dàng thêm nhiều cụm hoặc cấu hình thử nghiệm trong NUnit GUI.

b) Tôi đã thêm một dòng nữa vào lô để ngăn việc xây dựng không thành công khi kiểm tra không thành công:

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

NUnit Plugin được đề cập sẽ tự động đánh dấu bản dựng KHÔNG THỂ BỀN VỮNG , đó chính là điều tôi muốn, bất cứ khi nào thử nghiệm không thành công. Nó hiển thị với một chấm màu vàng.


3
Tại sao bạn không muốn bản dựng bị lỗi nếu thử nghiệm đơn vị không thành công? Kiểm tra không thành công có phải cho thấy bạn không muốn tiếp tục triển khai không?
Kirk Woll

1
Tôi cũng xây dựng các đêm của mình bằng jenkins và tôi không muốn chúng thất bại nếu chúng biên dịch để tôi có thể kiểm tra mọi thứ khác. trạng thái "không ổn định" cho tôi một gợi ý rằng không phải mọi thứ đều chạy như mong đợi. Không ổn định. Nếu một bản phát hành không ổn định, tôi sẽ không triển khai nó.
JCH2k

2

Tôi nghĩ tốt hơn là bạn nên thất bại quá trình xây dựng khi nó không vượt qua để bạn không triển khai nó. Làm điều gì đó như sau:

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%

Tham khảo: http://www.greengederwine.com/index.php/2013/01/tip-check-errorlevel-in-your-post-build-steps-when-using-nunit/


Điều này có làm được gì nhiều hơn dòng đầu tiên không? tôi không nghĩ vậy. quá trình xây dựng không thành công nếu nunit-console.exe trả về! = 0 mà nó sẽ thực hiện nếu kiểm tra không thành công.
JCH2k

Tôi quên nói rằng tôi có một số lệnh sau khi gọi nunit-console.exe trong công việc Jenkins của tôi. Jenkins chỉ coi lệnh cuối cùng là ERRORLEVEL nên nó không hoạt động với tôi.
Akira Yamamoto

Điều này có ngăn cản lợi ích của bước xuất bản không? Tôi ước gì plugin có một bản dựng dấu đơn giản là "" trên cấu hình thử nghiệm không thành công.
Tommy Holman,

1

Jenkins có các plugin sẽ hỗ trợ điều đó. Cấu hình chính xác sẽ phụ thuộc khá nhiều vào thiết lập dự án của bạn. Có các plugin cụ thể cho nUnit, MSBuild, nAnt, v.v. Hãy bắt đầu bằng cách xem trang plugin, nhưng sẽ không quá khó để tìm ra.


1

Đây là giải pháp của tôi để chạy OpenCover với vstest trong 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

Mỗi dll thử nghiệm được thực thi trong một quy trình riêng vì chúng tôi gặp khó khăn khi thực thi tất cả các dll thử nghiệm trong một lần đo duy nhất (các đầu dò có tải lắp ráp).


0

Đối với .Net Core, chỉ cần thêm bước xây dựng "thực thi trình bao" với tập lệnh sau:

#!bash -x

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

Sau đó, hãy thêm hành động hậu xây dựng "Xuất bản báo cáo kết quả thử nghiệm MSTest" để hiển thị kết quả thử nghiệm.

Đường dẫn báo cáo thử nghiệm mặc định phải **/*.trxvà sẽ xuất bản tất cả .trxcác tệp được tạo .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.