天天看點

顔值擔當:自動化測試報告架構Allure

作者:城下秋草黃

前言

測試報告作為軟體測試工作的一項主要輸出,重要性不言而喻。而随着自動化測試在行業應用越來越廣泛,自動化測試報告的可視化、包含資訊的全面化、和外部系統對接的便利化需求也越來越突出。本篇 Chat 帶來的就是目前測試業内應用非常廣泛的專業報告架構 Allure 介紹。

Allure 架構簡介

目前業界已經有非常多的強大自動化測試架構,但是這些架構生成的測試報告一般都以記錄結果資訊為主,在報告呈現效果上并不理想。Allure 就是這樣一個提升測試報告效果的專業測試報告架構。

Allure 非常輕量級,而且配置靈活,完全開源。由俄羅斯軟體公司 Qameta software 測試團隊維護,目前已演進到 Allure2,最新版本是 2.10.0,Allure 簡單易用,支援同目前絕大多數測試架構內建,如 Junit,Pytest,Cucumber,TestNG,mocha等。而且原生提供了中文支援,而且 Allure 生成的自動化測試報告層次豐富,界面美觀,展現了現代測試報告的發展趨勢。可以說無論是功能豐富程度還是展示效果都很強大。

Allure 安裝和使用

在各個不同作業系統平台上部署 Allure 都非常簡單,這裡以 windows 系統為例,Allure 官方推薦使用 windows 系統下的軟體包管理工具 scoop 來進行 allure 的安裝和管理。

通過 scoop 安裝

沒有安裝 scoop 的話,打開 powershell 執行以下指令安裝 scoop:(需要 .net framework 4.5以上版本,win10 系統預設攜帶)

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

scoop 安裝完成後執行:

scoop install allure

會安裝目前最新版本的 allure 工具,目前最新版本為 2.10.0

安裝完成後執行 allure --version 如能正确顯示版本資訊,則安裝成功。如下圖是安裝過程。

顔值擔當:自動化測試報告架構Allure

直接下載下傳安裝

除了通過包管理工具安裝,我們也可以直接下載下傳壓縮包進行安裝,目前壓縮包可以從 maven 的官方倉庫進行下載下傳(下載下傳位址),選擇 zip 檔案,本地解壓即可得到 allure 本地執行工具。

解壓後,還需要配置一下系統環境變量,将 allure 的 bin 目錄配到到 PATH 變量中,便于後續調用。

同樣通過 allure --version 确認後即可使用。

allure 的使用

allure 可以将目前絕大部分主流的自動化測試架構生成的測試結果如 Junit 的 xml 格式報告解析轉換為一個專業的測試報告,以 html 網頁通過 web 服務方式呈現出來。

allure 主要支援以下指令:

allure serve [path of allure result]

這個指令是最常使用的。會将內建了 allure 功能的測試架構生成的 allure 測試結果路徑下的内容轉換為測試報告。同時啟動一個 web 服務來展示轉換後的報告

allure generate [path of allure result]

這個指令用于将測試結果轉換為 allure 測試報告(不開啟 web 服務)。可以攜帶一個 -c 參數先清空之前的結果。

allure open [path of allure report]

這個指令則會啟動一個 web 服務将已經生産的測試報告打開

Allure 報告功能介紹

總覽

顔值擔當:自動化測試報告架構Allure

如圖是 Allure 報告總覽界面:從左側導航欄可以看到,Allure 報告支援按類别、測試集、功能、包以及圖表、時間刻度等多個次元進行結果資訊展示,而且左下角還可以進行語言切換,包含了中文的預設支援。在總覽圖中很直覺地展示了目前測試執行結果的總體狀态。

類别

類别提供了在測試報告中按定義的分類将不同執行結果進行分類展示的功能。allure 預設會将執行失敗的用例納入 product defects 分類中。我們也可以自定義類别來進行展示。如下就是按自定義類别展示的界面:

