目录
Allure
官网
allure-commandline下载地址(下载后bin目录加入PATH中)
demo
命令
$ allure --version
# 生成报告(自动在浏览器中打开)
$ allure serve /home/path/to/project/target/surefire-reports/
TestNG + Allure + Maven
pom.xml
<?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>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-testng-example</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<allure.version>2.13.2</allure.version>
<java.version>1.8</java.version>
<aspectj.version>1.9.5</aspectj.version>
<testng.version>7.1.0</testng.version>
<!--解决中文乱码问题-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<name>Allure TestNG Example</name>
<description>Allure TestNG Example</description>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-testng</artifactId>
<version>${allure.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
<!--这里可以加上一些testng.xml(如果不加的话是找test目录下:以Test开头的Java类、以Test结尾的Java类、以TestCase结尾的Java类)-->
<suiteXmlFiles>
<!--路径是从工程根目录开始的-->
<suiteXmlFile>src/main/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<reporting>
<excludeDefaults>true</excludeDefaults>
<plugins>
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>2.10.0</version>
<configuration>
<reportVersion>${allure.version}</reportVersion>
</configuration>
</plugin>
</plugins>
</reporting>
</project>
命令
# 测试
$ mvn clean test site
# 生成在线报告
$ mvn io.qameta.allure:allure-maven:serve
# 生成本地报告
$ mvn io.qameta.allure:allure-maven:report
注解
TestNG
注解 | 说明 |
---|---|
@BeforeSuite | 被@BeforeSuite注解的方法,将会在testng定义的xml根元素里面的所有执行之前运行。 |
@AfterSuite | 被@AfterSuite注解的方法,将会在testng定义的xml根元素里面的所有执行之后运行。 |
@BeforeTest | 被@BeforeTest注解的方法,将会在一个元素定义的所有里面所有测试方法执行之前运行。 |
@AfterTest | 被@AfterTest注解的方法,将会在一个元素定义的所有里面所有的测试方法执行之后运行。 |
@BeforeClass | 被@BeforeClass注解的方法,将会在当前测试类的第一个测试方法执行之前运行。 |
@AfterClass | 被@AfterClass注解的方法,将会在当前测试类的最后一个测试方法执行之后运行。 |
@BeforeMethod | 被@BeforeMethod注解的方法,将会在当前测试类的每一个测试方法执行之前运行。 |
@AfterMethod | 被@AfterMethod注解的方法,将会在当前测试类的每一个测试方法执行之后运行。 |
@Test | 被@AfterMethod注解的方法,是一个测试方法,既一个测试用例 |
Allure
注解 | 说明 | 详情 |
---|---|---|
@Epic("epic") | epic描述 | 敏捷里面的概念,定义史诗,往下是feature |
@Feature("feature") | 模块名称 | 功能点的描述,往下是story |
@Story("story") | 用户故事 | 用户故事,往下是title |
@Issue("issue") | 缺陷 | 对应缺陷管理系统里面的链接 |
@Description("description") | 用例描述 | 测试用例的描述 |
@Step("step") | 操作步骤 | 测试用例的步骤 |
@Severity(SeverityLevel.NORMAL) | 用例等级 | blocker,critical,normal,minor,trivial |
@Link("link") | 链接 | 定义一个链接,在测试报告展现 |
@Attachment("attachment") | 附件 | 报告添加附件 |
对应关系如下所示:
配置
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<!--suit是根节点,所以只能有一个(但是可以多文件)-->
<suite name="SuiteName" verbose="1">
<test name="TestName_1">
<!--支持多个class的配置-->
<classes>
<class name="test.sample.ParameterSample"/>
<class name="test.sample.ParameterTest"/>
</classes>
</test>
<test name="TestName_2">
<packages>
<!--支持多个package的配置,支持通配符-->
<package name="test.sample"/>
<package name="test.demo.*"/>
</packages>
</test>
<!--同一个test中可以定义多个过滤器(之间的与的关系,即必须两者都满足)-->
<test name="TestName_3">
<!--按照group过滤(Test可以有多个组,如果一个Test的多个组同时被include和exclude,那么会执行)-->
<groups>
<run>
<include name="group_1"/>
<include name="group_2"/>
<include name="group_3"/>
<exclude name="group_4"/>
</run>
</groups>
<classes>
<class name="test.sample.ParameterSample">
<!--支持方法级别的过滤-->
<methods>
<exclude name="test_1"/>
</methods>
</class>
<class name="test.sample.ParameterTest">
<methods>
<include name="test_1"/>
<include name="test_2"/>
<include name="test_3"/>
</methods>
</class>
</classes>
</test>
</suite>
allure.properties
# 报告生成目录(注意并不是最终得到html文件,而是一些执行信息)
allure.results.directory=target/allure-results
# 用于格式化替换 @Issue("issue") 中的issue
allure.link.issue.pattern=https://example.org/issue/{}
# 用于格式化替换 @Link(value = "value", name = "name", url = "url") 中的url
allure.link.tms.pattern=https://example.org/tms/{}
DEMO
Attacgment
- value为显示的名称
- type字段为MimeType
- fileExtension为可选的文件扩展名,必须以 . 开头
- 注解用在方法上,返回值即为内容(二进制文件返回byte[]类型),页面上会根据设置的type类型(和后缀名)进行显示
- 当然也可以不用注解,而用方法,简单示例如下:
@Test(description = "test")
public void test_1() throws Exception {
attachment("测试普通文本", "哈哈哈哈哈哈哈");
attachment("测试图片文件", new FileInputStream("E:\Pictures\15030Q05046-1.jpg"));
addAttachment("测试音频文件", "audio/mpeg", new FileInputStream("E:\Music\曾经有你的森林(中文填词) - wispering - 5SING中国原创音乐基地.mp3"), ".mp3");
addAttachment("测试JSON字符串", "application/json", "{"code":200}");
}