C # 애플리케이션에 대해 밤마다 그리고 svn에 대한 각 커밋에 대해 자동화 된 NUnit 테스트를 실행하려고합니다.
Jenkins-CI가 할 수있는 일입니까?
내가 볼 수있는 유사한 설정을 문서화하는 온라인 자습서 또는 방법 문서가 있습니까?
C # 애플리케이션에 대해 밤마다 그리고 svn에 대한 각 커밋에 대해 자동화 된 NUnit 테스트를 실행하려고합니다.
Jenkins-CI가 할 수있는 일입니까?
내가 볼 수있는 유사한 설정을 문서화하는 온라인 자습서 또는 방법 문서가 있습니까?
답변:
나는 당신이하는 일을 정확히해야했습니다.이 작업을 수행하도록 Jenkins를 설정하는 방법은 다음과 같습니다.
단일 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
프로젝트가 빌드되면 NUNit이 실행되고 결과는 대시 보드 (날씨 보고서 아이콘 위에 마우스를 올려 놓은 경우) 또는 마지막 테스트 결과 아래의 프로젝트 페이지에서 볼 수 있습니다.
Visual Studio 내에서 또는 로컬 빌드 프로세스의 일부로 명령을 실행할 수도 있습니다.
참조 용으로 사용한 두 개의 블로그 게시물이 있습니다. 내 요구 사항에 정확히 맞는 것을 찾지 못했습니다.
1 시간 연속 통합 설정 가이드 : Jenkins, .Net 충족 (2011)
Hudson을 사용하여 .NET 프로젝트 구축 가이드 (2008)
"C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit
. 나를 위해 완벽하게 작동했습니다.
단위 테스트 프로젝트를 하드 코딩하지 않으려면 모든 단위 테스트 프로젝트 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 + '"' + " "
Nunit 3 이상 농가의 경우 :
빌드 단계 (Windows 명령 줄)
"c:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe" c:\AutomationTraining\CSharpSelenium\bin\Debug\test.dll --result=TestR.xml;format=nunit2
Nunit 보고서 게시를위한 사후 단계, 프로젝트가 아닌 Jenkins 작업 영역 디렉터리에 테스트 결과 파일 만 표시됩니다. TestR.xml
이제 Jenkins Nunit 플러그인이 Nunit3 결과 형식을 인식하지 못하기 때문에 테스트 결과를 nunit2 형식으로 만들어야합니다. 또한 옵션 문자열 형식이 다릅니다.
--result=TestR.xml;format=nunit2
NOT
/xml=nunit-result.xml
이것은 잘 작동하며 이전에 이것을 설정했습니다.
결과를 XML 파일로 출력하도록 NUnit을 구성 하고이 XML 파일을 사용 하도록 NUnit Jenkins 플러그인 을 구성 합니다. 결과는 대시 보드에서 확인할 수 있습니다.
이제 NUnit을 호출하는 방법은 사용자에게 달려 있습니다. 우리가 한 방식은 : Jenkins 작업이 NAnt 대상을 실행하고 NUnit 테스트 스위트를 실행합니다.
Jenkins 작업이 커밋 및 / 또는 특정 시간에 실행되도록 구성 할 수 있습니다.
Ralph Willgoss의 솔루션은 잘 작동하지만 훌륭하게 만들기 위해 두 가지를 변경했습니다.
a) DLL 파일 대신 NUnit 프로젝트를 직접 사용했습니다. 이렇게하면 NUnit GUI에서 더 쉽게 어셈블리를 추가하거나 테스트를 구성 할 수 있습니다.
b) 테스트가 실패 할 때 빌드가 실패하지 않도록 배치에 한 줄을 더 추가했습니다.
[PathToNUnit]\bin\nunit-console.exe [PathToTestProject]\UnitTests.nunit /xml=nunit-result.xm
exit 0
언급 된 NUnit 플러그인 은 테스트가 실패 할 때마다 정확히 내가 원하는 빌드를 UNSTABLE로 표시 합니다. 노란색 점으로 표시됩니다.
통과하지 못했을 때 빌드를 실패하여 배포하지 않는 것이 좋습니다. 다음과 같이하십시오.
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%
이것은 Jenkins에서 vstest 로 OpenCover 를 실행하기위한 솔루션입니다 .
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은 자체 프로세스에서 실행됩니다 (어셈블리로드 문제).