顔值擔當:自動化測試報告架構Allure

測試套

測試套( Test suites )中可以将用例以測試集合的形式來進行展示。和 Junit 架構結合時,預設是将每一個測試類視作一個測試套進行呈現,如圖:

顔值擔當:自動化測試報告架構Allure

圖表展示

在 Allure 報告的圖表頁中,會自動将目前報告中的一些關鍵資訊彙總以圖表的方式可視化呈現出來,包括執行狀态、執行優先級、執行耗時、耗時趨勢、結果趨勢、分類趨勢、重試趨勢等數個次元。如圖:

顔值擔當:自動化測試報告架構Allure

時間刻度

在 時間刻度 頁中,提供了一個基于執行耗時的刻度表,可以非常直覺地看到每個 case 執行的耗時區間,便于直覺地識别出性能最差的用例。

顔值擔當:自動化測試報告架構Allure

功能

功能 頁是 Allure 提供的一個非常有用的特色功能。Allure 支援結合自動化測試架構深度定義不同 case 所屬的功能次元,并根據這個次元分級展示。這個分級次元和目前流行的靈活研發的需求拆分原則基本一緻,按對應需求從大到小逐級遞減:

顔值擔當:自動化測試報告架構Allure

對應在 Allure 展示:

顔值擔當:自動化測試報告架構Allure

包 頁面展示的是比 測試套 更高一個級别的分層,Junit 架構中對應的就是 package 再向下對應到 class、method,如圖:

顔值擔當:自動化測試報告架構Allure

以上是 Allure 各個功能頁面的介紹,可以看到 Allure 支援豐富的分層和可視化呈現,對于耗時、錯誤、統計等關鍵資訊已經進行了科學地組織和展示。

和 Junit / Maven 結合使用 Allure

上節介紹的是 Allure 報告本身的展示和生成,但是這些資訊的産生還是需要依賴與自動化測試架構的內建。下面就以 Java 世界最流行的測試架構 Junit 為例,結合 Maven 建構工具和 Eclipse 開發工具看下如何在編寫完自動化測試用例後生成 Allure 測試結果。

建立項目

打開 Eclipse 後,首先建立一個 maven java 項目(確定本機 JDK、maven 安裝使用正常),注意 Eclipse 預設 maven 項目的JDK版本是 1.5,此處需要修改為 1.8 版本以上。

打開項目 Java Build Path,删除原有 1.5 的庫,添加 1.8 或以上的 JDK 庫:

顔值擔當:自動化測試報告架構Allure

參考 Allure 官網 中與 Junit5 架構內建的介紹,修改 Maven 的 pom.xml 檔案,安裝對應的插件及配置,以下是本文示例使用的 pom 檔案内容,對應依賴版本已更新到目前最新。

<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>

	<groupId>qiucao</groupId>
	<artifactId>allureDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>allureDemo</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<java.version>1.8</java.version>
		<junit.api.version>5.4.0</junit.api.version>
		<junit.jupiter.version>5.4.0</junit.jupiter.version>
		<junit.platform.version>1.4.0</junit.platform.version>
		<aspectj.version>1.9.3.RC1</aspectj.version>
		<allure.version>2.9.0</allure.version>
	</properties>

	<dependencies>
		<!-- Test API(s) -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.api.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- Test engine(s) -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
		    <groupId>org.junit.vintage</groupId>
		    <artifactId>junit-vintage-engine</artifactId>
		    <version>${junit.api.version}</version>
		    <scope>test</scope>
		</dependency>

        <!-- Allure插件 -->
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-junit5</artifactId>
            <version>${allure.version}</version>
        </dependency>
        
	</dependencies>
	
	<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M3</version>
                <configuration>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                    </argLine>
                    <systemProperties>
                        <property>
                            <name>junit.jupiter.extensions.autodetection.enabled</name>
                            <value>true</value>
                        </property>
                        <!-- 指定allure結果目錄 -->
                        <property>
                            <name>allure.results.directory</name>
                            <value>${project.build.directory}/allure-results</value>
                        </property>
                        <!-- allure外鍊配置 -->
                        <property>
                            <name>allure.link.qiucao.pattern</name>
                            <value>https://gitbook.cn/gitchat/activity/{}</value>
                        </property>
                        <property>
                            <name>allure.link.issue.pattern</name>
                            <value>https://github.com/chengxiaqiucao/JUnit5-features-demo/issues/{}</value>
                        </property>
                        <property>
                            <name>allure.link.tms.pattern</name>
                            <value>https://testcasemanage.justExample.com/{}</value>
                        </property>
                        
                    </systemProperties>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>2.9</version>
                <configuration>
                    <reportVersion>${allure.version}</reportVersion>
                    <allureDownloadUrl>https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${allure.version}/allure-commandline-${allure.version}.zip</allureDownloadUrl>
                </configuration>
            </plugin>
        </plugins>
    </build>
	
