TestNG + Allure + Maven

Allure

官网
allure-commandline下载地址(下载后bin目录加入PATH中)
demo

命令

$ allure --version
# 生成报告(自动在浏览器中打开)
$ allure serve /home/path/to/project/target/surefire-reports/
# 生成静态报告,可以部署在nginx中访问,推荐使用
$ allure generate /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
# 解决执行失败下面不执行的问题
$ mvn -C -U clean test -Dmaven.test.failure.ignore=true -Dxml_name=testng.xml

注解

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">
    <!--同一个class用同一个线程处理,不同class之间并行-->
    <test name="TestName_1" parallel="classes" thread-count="5">
        <!--支持多个class的配置-->
        <classes>
            <class name="test.sample.ParameterSample"/>
            <class name="test.sample.ParameterTest"/>
        </classes>
    </test>
    <!--所有的测试方法都可以并行-->
    <test name="TestName_2" parallel="methods" thread-count="5">
        <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

MIME 参考手册

  1. value为显示的名称
  2. type字段为MimeType
  3. fileExtension为可选的文件扩展名,必须以 . 开头
  4. 注解用在方法上,返回值即为内容(二进制文件返回byte[]类型),页面上会根据设置的type类型(和后缀名)进行显示
  5. 当然也可以不用注解,而用方法,简单示例如下:
    @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}");
    }

TestNG 二次开发

ISuiteListener

ITestListener

IAnnotationTransformer 实现对测试类和方法中Test注解的自定义

IRetryAnalyzer 自定义重试逻辑

posted @ 2020-07-14 17:36  飞_2016  阅读(841)  评论(0编辑  收藏  举报