जेनकींस से एनयूनिट परीक्षण कैसे चलाते हैं?


108

मैं सी # आवेदन के लिए स्वचालित NUnit परीक्षण चलाने के लिए देख रहा हूँ, रात भर और svn के लिए प्रत्येक प्रतिबद्ध पर।

क्या यह कुछ ऐसा है जो जेनकिंस-सीआई कर सकते हैं?
क्या एक ऑनलाइन ट्यूटोरियल है या कैसे-कैसे दस्तावेज़ जो एक समान सेटअप का दस्तावेज है जिसे मैं देख सकता हूं?


वहाँ कुछ और आप के लिए देख रहे हैं?
०२ पर

1
मैं एक समान सेटअप के साथ एक ट्यूटोरियल या कैसे-दस्तावेज़ के लिए देख रहा हूँ।
ब्लूबेरी

1
क्या आपके पास NUnit परीक्षण चल रहा है जैसा कि आप कमांडलाइन से चाहते हैं? यदि नहीं, तो यह चरण 1 है
jglouie

जवाबों:


120

मुझे ठीक वही करने की ज़रूरत है जो आप करते हैं, यहाँ मैं यह करने के लिए जेनकिंस को कैसे सेट करूँ:

  1. Jenkins को NUnit Plugin जोड़ें
  2. अपने प्रोजेक्ट में कॉन्फ़िगर करें -> बिल्ड -> एक बिल्ड स्टेप जोड़ें
  3. ड्रॉपडाउन स्क्रॉल में नीचे -> विंडोज बैच कमांड निष्पादित करें
  4. सुनिश्चित करें कि यह कदम आपके MSBuild कदम के बाद रखा गया है
  5. चरों को प्रतिस्थापित करते हुए निम्नलिखित जोड़ें:

एकल dll परीक्षण:

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

NUnit परीक्षण परियोजनाओं का उपयोग कर कई dll परीक्षण :

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

  1. पोस्ट-बिल्ड एक्शन के तहत , प्रकाशित करें NUnit परीक्षा परिणाम रिपोर्ट पर टिक करें
  2. पाठ बॉक्स रिपोर्ट XML के लिए , nunit-result.xml दर्ज करें

एक बार जब आप प्रोजेक्ट बना लेते हैं, तो NUNit अब चलेगा और परिणाम डैशबोर्ड (यदि आप मौसम रिपोर्ट आइकन पर मंडराते हैं) या अंतिम टेस्ट रिजल्ट के तहत प्रोजेक्ट पेज पर देखने योग्य होंगे ।

आप दृश्य स्टूडियो के भीतर से या स्थानीय निर्माण प्रक्रिया के हिस्से के रूप में भी कमांड चला सकते हैं।

यहाँ दो ब्लॉग पोस्ट हैं जिनका मैंने संदर्भ के लिए उपयोग किया है। मुझे कोई ऐसी चीज़ नहीं मिली जो मेरी आवश्यकताओं को पूरी तरह से फिट करती हो:
1-घंटा गाइड टू कंटीन्यूअस इंटीग्रेशन सेटअप: जेनकिंस मिलते हैं।
हडसन (2008) का उपयोग करके .NET प्रोजेक्ट्स के निर्माण के लिए गाइड (2011) गाइड


मैं वास्तव में नहीं देखता कि यह पर्याप्त कैसे है। क्या केवल एक (या कुछ) टेस्ट डीएल के लिए सामान्य है? हमारे पास उनका भार है, और वे अक्सर निर्मित और हटाए जाते हैं। जेंकिंस में हार्ड कोड को टेस्ट किए बिना ऐसा करने का कोई तरीका नहीं होना चाहिए?
एंड्रे सी। एंडरसन

स्रोत नियंत्रण के तहत .bat या .cmd फ़ाइल के उपयोग के लिए बिल्ड चरण को इंगित करें, जो आपके NUnit कमांड को बंद करता है। अब, आप उन परीक्षणों को संशोधित कर सकते हैं जो जेनकींस को बदलने के बिना जितनी बार चाहें चले जाएंगे। आपको NUnit टेस्ट प्रोजेक्ट्स को भी देखना चाहिए, क्योंकि इससे आपको भी मदद मिल सकती है। कुंजी जेनकींस को बता रही है कि परीक्षण रिपोर्ट के लिए कौन सी xml फ़ाइल का उपयोग करना है।
राल्फ विलगॉस

4
बस अपने * .nunit फ़ाइल को DLL फ़ाइल के बजाय पैरामीटर के रूप में उपयोग करें, उदा "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunit। मेरे लिए पूरी तरह से काम किया।
JCH2k

3
आप DLL के बजाय * .sln फ़ाइल का उपयोग कर सकते हैं, प्रलेखन
मार्टिन

2
आह। मेरी तार्किक गिरावट यह थी कि NUnit प्लगइन ने एक नया "बिल्ड-टास्क" प्रकार बनाया। इसका जादू वूडू पोस्ट-बिल्ड इवेंट है। (और एक सिर्फ .xml उत्पन्न करने के लिए नियमित कमांड लाइन का उपयोग करता है)
ग्रेनाकोडर

16

यदि आप अपने यूनिट टेस्ट प्रोजेक्ट को हार्डकोड नहीं करना चाहते हैं, तो आप अपने यूनिट टेस्ट प्रोजेक्ट के सभी हड़पने के लिए स्क्रिप्ट लिखने से बेहतर हैं। हम इसे पॉवर्सशेल के साथ करते हैं और अपने यूनिट टेस्टिंग प्रोजेक्ट्स के नामकरण के लिए एक विशिष्ट सम्मेलन का पालन करते हैं। यहां पॉवरशेल फ़ाइल की सामग्री दी गई है जो हमारी इकाई परीक्षण चलाती है:

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 का उपयोग करके, जेनकिंस के लिए इस परीक्षण प्लेलिस्ट को निष्पादित कर सकते हैं?
इशिता शाह

