2012-07-04 12 views
10

जैसे परीक्षण परिणामों को प्रदर्शित करने के लिए मैं जेनकींस ईमेल-आउट टेम्पलेट कैसे लिख सकता हूं, मैंने तालिका में वर्तमान परीक्षण परिणामों को प्रदर्शित करने के लिए मानक जेली टेम्पलेट को tweaked किया है, हालांकि मैं वास्तव में diffs को प्रदर्शित करने में सक्षम होना चाहता हूं जेनकींस में अपने परीक्षण परिणाम पृष्ठ में देखा गया।मानक परीक्षण रिपोर्ट

उदाहरण के लिए:

JUnit Tests: 0 failures (±0) , 1 skipped (+1) 

Package    Duration Fail (diff) Skip (diff) Total (diff) 
foo.bar.baz    89 ms  0  0  1  +1  5  +2 

उत्तर

9

ईमेल Ext प्लगइन जेली टेम्पलेट के बजाय के लिए एक ग्रूवी टेम्प्लेट तैयार करें। ग्रोवी टेम्पलेट में आपके पास आपके निर्माण के लिए Build ऑब्जेक्ट तक पहुंच होगी। इसके बाद आप उस निर्माण के लिए AbstractTestResultAction प्राप्त करने के लिए getTestResultAction पर कॉल कर सकते हैं, जिसे आप अपनी आवश्यकतानुसार पूछ सकते हैं।

यहां Jenkins Main Module API का एक लिंक है। Ext ईमेल प्लगइन के लिए नमूना ग्रोवी टेम्पलेट $JENKINS_HOME/plugins/email-ext/WEB-INF/classes/hudson/plugins/emailext/templates/groovy-html.template में पाया जा सकता है। ग्रोवी टेम्पलेट/स्क्रिप्ट उपयोग पर अधिक जानकारी Email Ext plugin documentation में मिल सकती है।

+0

@ जोन, क्या यह उत्तर उपयोगी था? –

+0

मैंने build.testResultAction.failedTests का उपयोग करके असफल परीक्षणों को खींचने में कामयाब रहा है, लेकिन मुझे यकीन नहीं है कि सभी परीक्षणों का उपयोग कैसे करें –

+1

पैकेजरसल्ट का उपयोग करने की तरह लगता है GetTestResultAction - AggregatedTestResultAction और TestResultAction द्वारा लौटाए गए प्रकार पर निर्भर करता है अलग-अलग हैंडलिंग की आवश्यकता होती है। –

3

यदि आप आंतरिक एपीआई (इसे जानना मुश्किल है और यह हमेशा सीमा मौजूद है) के माध्यम से इसे कैसे पहुंचाया जाए, इस पर संघर्ष कर रहे हैं, तो ऐसा करने के लिए एक और अधिक लचीला तरीका है।

ग्रूवी टेम्पलेट के फ़ाइल टोकन का प्रयोग बजाय

  1. अपने परीक्षण डेटा Jenkins API के माध्यम से, अपने मामले के लिए, यह http://jenkins.server/job/yourjob/lastCompletedBuild/testReport/api/xml की तरह है कार्यक्षेत्र के तहत email.html की तरह अपने खुद के एचटीएमएल फ़ाइल का उपयोग और उत्पन्न करने के लिए स्क्रिप्ट का उपयोग
  2. ईमेल-ext विन्यास में Default Content रूप में, ईमेल भेजने के लिए फ़ाइल टोकन का उपयोग सीधे ${FILE, path="email.html"}

उपरोक्त चरण 1 में, आप अपने स्वयं के टेम्पलेट के लिए अधिक लचीला तरीका भी उपयोग कर सकते हैं, मैं पायथन स्क्रिप्ट और सरल स्ट्रिंग टेम्पलेट का उपयोग करता हूं।

यह मेरे लिए सही काम करता है।

+0

आप स्क्रिप्ट आपने चरण 1 के रूप में वर्णित साझा करने के लिए परवाह चाहेंगे? – callisto

+3

आप HTML स्वरूप का उपयोग करते हैं, तो आप '$ {स्क्रिप्ट, टेम्पलेट =" ग्रूवी-html.template "}' '$ {फ़ाइल}' के बजाय का उपयोग करना होगा। –

+0

क्या आप इस पर विस्तार से विवरण दे सकते हैं। मुझे लगता है कि मुझे इसी तरह की चीज करने की ज़रूरत है। मैं ईमेल में गिट से पूर्ण गिट प्रतिबद्ध संदेश प्रदर्शित करना चाहता था। लेकिन यह सिर्फ पहली पंक्ति प्रदर्शित करता है। मुझे लगता है कि मुझे कुछ लिपि लिखनी है .. – sharp

1

जेली डिफ़ॉल्ट स्थिर-analysys.jelly स्क्रिप्ट

