allure--開源 report 框架總結
作者 孫高飛
allure
allure 是一個輕量級的,靈活的,支援多語言,多平臺的report框架。是的,它是支援多語言並在很多開源框架中做了適配整合的。我這次終於不是隻介紹java的專案了。其目的就是使用簡單方便的方式構建一個完善的report體系。 我們直接上效果圖吧。
首先看看國外牛人做的report吧。allure report 傳送門
再來看看我最近在新專案中做UI自動化的時候的report,我只列出幾個重要的。
首先是overview頁面
再來看看每個詳細頁面。先是defects頁面,它會彙總所有失敗的指令碼,我們點選進去都能看到詳細的錯誤資訊
再來看看按feature和story組織case的report頁面
統計頁面
每個case的詳細資訊頁面
可以看到了我們關聯了bug的id,case的id,定製了測試所屬的feature,story。測試的title,description。甚至上傳的附件(截圖),當我們想要看截圖的時候,點選圖片就會是下面的樣子
配置
看過效果圖以後我們來定製自己的report吧。首先說一下allure已經整合到各種框架和平臺上,也支援多語言。我們看一下它支援的列表。由於本人對java最熟悉,所以例子還是用java的了。
步驟
詳細的配置資訊請看git上或者官網上的文件吧。我大概說一下步驟和截圖。
以下為pom.xml 中Allure 框架與maven整合的必要配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-examples-parent</artifactId> <version>1.0</version> </parent> <artifactId>allure-testng-example</artifactId> <version>1.0-SNAPSHOT</version> <properties> <allure.version>1.4.16</allure.version> <aspectj.version>1.8.5</aspectj.version> </properties> <name>Allure TestNG Report</name> <description>Allure TestNG and WebDriver Usage Example</description> <dependencies> <dependency> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-testng-adaptor</artifactId> <version>${allure.version}</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <testFailureIgnore>true</testFailureIgnore> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin> <!--Needed only to show reports locally. Run jetty:run and open localhost:8080 to show the report--> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.2.10.v20150310</version> <configuration> <webAppSourceDirectory>${project.build.directory}/site/allure-maven-plugin</webAppSourceDirectory> <stopKey>stop</stopKey> <stopPort>1234</stopPort> </configuration> </plugin> </plugins> </build> <reporting> <excludeDefaults>true</excludeDefaults> <plugins> <plugin> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </reporting> </project>
本機除錯執行以下命令後瀏覽器裡開啟 http://localhost:8080 檢視結果
$ mvn clean test
$ mvn site
$ mvn jetty:run
與Jenkins整合
Jenkins 外掛管理頁面,可選外掛裡 搜尋 Allure Jenkins Plugin 安裝
系統設定頁面裡 安裝 Allure Commandline,安裝完成效果如下:
開啟自動化測試job 配置頁面裡 新增 “增加構建後操作步驟” 選擇 “Allure Report” 效果如下:
OK,這樣大家就配置好自己的服務了,在本機執行命令或者配置到jenkins上就可以看到預設的report了。 如果在本機執行的話,它其實是開啟了一個web 服務的,大家要使用jetty來執行
定製report
我們上面看到了如何將allure引入到我們專案中來,現在我們說說怎麼定製我們的report吧。因為進過上面的配置我們看到的是預設的report。如果我們希望測試指令碼能夠顯示一些特性資訊或者按特定的結構組織在report裡的話。是需要使用一些allure自己提供的機制的。我以java為例說明一下。
其實很簡單,因為我使用的是testng,所以在maven中引入的是allure-testng-adaptor。這樣我可以配合allure自己的標註完成這些事情。如下:
@Issue("AG-2759823")
@TestCaseId("AG-450234")
@Features(Feature.SMOKE)
@Stories("DAG圖所有運算元的執行測試")
@Title("冒煙測試_所有運算元執行_正常測試")
@Description("測試一個流程,用作迴歸冒煙測試")
@Test(dataProvider="unitDataProvider",dataProviderClass=UnitDataProvider.class,groups={"AG","smoke"})
@DataFile(filePath="data/agTest/workFlow.xml")
public void workFlow(String sql, String schema,String pyscript){
這是一個標準的測試方法的簽名其中Test標註是testng自己的我們不去管,DataFile是我為資料驅動封裝的標籤我們也不管。 那麼其他的就是allure給我們提供的標註。
- Features:將case分類到某個feature中
- Stories:屬於feature之下的結構,說明此用例是某個feature中的某個story下的用例
- Title: 測試用例的標題
- Description: 測試用例的描述
- Issue: 跟測試用例相關的bug Id(這是一個連結,可以配置bug管理系統的URL,直接跳轉到bug管理系統中)
- TestCaseId:測試用例的id(這是一個連線,可以配置用例管理系統的URL,直接跳轉到用例管理系統中)
其實還有@Step,@parameters,@environment等標註可以使用,我在這裡不細說了。大家可以去看官方文件。通過上面的一系列標註其實我們就可以按照自己喜歡的方式去管理case在report中的結構和資訊。如下面的效果圖
附件
下面說說怎麼上傳附件到report中把。其實大家最關心的就是UI自動化中失敗後的截圖吧。 做到這點同樣很簡單,我們看下面的例子。
public class AllureReporterListener implements IHookable {
@Override
public void run(IHookCallBack callBack, ITestResult testResult) {
callBack.runTestMethod(testResult);
if (testResult.getThrowable() != null) {
try {
takeScreenShot(testResult.getMethod().getMethodName());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Attachment(value = "Failure in method {0}", type = "image/png")
private byte[] takeScreenShot(String methodName) throws IOException {
return ((TakesScreenshot)WebDriverRunner.getWebDriver()).getScreenshotAs(OutputType.BYTES);
}
}
注意到下面的那個takeScreenShot方法麼? 上面有個一個@Attachment標註,這就是allure為附件預留的,只要你執行了帶有這個標註的方法,這個附件就會在report中顯示出來,上面的例子我是寫了一個監聽器,如果測試失敗就截圖。
踩過的坑
一開始使用的時候踩過一些坑,有些我已經忘了,現在趁我還記得幾個就在這裡記錄下來,如果大家也碰見了可以借鑑一下。
testng無法上傳附件的問題
這已經被標記為一個bug提交到git上並且開發團隊已經計劃在修復,原因是allure跟testng的監聽器的相容問題。解決方法其實就是我上面例子中使用的,自己實現一個IHookable 監聽器並顯示的在測試類中標註。如下:
@Listeners({ AllureReporterListener.class })
@DataManage(recoveryStrategy=RecoveryStrategy.METHOD)
public class WorkFlowTest extends BaseTestCase {
jenkins的allure外掛在slave機上的jdk問題
如果你的測試是在slave機器上執行的而且恰巧你的JAVA_HOME環境變數跟jenkins master機不一樣的話。可能就會碰到report無法生成的錯誤。會提示你JAVA_HOME指向的目錄不存在或者找不到jdk。這是因為不知道什麼原因它在使用master機上的JAVA_HOME。 解決方案是我們要修改slave機上的一個檔案。jenkins會在salve機中安裝allure上的工具,裡面有一個檔案叫allure.bat。編輯這個檔案,如下:
可以看到這裡原來應該是JAVA_HOME,而我直接改成了salve機的JAVA_HOME路徑
maven依賴有問題
我曾經碰見過在執行的時候maven的包沒有下載下來的情況。當時百思不得其解。於是我的一個同事比較聰明,它在git上下載了一個allure report的demo專案。執行這個demo專案就自動把包都下載下來了。大家如果也碰見了的話可以到git上下載相應的demo專案。例如我的testng的專案就是:allure-testng-example