持续集成是一种软件开发实践,即团队成员经常集成自己的工作。通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编辑、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队通过实践发现这个过程可以大大减少集成时的问题,让团队能够更快的开发内聚的软件。
越早发现的错误,修正的费用越低。及时检查软件的健康状况,减少发布时的风险。
通过持续集成可以将编译、部署、测试等动作都变成自动化的,无需太多人工干预。
利用持续集成,可以经常对源代码进行一些小改动,并将这些改动和其他的代码进行集成。如果出现问题,项目成员马上就会被通知去修复。
由于业务的特殊性,迭代速度比较快。如何使每个服务都能够快速部署测试上线,给测试和研发工程师带来了很大的挑战。我们引入了持续集成的概念,并开始逐步实施
持续集成帮京东到家主要解决了三个问题:
1、提测质量差。开发周期被压缩,代码质量一定不高。
2、测试周期长。一旦代码质量变差,测试投入的成本就会很高。
3、重复性的工作多。
代码提交到 GIT,代码静态扫描 JOB 会先运行,然后单元测试和代码覆盖率 JOB 会运行,之后编译打包,部署到对应的服务器上。
后续 UI、JSF 和 APP 自动化测试运行,测试人员分析并修复失败的 CASE。如果有需要再做功能测试,收集功能测试代码覆盖率。
目前对代码静态扫描,我们要求修复阻塞和重要级别的 BUG。所有系统都做到自动编译、打包和部署。自动化测试要不断添加测试用例,并及时查看覆盖率报告。
第一阶段:需要手动编译、打包、部署。解决方案就是引入 JENKINS 自动编译打包部署。
第二阶段:服务器硬盘打满了,一台机器上部署的服务太多,导致服务挂掉。我们做的就是定时清理硬盘空间,监控服务状态,自动重启服务,保证服务可用。
第三阶段:主要问题是分布式服务之间调不通。因为开发人员在本地调试时,随意修改配置文件导致服务之间调用组名不对。
我们部署了两套测试环境,一套对外提供服务,供他人测试调用,一套自己使用。保存本地配置,与线上配置比对,防止误改。使用自动化测试,检查整个系统的健康状况,及时修复。
代码质量管理系统
1、 配置 SONAR 环境。
2、 配置 JENKINS 环境,下载 SONARQUBE 插件,并进行配置。
3、 在 JENKINS 代码静态扫描的 JOB 后,配置运行 SONAR。
1、 配置 POM.XML 文件
- sed - i 's%</plugins>%
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>sonar-maven-plugin</artifactId>
- <version>1.0</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.9</version>
- <configuration>
- <skip>false</skip>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.7.4.201502262128</version>
- <executions>
- <execution>
- <id>default-prepare-agent</id>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- </execution>
- <execution>
- <id>default-report</id>
- <phase>prepare-package</phase>
- <goals>
- <goal>report</goal>
- </goals>
- </execution>
- <execution>
- <id>default-check</id>
- <goals>
- <goal>check</goal>
- </goals>
- <configuration>
- <rules>
- <!-- implementation is needed only for Maven 2 -->
- <rule implementation="org.jacoco.maven.RuleConfiguration">
- <element>BUNDLE</element>
- <limits>
- <!-- implementation is needed only for Maven 2 -->
- <limit implementation="org.jacoco.report.check.Limit">
- <counter>COMPLEXITY</counter>
- <value>COVEREDRATIO</value>
- <minimum>0.00</minimum>
- </limit>
- </limits>
- </rule>
- </rules>
- </configuration>
- </execution>
- </executions>
- </plugin>
- %'pom.xml
2、 JENKINS 运行 MVN CLEAN INSTALL 命令,生成代码覆盖率报告。
1、 启动脚本中插入监听参数。
2、 DUMP 出监听文件。
3、 使用 ANT 脚本生成最终的 html。
4、 配置到 JENKINS 的持续集成环境。
UI 自动化测试集成到 JENKINS:SELENIUM+TESTNG+JENKINS
1、 配置 MAVEN POM.XML 文件
2、 配置 JENKINS JOB
HTTP 接口自动化测试:JENKINS+ANT+JENKINS
- <?xml version="1.0" encoding="UTF-8" ?>
- <project name="ant-jmeter-test" default="all" basedir=".">
- <tstamp>
- <format property="time" pattern="yyyyMMddhhmmss" />
- </tstamp>
- <!-- 需要改成自己本地的 Jmeter 目录-->
- <property name="jmeter.home" value="D:\program\apache-jmeter-2.13" />
- <!-- jmeter生成jtl格式的结果报告的路径-->
- <property name="jmeter.result.jtl.dir" value="results" />
- <!-- jmeter生成html格式的结果报告的路径-->
- <property name="jmeter.result.html.dir" value="results" />
- <!-- 生成的报告的前缀-->
- <property name="ReportName" value="maincase" />
- <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${time}-${ReportName}.jtl"
- />
- <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${time}-${ReportName}.html"
- />
- <property name="jmeter.result.index" value="${jmeter.result.html.dir}/index.html"
- />
- <target name="all">
- <antcall target="clean" />
- <antcall target="test" />
- <antcall target="report" />
- </target>
- <target name="clean">
- <delete>
- <fileset dir="${jmeter.result.jtl.dir}" includes="*.jtl" />
- </delete>
- <!-- <mkdir dir="copydir"/>
- <move todir="copydir">
- <fileset dir="${jmeter.result.jtl.dir}">
- <include name="*.jtl" />
- </fileset>
- </move>
- -->
- </target>
- <target name="test">
- <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"
- />
- <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
- <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
- <testplans dir="jmeter" includes="*.jmx" />
- </jmeter>
- </target>
- <target name="report">
- <xslt in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"
- />
- <delete file="${jmeter.result.index}" />
- <copy tofile="${jmeter.result.index}" file="${jmeter.result.htmlName}"
- />
- <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
- <copy todir="${jmeter.result.html.dir}">
- <fileset dir="${jmeter.home}/extras">
- <include name="collapse.png" />
- <include name="expand.png" />
- </fileset>
- </copy>
- </target>
- </project>
选择 APPIUM 是因为它支持 ANDROID 和 IOS 系统,支持现有框架和多种语言,而且可以跨应用。最重要的是 APPIUM 不依赖于源代码。
APP 自动化测试在持续集成中也遇到了一些问题:
1、 针对网络不稳定失败率高,我们引入了重试监听机制,如果重试 3 次还不能通过,我们就认为这条 CASE 是有问题的。
2、 定位 CASE 失败原因比较空难,我们加入了截图和日志功能,多打日志加截图,就能比较容易的发现导致 CASE 失败的原因。
3、 运行速度慢,ANDROID 可以启动多个服务,分布运行。
来源: http://www.tuicool.com/articles/eUBrMnI