zoukankan      html  css  js  c++  java
  • 基于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] 移动测试架构演进 | 蚂蚁金服自动化用例管理探索

  • 相关阅读:
    人性的经典总结54句
    系统程序员成长计划文本处理(XML解析器)
    系统程序员成长计划-像机器一样思考(二)
    Android输入事件流程
    系统程序员成长计划文本处理(INI解析器)
    request范围内共享属性 request_attribute.jsp
    系统程序员成长计划-像机器一样思考(三)
    系统程序员成长计划-像机器一样思考(一)
    Android IPC机制详解
    系统程序员成长计划文本处理(一)状态机(1)
  • 原文地址:https://www.cnblogs.com/Ming8006/p/12467175.html
Copyright © 2011-2022 走看看