15

नुनिट 3 या उससे ऊपर के फार्मवर्क के लिए:

  1. बिल्डिंग स्टेप (विंडोज कमांड लाइन) "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 कार्यस्थान निर्देशिका में केवल परीक्षण परिणाम फ़ाइल दिखाता है, आपकी परियोजना में नहीं: Test..ml

हमें nunit2 प्रारूप में परीक्षा परिणाम बनाने की आवश्यकता है क्योंकि अब जेनकिंस Nunit प्लगइन Nunit3 परिणाम प्रारूप को नहीं पहचानता है। इसके अलावा विकल्प स्ट्रिंग प्रारूप अलग है: --result=TestR.xml;format=nunit2 नहीं /xml=nunit-result.xml


8

यह अच्छी तरह से काम करता है, मैंने इसे पहले सेट किया है।

किसी XML फ़ाइल के परिणामों को आउटपुट करने के लिए NUnit कॉन्फ़िगर करें और इस XML फ़ाइल का उपभोग करने के लिए NUnit Jenkins प्लगइन को कॉन्फ़िगर करें । परिणाम डैशबोर्ड पर उपलब्ध होंगे।

अब, आप NUnit को कैसे आमंत्रित करते हैं, यह आप पर निर्भर है। जिस तरह से हमने ऐसा किया था: जेनकिंस नौकरी एनएएनटी लक्ष्य निष्पादित करता है एनयूनिट परीक्षण सूट निष्पादित करता है।

आप एक निश्चित समय पर कमिट और / या अनुसूचित पर चलने के लिए जेनकिंस नौकरियों को कॉन्फ़िगर कर सकते हैं।


यह लगभग वही है जो मैं गया था, लेकिन मुझे पाइपलाइन / वर्कफ़्लो से काम करने के लिए NUnit प्लगइन नहीं मिला। मैंने XUnit प्लगइन का उपयोग किया जिसके बजाय ठीक काम किया।
demoncodemonkey

4

राल्फ विलगॉस से समाधान अच्छा काम कर रहा है, लेकिन मैंने इसे महान बनाने के लिए 2 चीजें बदल दीं:

a) मैंने सीधे DLL फ़ाइल के बजाय NUnit प्रोजेक्ट का उपयोग किया। इससे NUnit GUI में अधिक असेंबली जोड़ना या परीक्षण कॉन्फ़िगर करना अधिक आसान हो जाता है।

ख) मैंने परीक्षण में असफल होने पर निर्माण को रोकने के लिए बैच में एक और पंक्ति जोड़ी:

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

NUnit प्लगइन के निशान का निर्माण उल्लेख अस्थिर स्वचालित रूप से, जो कि मैं वास्तव में क्या चाहते हैं, जब भी एक परीक्षण विफल रहता है। यह पीले बिंदु के साथ दिखाता है।


3
यदि इकाई परीक्षण विफल रहता है तो आप बिल्ड को विफल क्यों नहीं करना चाहेंगे ? क्या असफल परीक्षण से यह संकेत नहीं मिलना चाहिए कि आप किसी तैनाती के साथ आगे बढ़ना नहीं चाहते हैं?
कर्क वाल

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-use-nunit/


यह केवल पहली पंक्ति से अधिक कुछ नहीं करेगा? मुझे ऐसा नहीं लगता। बिल्ड किसी भी तरह से विफल हो जाता है यदि nunit-कंसोल.exe लौटाता है! = 0 जो यह करता है यदि परीक्षण विफल हो जाता है।
JCH2k

मैं यह कहना भूल गया कि मेरे जेनकिंस जॉब में nunit-कंसोल.exe को कॉल करने के बाद मेरे पास कुछ कमांड थे। जेनकिंस सिर्फ अंतिम आदेश ERRORLEVEL पर विचार करते हैं इसलिए यह मेरे लिए काम नहीं कर रहा था।
अकीरा यमामोटो

क्या यह प्रकाशित चरण के लाभों को रोकता है? मैं चाहता हूं कि प्लग में एक सरल मार्क बिल्ड था जो असफल परीक्षण कॉन्फ़िगरेशन पर "" था।
टॉमी होल्मन

1

जेनकिंस में प्लगइन्स होते हैं जो इसका समर्थन करेंगे। सटीक कॉन्फ़िगरेशन आपके प्रोजेक्ट सेटअप पर काफी निर्भर करने वाला है। NUnit, MSBuild, nAnt आदि के लिए विशिष्ट प्लगइन्स हैं। प्लगइन्स पृष्ठ को देखकर शुरू करें, लेकिन यह पता लगाना बहुत मुश्किल नहीं होना चाहिए।


1

जेनकिन्स में वेस्टेस्ट के साथ ओपनओवर चलाने के लिए यह मेरा समाधान है :

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 कोर के लिए यह निम्नलिखित स्क्रिप्ट के साथ "निष्पादित शेल" बिल्ड स्टेप को जोड़ने के लिए पर्याप्त है:

#!bash -x

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

उसके बाद "प्रकाशित MSTest परीक्षा परिणाम रिपोर्ट जोड़ें" परीक्षण के परिणाम को दृश्यमान बनाने के लिए पोस्ट-बिल्ड कार्रवाई करें।

डिफ़ॉल्ट परीक्षण रिपोर्ट पथ होना चाहिए **/*.trxऔर सभी उत्पादित .trxफ़ाइलों को प्रकाशित करेगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.