</project>

           

相關插件安裝完成後,即可使用 Junit5 正常編寫自動化測試,JUnit5 的使用本文不再詳述。項目目錄結構如圖:

顔值擔當:自動化測試報告架構Allure

執行測試

用例編寫完成,可使用 Eclipse 的 Junit5 執行測試,執行結果如圖:

顔值擔當:自動化測試報告架構Allure

但此時我們并不能通過 Junit 報告生成 Allure result,如上面的 pom.xml 定義,Allure 和 junit5 的內建是通過 maven 插件實作的。是以我們要生成 Allure result,需要通過 Maven 來執行測試。

這裡有一點需要注意,allure 預設的結果目錄 allure results 會生成在項目目錄,但這個目錄執行 Maven 的 clean test 時并不會清空,是以一般需要手工将 allure results 目錄配置 maven 的 target 目錄下,可在 pom.xml 檔案中添加如下配置實作:

<property>
    <name>allure.results.directory</name>
    <value>${project.build.directory}/allure-results</value>
</property>
           

執行 mvn clean test 運作測試,然後即可打開 Allure 報告,執行過程如圖:

顔值擔當:自動化測試報告架構Allure

注解功能深度定制 Allure 報告

Allure 可以通過注解機制來和 Junit5 架構進行深度融合,以下我們來介紹如何使用相關的注解來将對應的内容展示在 Allure 報告中。

設定用例描述

如圖是 Allure 報告中展示的用例描述資訊:

顔值擔當:自動化測試報告架構Allure

對應使用的是 @@Description 注解,代碼中如:

@Test
@DisplayName("Allure描述")
@Story("Allure注解描述")
@Description("失敗用例,此處為描述資訊")
@Severity(SeverityLevel.CRITICAL)
void addDescription() {
    Assertions.assertTrue(false);
}
           

設定作者資訊

Allure 可以對測試類設定作者資訊:

顔值擔當:自動化測試報告架構Allure

通過 @Owner 注解标記,代碼如下:

@Owner("城下秋草")
public class AllureTest {

}
           

用例步驟分解

如圖是 Allure 報告中對于用例按步驟分解的示例:

顔值擔當:自動化測試報告架構Allure

這是通過在用例中調用對應的 Step 方法,在步驟方法中添加 @Step 注解實作的:

@Test
@Story("Allure添加步驟")
@Description("用例包含多個步驟")
@Severity(SeverityLevel.NORMAL)
void multiSteps() {
    step001();
    step002();
    step003();
}

@Step("用例步驟一")
void step001() {}

@Step("用例步驟二")
void step002() {}

@Step("用例步驟三")
void step003() {}
           

按功能分級

如之前的介紹,按靈活研發中需求的分級實踐,Allure 也支援通過相應的功能分級注解來對用例進行标記

顔值擔當:自動化測試報告架構Allure