<!-- JUnit TEMPLATE --> 
    <j:set var="junitResultList" value="${it.JUnitTestResult}" /> 
    <j:if test="${junitResultList.isEmpty()!=true}"> 
    <div class="content"> 
     <a href="${rooturl}${build.url}/testReport"> 
     <h1>JUnit Tests</h1> 
     </a> 
     <table class="border"> 
     <tr> 
      <th class="border">Package</th> 
      <th class="border">Failed</th> 
      <th class="border">Failed (diff)</th> 
      <th class="border">Passed</th> 
      <th class="border">Passed (diff)</th> 
      <th class="border">Skipped</th> 
      <th class="border">Skipped (diff)</th> 
      <th class="border">Total</th> 
      <th class="border">Total (diff)</th> 
     </tr> 
     <j:forEach var="junitResult" items="${it.JUnitTestResult}"> 
      <j:forEach var="packageResult" items="${junitResult.getChildren()}"> 
      <tr> 
       <td class="border"> 
       <tt>${packageResult.getName()}</tt> 
       </td> 
       <td class="border test_failed">${packageResult.getFailCount()}</td> 
       <td class="border test_failed">${packageResult.getFailCount()-packageResult.previousResult.getFailCount()}</td> 
       <td class="border test_passed">${packageResult.getPassCount()}</td> 
       <td class="border test_passed">${packageResult.getPassCount()-packageResult.previousResult.getPassCount()}</td> 
       <td class="border test_skipped">${packageResult.getSkipCount()}</td> 
       <td class="border test_skipped">${packageResult.getSkipCount()-packageResult.previousResult.getSkipCount()}</td> 
       <td class="border"> 
       <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} 
       </b> 
       </td> 
       <td class="border"> 
       <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()-packageResult.previousResult.getPassCount()-packageResult.previousResult.getFailCount()-packageResult.previousResult.getSkipCount()} 
       </b> 
       </td> 
      </tr> 
      <j:forEach var="failed_test" 
       items="${packageResult.getFailedTests()}"> 
       <tr> 
       <td class="test_failed" colspan="5"> 
        <tt>${failed_test.getFullName()}</tt> 
       </td> 
       </tr> 
      </j:forEach> 
      </j:forEach> 
     </j:forEach> 
     </table> 
     <br /> 
    </div> 
    </j:if> 
3

इस जवाब पर विस्तार करने के लिए के आधार पर में मेरे समाधान: ईमेल Ext प्लगइन जेली टेम्पलेट के बजाय के लिए एक ग्रूवी टेम्प्लेट तैयार करें। संपादन योग्य ईमेल अधिसूचना सामग्री में

  • "एचटीएमएल" या "दोनों HTML और सादा पाठ"
  • और करने के लिए सेट सामग्री प्रकार इस तरह ग्रूवी स्क्रिप्ट में शामिल हैं:

    $ {स्क्रिप्ट, टेम्पलेट = " test.groovy "}

  • ईमेल-टेम्पलेट्स घर में ग्रोवी स्क्रिप्ट डालें /var/lib/जेनकींस/ईमेल-टेम्पलेट्स। test.groovy नीचे देखें।

हर परीक्षण नीचे दिए गए उदाहरण में इन वस्तुओं में से प्रत्येक हो रही द्वारा दोहराया जाता है: '' 'junitResult.getChildren()' ''। अगर कोई केवल असफल परीक्षणों को पुन: स्थापित करना चाहता है तो junitResult.getFailedTests() का उपयोग किया जा सकता है। Hudson.tasks.junit देखें।TestResult एपीआई: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html यह भी देखना http://hudson-ci.org/javadoc/hudson/model/Build.html

Collection<ClassResult> getChildren() 
List<CaseResult> getFailedTests() 

उदाहरण/ईमेल- ext-प्लगइन से टेम्पलेट यहां देखा जा सकता: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template

यह उदाहरण सारांश परीक्षा परिणाम और प्रत्येक टेस्ट स्वीट और व्यक्ति के लिए परिणाम के लिए तालिका से पता चलता परीक्षा। test.groovy:

<html> 
<body> 
<% 

    import hudson.model.* 

    def build = Thread.currentThread().executable 
    def buildNumber = build.number 
    def buildNumHash = build.getDisplayName() 

    def testCount = "0" 
    def testPassed = "0" 
    def testFailed = "0" 
    def testSkipped = "0" 
    def buildDuration = "0" 
    if(build.testResultAction) { 
     def testResult = build.testResultAction 
     testCount = String.format("%d",(testResult.totalCount)) 
     testPassed = String.format("%d",(testResult.result.passCount)) 
     testFailed = String.format("%d",(testResult.result.failCount)) 
     testSkipped = String.format("%d",(testResult.result.skipCount)) 
     testDuration = String.format("%.2f",(testResult.result.duration)) 
    } 

    def workspace = build.getEnvVars()["WORKSPACE"] 
    def buildName = build.getEnvVars()["JOB_NAME"] 
    def BUILD_STATUS = build.getEnvVars()["BUILD_STATUS"] 
    def BUILD_URL = build.getEnvVars()["BUILD_URL"] 

    def testResult = hudson.tasks.junit.TestResult 

    def testResult2 = build.getAction(hudson.tasks.junit.TestResultAction.class) 

