Jenkins에서 NUnit 테스트를 어떻게 실행합니까?


108

C # 애플리케이션에 대해 밤마다 그리고 svn에 대한 각 커밋에 대해 자동화 된 NUnit 테스트를 실행하려고합니다.

Jenkins-CI가 할 수있는 일입니까?
내가 볼 수있는 유사한 설정을 문서화하는 온라인 자습서 또는 방법 문서가 있습니까?


당신이 찾고있는 다른 것이 있습니까?
jglouie

1
비슷한 설정의 튜토리얼 또는 방법 문서를 찾고 있습니다.
blueberryfields

1
명령 줄에서 원하는대로 테스트를 실행하는 NUnit이 있습니까? 그렇지 않다면 1 단계입니다
jglouie 2012

답변:


120

나는 당신이하는 일을 정확히해야했습니다.이 작업을 수행하도록 Jenkins를 설정하는 방법은 다음과 같습니다.

  1. Jenkins에 NUnit 플러그인 추가
  2. 프로젝트에서 구성 -> 빌드 -> 빌드 단계 추가 로 이동 하십시오.
  3. 드롭 다운에서 아래로 스크롤하여-> Windows 배치 명령 실행
  4. 이 단계는 MSBuild 단계 뒤에 배치해야합니다.
  5. 다음을 추가하여 변수를 바꿉니다.

단일 dll 테스트 :

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

NUnit 테스트 프로젝트를 사용한 다중 dll 테스트 :

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

  1. 아래 빌드 후 작업 , 틱 NUnit과 테스트 결과 보고서를 게시
  2. Test report XMLs 텍스트 상자에 nunit-result.xml을 입력 합니다.

프로젝트가 빌드되면 NUNit이 실행되고 결과는 대시 보드 (날씨 보고서 아이콘 위에 마우스를 올려 놓은 경우) 또는 마지막 테스트 결과 아래의 프로젝트 페이지에서 볼 수 있습니다.

Visual Studio 내에서 또는 로컬 빌드 프로세스의 일부로 명령을 실행할 수도 있습니다.

참조 용으로 사용한 두 개의 블로그 게시물이 있습니다. 내 요구 사항에 정확히 맞는 것을 찾지 못했습니다.
1 시간 연속 통합 설정 가이드 : Jenkins, .Net 충족 (2011)
Hudson을 사용하여 .NET 프로젝트 구축 가이드 (2008)


이게 얼마나 충분한 지 잘 모르겠습니다. 테스트 dll이 하나 (또는 ​​몇 개) 만있는 것이 정상입니까? 우리는 그것들을 많이 가지고 있으며, 자주 생성되고 제거됩니다. 젠킨스에 테스트를 하드 코딩하지 않고도이 작업을 수행 할 수있는 방법이 없을까요?
앙드레 C. 앤더슨

빌드 단계에서 소스 제어하에 .bat 또는 .cmd 파일을 사용하도록 지정하면 NUnit 명령이 시작됩니다. 이제 Jenkins를 변경하지 않고 원하는만큼 자주 실행할 테스트를 수정할 수 있습니다. NUnit 테스트 프로젝트도 살펴보면 도움이 될 것입니다. 핵심은 Jenkins에게 테스트 보고서에 사용할 xml 파일을 알려주는 것입니다.
Ralph Willgoss 2012 년

