基于maven testng extentreport git jenkins 持续自动化测试

基于maven testng extentreport git jenkins 一键执行自动化测试

2020-03-12

 目录 

1 选型
2 思路
3 使用maven命令选项参数化用例组织、用例环境
4 集成Jenkins参数化用例组织、用例版本、用例执行环境
  4.1 插件说明
  4.2 创建配置Jenkins任务
  4.3 执行Jenkis task

 源代码:interface-test-framework2.zip

1 选型


 

 返回

  • 使用Maven作为项目类型,方便管理架包。
  • 使用TestNG作为项目运行框架,方便执行测试用例,生成测试报告。
  • 使用ExtentReports作为代替TestNG报告的报告驱动,二次美化功能,界面更美观,内容清晰
  • 使用Git作为仓库管理工具,方便管理项目代码。
  • 使用Jenkins作为自动化持续集成平台,方便自动编译,自动打包,自动运行测试脚本,邮件发送测试报告,通知等。

2 思路


 返回

如何使用jenkins一键执行自动化,主要考虑到用例管理和用例执行环境的参数化。

用例管理

  • 用例组织:使用testng的testn.xml来组织(ExtentReport报告也会对testng.xml标签<Test>做分组展示)
  • 用例版本:用git的branch做版本控制

用例环境

  • 用例执行的环境,如开发、测试、预发布、生产环境

3 使用maven命令选项参数化用例组织、用例环境


 返回

命令如下

mvn clean test -Pdev -DxmlFileName=testngEnvFilter.xml

其中,Maven中的-D(Properties属性)和-P(Profiles配置文件)

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>com.demo</groupId>
    <artifactId>interface-test-framework</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <xmlFileName></xmlFileName>
    </properties>

    <dependencies>
        <!-- 测试报告插件和testng的结合 -->
        <dependency>
            <groupId>com.vimalselvam</groupId>
            <artifactId>testng-extentsreport</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- extentreports测试报告插件 -->
        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports</artifactId>
            <version>3.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.1.0</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

        <filters>
            <filter>src/main/resources/envFilters/filter-${env}.properties</filter>
        </filters>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
                <configuration>
                    <argLine>-Dfile.encoding=UTF-8</argLine>
                    <encoding>UTF-8</encoding>
                    <suiteXmlFiles>
                        <!--<suiteXmlFile>${project.basedir}/target/classes/testNg/api/APICollection-TestSuite.xml</suiteXmlFile>-->
                        <suiteXmlFile>${project.basedir}/target/classes/testNg/${xmlFileName}</suiteXmlFile>
                        <!--<suiteXmlFile>${project.basedir}/target/classes/testNg/api/push/RegisterToken-TestSuite.xml</suiteXmlFile>-->
                    </suiteXmlFiles>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- 不同的打包环境 -->
    <profiles>
        <!-- 开发环境,默认激活 -->
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
            </properties>
        </profile>

        <!-- 生产环境 -->
        <profile>
            <id>product</id>
            <properties>
                <env>product</env>
            </properties>
        </profile>

        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault><!--默认启用的是test环境配置-->
            </activation>
        </profile>
    </profiles>
</project>
View Code

图1 pom.xml设置

选择用例组织的testngEnvFilter.xml 执行步骤如下:

  1. Step1 mvn命令选项 -DxmlFileName=testngEnvFilter.xml 会把属性xmlFileName的值设置成testngEnvFilter.xml
  2. Step2 ${xmlFileName}会被<xmlFileName>中的值testngEnvFilter.xml替换
  3. Step3 插件maven-surefire-plugin 会让maven调用指定路径下的testngEnvFilter.xml 

选择执行环境dev执行步骤如下

  1. Step1 mvn命令选项 -Pdev会让profile id为dev的激活 
  2. Step2 ${env}会被属性<env>中的值dev替换 
  3. Step3 filtering为true,会把src/main/resources目录下所有文件,只要包含<filter>中文件中的属性变量的,全部替换掉 。在Step3中,只要src/main/resources目录文件文件中,只要有src/main/resources/envFilters/filter-dev.properties(这里,${env}被dev替换了)属性变量,就会被替换掉,如下所示

 filter-dev.properties

#Environment

Environment=Dev
douban.host=https://movie.douban.com/Dev

env.properties