%> 

start test.groovy <br><br> 
<b>TEST RESULT:</b> $testCount total, <b>$testPassed pass</b>, <b>$testFailed fail</b>, $testSkipped skip.<br> 
Workspace : $workspace<br> 
Project Name : $buildName $buildNumHash<br><br> 

<!-- GENERAL INFO --> 

<TABLE> 
    <TR><TD align="right"> 
    <j:choose> 
     <j:when test="${build.result=='SUCCESS'}"> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/blue.gif" /> 
     </j:when> 
      <j:when test="${build.result=='FAILURE'}"> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/red.gif" /> 
     </j:when> 
     <j:otherwise> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/yellow.gif" /> 
     </j:otherwise> 
    </j:choose> 
    </TD><TD valign="center"><B style="font-size: 200%;">BUILD ${build.result}</B></TD></TR> 
    <TR><TD>Build URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR> 
    <TR><TD>Project:</TD><TD>${project.name}</TD></TR> 
    <TR><TD>Date of build:</TD><TD>${it.timestampString}</TD></TR> 
    <TR><TD>Build duration:</TD><TD>${build.durationString}</TD></TR> 
    <TR><TD>Test duration:</TD><TD>${testDuration}</TD></TR> 
</TABLE> 
<BR/> 

<!-- JUnit TEMPLATE hudson.tasks.junit.TestResult --> 

<% def junitResultList = it.JUnitTestResult 
try { 
def cucumberTestResultAction = it.getAction("org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultAction") 
junitResultList.add(cucumberTestResultAction.getResult()) 
} catch(e) { 
     //cucumberTestResultAction not exist in this build 
} 
// API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html 
%> 

<!-- JUnit TEMPLATE: all tests PASS FAIL SKIP > 
<% 
if (junitResultList.size() > 0) { %> 
<TABLE width="100%"> 
<TR><TD class="bg1" colspan="2"><B>${junitResultList.first().displayName}</B></TD></TR> 
<% junitResultList.each{ 
    junitResult -> %> 
    <% junitResult.getChildren().each { packageResult -> %> 
     <TR><TD class="bg2" colspan="2"> <B>TEST SUITE: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} test(s)</B>, Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(s)</TD></TR> 
     <% packageResult.getChildren().each{ suite -> 
       suite.getChildren().each{ test -> 
      def colour = "lightgreen" 
      def highlight1="" 
      def highlight2="" 
      RESULT = test.getStatus() // FAILED or PASSED or SKIPPED 
      if (RESULT == hudson.tasks.junit.CaseResult.Status.FAILED || RESULT == hudson.tasks.junit.CaseResult.Status.REGRESSION) { 
       colour = "#ffcccc" 
       highlight1="<B>" 
       highlight2="</B>" 
      } 
      if (RESULT == hudson.tasks.junit.CaseResult.Status.SKIPPED) { colour = "#ffffb3" } 
     %> 
      <TR bgcolor="${colour}"><TD class="test" colspan="2">${highlight1}<li>${RESULT}: ${test.getFullName()} </li>${highlight2}</TD></TR> 
     <% } } 
     } 
} %> 
</TABLE> 
<BR/> 
<% 
} %> 

end of test.groovy 

</body> 
</html> 

उदा। आउटपुट (टेक्स्ट केवल रंग नहीं/स्वरूपण)

start test.groovy 

TEST RESULT: 18 total, 18 pass, 0 fail, 0 skip. 
Workspace : /var/lib/jenkins/jobs/jobname-1/workspace 
Project Name : jobname-1 #20 

BUILD SUCCESS 

Build URL http://jenkinsurl:port/job/jobname-1/20/ 
Project: jobname-1 
Date of build: Mon, 23 Jan 2017 09:29:00 +0000 
Build duration: 10 min 
Test duration: 267.12 

Test Results 
TEST SUITE: suitename1 Failed: 0 test(s), Passed: 3 test(s), Skipped: 0 test(s), Total: 3 test(s) 
* PASSED: suitename1.testclass.testname1 
* PASSED: suitename1.testclass.testname2 
* PASSED: suitename1.testclass.testname3 
TEST SUITE: suitename2 Failed: 2 test(s), Passed: 1 test(s), Skipped: 0 test(s), Total: 3 test(s) 
* PASSED: suitename2.testclass.testname1 
* FAILED: suitename2.testclass.testname2 
* REGRESSION: suitename2.testclass.testname3 

end of test.groovy 
संबंधित मुद्दे