4
DLL 파일 대신 * .nunit 파일을 매개 변수로 사용하십시오 (예 : "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit. 나를 위해 완벽하게 작동했습니다.
JCH2k

3
DLL 대신 * .sln 파일을 사용할 수 있습니다. 설명서
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"

잘 작동했지만 두 가지 문제가 있습니다. 첫 번째는 소스 디렉토리였습니다. 나는 변경했습니다 의 SourceDirectory[string] $sourceDirectory = $(get-location)내가 어셈블리에 NUNIT에 전달 변경했다 공백과 경로에 대한$cFiles = $cFiles + '"' + $file + '"' + " "
초코 스미스

테스트가 있으면 테스트 재생 목록에 의해 실행됩니다. .dll을 사용하여 Jenkins에 대해이 테스트 재생 목록을 실행할 수 있습니까?
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

이제 Jenkins Nunit 플러그인이 Nunit3 결과 형식을 인식하지 못하기 때문에 테스트 결과를 nunit2 형식으로 만들어야합니다. 또한 옵션 문자열 형식이 다릅니다. --result=TestR.xml;format=nunit2 NOT /xml=nunit-result.xml


8

이것은 잘 작동하며 이전에 이것을 설정했습니다.

결과를 XML 파일로 출력하도록 NUnit을 구성 하고이 XML 파일을 사용 하도록 NUnit Jenkins 플러그인 을 구성 합니다. 결과는 대시 보드에서 확인할 수 있습니다.

이제 NUnit을 호출하는 방법은 사용자에게 달려 있습니다. 우리가 한 방식은 : Jenkins 작업이 NAnt 대상을 실행하고 NUnit 테스트 스위트를 실행합니다.

Jenkins 작업이 커밋 및 / 또는 특정 시간에 실행되도록 구성 할 수 있습니다.


이것은 거의 내가 택한 것이지만 파이프 라인 / 워크 플로에서 NUnit 플러그인이 작동하도록 할 수 없습니다. 대신 XUnit 플러그인을 사용했습니다.
demoncodemonkey

4

Ralph Willgoss의 솔루션은 잘 작동하지만 훌륭하게 만들기 위해 두 가지를 변경했습니다.

a) DLL 파일 대신 NUnit 프로젝트를 직접 사용했습니다. 이렇게하면 NUnit GUI에서 더 쉽게 어셈블리를 추가하거나 테스트를 구성 할 수 있습니다.

b) 테스트가 실패 할 때 빌드가 실패하지 않도록 배치에 한 줄을 더 추가했습니다.

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

언급 된 NUnit 플러그인 은 테스트가 실패 할 때마다 정확히 내가 원하는 빌드를 UNSTABLE로 표시 합니다. 노란색 점으로 표시됩니다.


3
단위 테스트가 실패해도 빌드가 실패 하지 않는 이유는 무엇 입니까? 실패한 테스트가 배포를 진행하지 않으려는 것을 나타내야하지 않습니까?
Kirk Woll 2014 년

1
나는 또한 젠킨스와 함께 내 나이틀리를 만들고 그들이 컴파일하면 실패하지 않기를 바라므로 다른 모든 것을 테스트 할 수 있습니다. "불안정"상태는 모든 것이 예상대로 실행되지 않는다는 힌트를 제공합니다. 불안정한. 릴리스 빌드가 불안정하면 배포하지 않습니다.
JCH2k 2014 년

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

Jenkins 작업에서 nunit-console.exe를 호출 한 후 몇 가지 명령이 있다는 것을 잊었습니다. Jenkins는 마지막 명령 ERRORLEVEL을 고려하여 작동하지 않았습니다.
Akira Yamamoto

이것이 게시 단계의 이점을 방해합니까? 플러그인에 실패한 테스트 구성에서 ""로 간단한 마크 빌드가 있었으면합니다.
Tommy Holman

1

Jenkins에는이를 지원하는 플러그인이 있습니다. 정확한 구성은 프로젝트 설정에 따라 상당히 달라집니다. nUnit, MSBuild, nAnt 등을위한 특정 플러그인이 있습니다. 플러그인 페이지를 살펴 보는 것부터 시작하세요.하지만 알아 내기가 그렇게 어렵지는 않습니다.


1

이것은 Jenkins에서 vstestOpenCover 를 실행하기위한 솔루션입니다 .

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은 자체 프로세스에서 실행됩니다 (어셈블리로드 문제).


0

.Net Core의 경우 다음 스크립트를 사용하여 "셸 실행"빌드 단계를 추가하면됩니다.

#!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.