#Environment
Environment=${Environment}
douban.host=${douban.host}

 这里,env.properties,在目录src/main/resources下变量${Environment}、${douban.host}会被 filter-dev.properties的Environment、douban.host属性的值替换掉。

 env.properties,里还可以存放对应环境的数据库连接。我们在用例里面只要提取url的host和db的连接即可,如EnvProfileTest.java所示,该部分代码可以放在@beforesuite,这里为了便于展示放在@test中

public class EnvProfileTest {
    @Test
    public void testcase1() throws IOException {
        InputStream stream = this.getClass().getClassLoader().getResourceAsStream("env.properties");
        Properties properties = new Properties();
        properties.load(stream);
        String host = properties.getProperty("douban.host");
        String env=properties.getProperty("Environment");
        Reporter.log(String.format("Environment: %S, Host: %S branch: master",env,host),true);
    }
}

 

testngEnvFilter.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <test name="test" verbose="1" preserve-order="true" >
        <classes>
            <class name="com.demo.testcase.smoke.EnvProfileTest">
            </class>
        </classes>
    </test>
    <!--配置监听器-->
    <listeners>
        <listener class-name="com.demo.listener.MyTestListener"/>
        <listener class-name="com.demo.listener.MyExtentReporterListener"/>
    </listeners>
</suite>
View Code

 

执行mvn命令: mvn clean test -Pdev -DxmlFileName=testngEnvFilter.xml ,输出结果如下:

图2 mvn命令执行结果

从图2中可以看到Environment和Host变成了 filter-dev.properties中设置的值。 

4 集成Jenkins参数化用例组织、用例版本、用例执行环境

4.1 插件说明

  • Maven Integration plugin -必备!
    Maven构建插件,使用简单方便。
  • HTML Publisher plugin -必备!
    extentreporets美化报告替换testng就是为了好看,但要在jenkins中展示必须安装此插件。
  • Groovy -必备!
    Jenkins不支持异类样式CSS,所以Groovy插件是为了解决HTML Publisher plugin在展示extentreporets时能够正确美丽的作用。
  • Dingding[钉钉] Plugin -可选!
    测试用例构建结果的通知。网上很多说用邮件,说实话使用场景最频繁高效的应该是IM靠谱。这个插件就是解决测试结果的通知。
  • git parameter - 必备
    构建项目,参数化构建git parameter
  • Parameterized Trigger Pl ugin - 非必备
  • TestNG Results - 非必备
    TestNg测试结果收集,统计运行结果数据。

 

图3 已安装插件

注意:我的Jenkins ver. 2.150.3 ,dingTalk插件只使用于Jenkins2.176.4或更新版本

DingTalk
Use DingTalk robot to send notifications when projects are built.
警告:该插件只适用于Jenkins2.176.4或更新版本。它可能不能正常运行于你的Jenkins

4.2 创建配置Jenkins任务

用Jenkins创建maven类型的任务,名称为“InterfaceTestIntegration”

图4 Jenkins任务General设置

上图4中,General设置丢弃旧的构建测试和参数化构建。其中,env是环境参数,xmlFileName是用例组织参数,CaseVersionBranch是用例版本参数(git Parameter会拉取online仓库的分支)

图5 源码管理设置

图5中,源码git的分支设置为caseVersionBranch变量

图6 Build设置

图6中,Build设置Goal and options设置为compile,使其不执行test步骤

图7 post steps设置

上图7中,有两步:

  • 调用maven执行mvn命令
  • 执行groovy command,配置Groovy script的目的是让Http Reported插件css能用,同时不用担心jenkins重启
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

图8 构建后操作设置

在图8中,侯建后操作设置有两步:

  • ExtentReport的publish html report设置
  • testng的pubish testng result设置,默认即可

4.3 执行Jenkis task

用分支v1.1.0参数构建

 图9 开始构建Build with Parameter

 

图10 Html Report根据分支用例显示

 

参考

[1] 接口自动化测试一体式解决方案(集成:Java+Testng+Maven+Jenkins+ExtentReports+Retrofit2+Git)

[1] Maven中的-D(Properties属性)和-P(Profiles配置文件)

[2] jenkins使用git parameter参数化构建

[4] 移动测试架构演进 | 蚂蚁金服自动化用例管理探索

 

posted @ 2020-03-12 16:43  明-Ming  阅读(708)  评论(0编辑  收藏  举报