2016-02-26 36 views
0

我有測試自動化框架,測試運行是通過Jenkins驅動的。測試運行完成後,它會生成一些自定義測試報告,如html文件。在報告中,我有一個錯誤總數爲其中一列的表格。我基本上要解析這個HTML文件,發送電子郵件到郵件列表,如果誤差大於0Jenkins:基於腳本輸出發送電子郵件

這裏是我做了什麼到現在,在我的工作詹金斯:

一個。配置作業以運行測試[這是在執行shell選項並運行我的jar,因爲測試框架是一個java應用程序]
b。我有一個後期構建操作,其中我執行一個python代碼,它執行以下操作:

第1步。獲取最新的html報告。
第2步。解析這個文件。
第3步。如果錯誤是> 0:
然後email_flag =真
否則:
email_flag =假。

現在有一種方法可以使用上述標誌並通過Jenkins插件發送電子郵件通知?我只是想了解最好的方法來做到這一點。任何幫助表示讚賞。

P.S.我做了一些額外的研究,我看到Email-ext插件[https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin]有一個預發送腳本選項,但我不知道如何使用它來運行python代碼並處理電子郵件消息。

回答

0

在構建操作期間 - 即在執行測試期間,當您知道測試在java中失敗時,立即或執行所有測試後,可以讓java向shell返回一個值。

System.exit(0) - 成功

System.exit(1) - 失敗

只要不爲0,因爲默認情況下無法詹金斯作業標記。

可以使用Email-ext插件,通過選擇適當的觸發發送電子郵件,只有當作業失敗 - Failure - Any

enter image description here

0

下面是我的擴展電子郵件發佈詹金斯插件預發送Groovy腳本。希望您能夠根據您的需求進行調整。

它是專爲解析Serenity-JUnit XML文件而設計的,但很少費力地解析HTML。它將查找給定sourceDirPath中與"SERENITY-JUNIT-*xml"匹配的任何文件。然後它會file.readToString(),從該xmlString中提取測試結果並將這些結果彙總到變量tests, passed, failures, errors, skipped。最後它會編寫一個msgSubject並將其附加到msg本身。

請注意,build,loggermsg是插件提供的對象。你不應該改變分配和/或改變他們的名字。

腳本:

import static groovy.io.FileType.FILES 
import javax.xml.parsers.DocumentBuilderFactory 
import javax.xml.parsers.DocumentBuilder 
import org.w3c.dom.Document 
import org.w3c.dom.NodeList 
import org.w3c.dom.Node 
import org.w3c.dom.Element 
import org.xml.sax.InputSource 
import java.io.StringReader 

logger.println "------------------------------------------------------------------------------------------------" 
logger.println "Parsing SERENITY-JUNIT XML files for results to update Editable Email Notification." 

// determine if build is remote, list folder and files 
def sourceDirPath 

if(build.workspace.isRemote()){ 
    channel = build.workspace.channel 
    logger.println "Using channel: " + channel 
    sourceDirPath = new FilePath(channel, build.workspace.toString() + "\\target\\site\\serenity\\") 
} else { 
    sourceDirPath = new FilePath(new File(build.workspace.toString() + "\\target\\site\\serenity\\")) 
} 
logger.println "Source dir: " + sourceDirPath 

def files = sourceDirPath.list("SERENITY-JUNIT-*xml") 

logger.println "Found XML files: \n" + files 

// initialize result variables 
def tests = 0 
def failures = 0 
def errors = 0 
def skipped = 0 
def passed = 0 

// parse files 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance() 
files.each{ 
    logger.println "Starting to parse file: " + it 

    channel = build.workspace.channel 
    def file = new FilePath(channel, it.getRemote()) 
    def xmlString = file.readToString() 
    logger.println "Extracted XML:\n" + xmlString 

    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder() 
    Document doc = dBuilder.parse(new InputSource(new StringReader(xmlString))) 
    doc.getDocumentElement().normalize() 
    Element testsuiteNode = doc.getDocumentElement() 
    logger.println testsuiteNode 

    tests += Integer.parseInt(testsuiteNode.getAttribute("tests")) 
    failures += Integer.parseInt(testsuiteNode.getAttribute("failures")) 
    errors += Integer.parseInt(testsuiteNode.getAttribute("errors")) 
    skipped += Integer.parseInt(testsuiteNode.getAttribute("skipped")) 
    logger.println "Completed parsing file: " + it 
} 
// calculate passed tests amount 
passed = tests - failures - errors - skipped 

// aggregated results 
logger.println "Aggregated results:" 
logger.println "Tests: " + tests 
logger.println "Passed: " + passed 
logger.println "Failures: " + failures 
logger.println "Errors: " + errors 
logger.println "Skipped: " + skipped 

// compose message subject 
def msgSubject 
if(tests == 4){ 
    if(failures > 0 || errors > 0){ 
     msgSubject = "FAILED - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}." 
    }else if(skipped > 0){ 
     msgSubject = "OK (w/ skipped tests) - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}." 
    }else{ 
     msgSubject = "OK - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}." 
    } 
}else{ 
    msgSubject = "FAILED - Not all tests or too many tests executed (${tests})." 
} 

// set message subject 
msg.setSubject(msg.getSubject() + ": " + msgSubject) 

logger.println "------------------------------------------------------------------------------------------------" 

你當然可以動態地改變電子郵件的任何元素(收件人,發件人,MSGTEXT等)。在這裏,我只是在改變這個話題。

的結果是這樣的:

健康檢查:OK - 傳遞4/4,0失敗,錯誤0,跳過0