基于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>
图1 pom.xml设置
选择用例组织的testngEnvFilter.xml 执行步骤如下:
- Step1 mvn命令选项 -DxmlFileName=testngEnvFilter.xml 会把属性xmlFileName的值设置成testngEnvFilter.xml
- Step2 ${xmlFileName}会被<xmlFileName>中的值testngEnvFilter.xml替换
- Step3 插件maven-surefire-plugin 会让maven调用指定路径下的testngEnvFilter.xml
选择执行环境dev执行步骤如下
- Step1 mvn命令选项 -Pdev会让profile id为dev的激活
- Step2 ${env}会被属性<env>中的值dev替换
- 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>
执行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配置文件)