對應到代碼中,使用 @Epic、@Feature、@Story、@Test、@Step來進行分級對應,如:

@Epic(value = "Allure測試報告示範Demo")
@Feature("示範Allure中的注解定制")
public class AllureTest {

	@Test
	@Story("Allure添加步驟")
	@Description("用例包含多個步驟")
	@Severity(SeverityLevel.NORMAL)
	void multiSteps() {
		step001();
		step002();
		step003();
	}
	
	@Step("用例步驟一")
	void step001() {}
	
	@Step("用例步驟二")
	void step002() {}
	
	@Step("用例步驟三")
	void step003() {}
}    
           

添加附件

對于執行中需要附加的一些補充資訊,可以通過調用使用了 @Attachment 注解的方法來攜帶。

下圖是一個輸出代碼中指定内容的示例:

顔值擔當:自動化測試報告架構Allure

對應的代碼:

@Test
@Story("Junit攜帶附件")
@Description("附件直接輸出内容")
public void simpleTestWithAttachments() throws Exception {
    assertThat(2, is(2));
    makeAttach();
}

@Attachment
public String makeAttach() {
    return "yeah, 2 is 2";
}
           

下圖是攜帶外部 csv 檔案作為附件的示例:

顔值擔當:自動化測試報告架構Allure

對應代碼如下:

@Description("攜帶檔案作為附件")
@Test
@Story("Junit攜帶附件")
public void csvAttachmentTest() throws Exception {
    saveCsvAttachment();
}

@Attachment(value = "Sample csv attachment", type = "text/csv")
public byte[] saveCsvAttachment() throws URISyntaxException, IOException {
    URL resource = getClass().getClassLoader().getResource("sample.csv");
    if (resource == null) {
        fail("Couldn't find resource 'sample.csv'");
    }
    return Files.readAllBytes(Paths.get(resource.toURI()));
}
           

支援外部連結

Allure 也支援在報告中展示目前用例和外部系統的關聯,目前主要包含三類不同外部連結:

  • issue
  • TmsLink
  • Link

分别使用不同的圖示,來對應問題、外部用例管理系統、參考連結。要使用外部連結,需要針對性地在 pom.xml 中定義相應的配置,{}中定義的是顯示在 allure 報告中的 ID,和配置資訊中的屬性對應。以下是本例中使用的配置:

<!-- allure外鍊配置 -->
<property>
    <name>allure.link.qiucao.pattern</name>
    <value>https://gitbook.cn/gitchat/activity/{}</value>
</property>
<property>
    <name>allure.link.issue.pattern</name>
    <value>https://github.com/chengxiaqiucao/JUnit5-features-demo/issues/{}</value>
</property>
<property>
    <name>allure.link.tms.pattern</name>
    <value>https://testcasemanage.justExample.com/{}</value>
</property>
           

在代碼分别使用 @Issue、 @TmsLink、 Link 注解來定義顯示的資訊:

@Test
@Story("Allure外部連結")
@Description("失敗用例關聯issue")
@Severity(SeverityLevel.BLOCKER)
@Issue("1")
void testIssues() {
    Assertions.assertEquals(2,3);
}

@Test
@Story("Allure外部連結")
@Description("關聯用例管理系統用例連結")
@Severity(SeverityLevel.MINOR)
@TmsLink("Case001")
void testTmsLink() {
    Assertions.assertEquals(2,2);
}

@Test
@Story("Allure外部連結")
@Description("關聯外部資源連結")
@Severity(SeverityLevel.MINOR)
@Link(name = "5c83d2aa6d5f670edc43c606", type = "qiucao")
void testLink() {
    Assertions.assertEquals(2,2);
}
           

Allure 報告中展示效果如下:

顔值擔當:自動化測試報告架構Allure
顔值擔當:自動化測試報告架構Allure
顔值擔當:自動化測試報告架構Allure

環境定制

在 Allure 報告的總覽頁面,可以展示目前執行的環境資訊,這是通過配置環境屬性檔案environment.properties實作的,該檔案需要位于 allure results 目錄下,檔案内容如:

env = regression
tools = Allure-Junit5
version = 2.10.0
           

類别定制

前面說過,還可以自定義類别資訊來在報告中進行類别分類,這是通過類别配置檔案 categories.json 配置實作的,也需要位于 allure results 目錄下,類别定義主要是将類别名稱和對應的執行狀态進行關聯,對于問題用例,還可以通過正規表達式抓取指定輸出内容的用例進行分類。本例中檔案内容如:

[
  {
    "name": "成功執行的測試", 
    "matchedStatuses": ["passed"] 
  },
  {
    "name": "比對資訊不一緻",
    "messageRegex": ".*expect.*", 
	"matchedStatuses": ["broken", "failed"]
  },
  {
    "name": "未找到對應類",
    "traceRegex": ".*FileNotFoundException.*", 
    "matchedStatuses": ["broken"]
	},
  {
    "name": "執行失敗的用例",
    "matchedStatuses": ["broken","failed"]
  }
]
           

報告中效果:

顔值擔當:自動化測試報告架構Allure

和 Jenkins 的內建

除了在執行自動化測試後手工來執行生成 Allure 報告,大多數情況下,我們更希望在執行後自動完成報告的生成。如持續內建場景,在自動化排程完成測試後,将測試報告自動生成出來,所幸 Allure 也提供了對持續內建工具的良好支援。以最流行的 Jenkins 為例:

插件安裝

Jenkins的官方插件庫中包含有 Allure 插件,從插件配置中選中該插件并更新安裝即可。

顔值擔當:自動化測試報告架構Allure

maven settings 配置

因為我們使用的 Junit 插件依賴 maven,是以 Jenkins 中還需要配置 Maven:

顔值擔當:自動化測試報告架構Allure

JDK 路徑配置

同樣,必須要配置 JDK 支援:

顔值擔當:自動化測試報告架構Allure

maven 路徑配置

配置 maven 的安裝路徑:

顔值擔當:自動化測試報告架構Allure

Allure 路徑配置

配置 Allure 指令行安裝路徑:

顔值擔當:自動化測試報告架構Allure

建立任務

在Jenkins 建立一個 maven 項目的建構任務:

顔值擔當:自動化測試報告架構Allure

任務配置 maven 執行指令

在 Build 部配置設定置 maven 的執行指令,即 clean test:

顔值擔當:自動化測試報告架構Allure

設定項目路徑

Jenkins 預設調用本地工作空間,是以還需要選中自定義工作空間設定項目空間的實際路徑:

顔值擔當:自動化測試報告架構Allure

Allure 配置

在 Post-Build Actions 部分選中 Allure Report,并配置結果路徑和報告生成路徑:

顔值擔當:自動化測試報告架構Allure

完成以上配置并儲存後,即完成了自動化測試任務的建立。

執行和報告生成

此時在剛建立的任務中執行 立即建構,即刻觸發任務執行。數次建構任務觸發後,即可看到任務執行的趨勢圖。進入 Allure Report 可檢視詳細的 Allure 報告。任務界面如圖:

顔值擔當:自動化測試報告架構Allure

以上就是和 Jenkins 結合生成 Allure 報告的使用方法。 Jenkins 工具本身的排程和通知等功能,此處不再贅述,在 《玩轉 PostMan:自動化篇》 中也有比較詳細的說明。

結語

以上就是對測試報告架構 Allure 的介紹,無論我們是想盡可能全面、美觀地将測試結果呈現給使用者,還是豐富我們測試報告的内容組織,或者希望在持續內建工具鍊上把測試情況進行專業地呈現;Allure 無疑都是測試同學展現專( zhuang )業 ( bi )性的利器,希望本文可以給大家在自動化測試實施的報告架構選擇上提供一個有益的參考。

繼續閱讀