持续集成概念持续集成是一种软件开发实践,即团队成员经常集成自己的工作。通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编辑、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队通过实践发现这个过程可以大大减少集成时的问题,让团队能够更快的开发内聚的软件。 持续集成的价值1、 减少风险:越早发现的错误,修正的费用越低。及时检查软件的健康状况,减少发布时的风险。 2、 减少重复性的工作:通过持续集成可以将编译、部署、测试等动作都变成自动化的,无需太多人工干预。 3、 任何时间、任何地点都可以部署软件利用持续集成,可以经常对源代码进行一些小改动,并将这些改动和其他的代码进行集成。如果出现问题,项目成员马上就会被通知去修复。 持续集成对到家的意义由于业务的特殊性,迭代速度比较快。如何使每个服务都能够快速部署测试上线,给测试和研发工程师带来了很大的挑战。我们引入了持续集成的概念,并开始逐步实施 持续集成帮京东到家主要解决了三个问题: 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>
APP自动化测试 选择APPIUM是因为它支持ANDROID和IOS系统,支持现有框架和多种语言,而且可以跨应用。最重要的是APPIUM不依赖于源代码。 APP自动化测试在持续集成中也遇到了一些问题: 1、 针对网络不稳定失败率高,我们引入了重试监听机制,如果重试3次还不能通过,我们就认为这条CASE是有问题的。 2、 定位CASE失败原因比较难,我们加入了截图和日志功能,多打日志加截图,就能比较容易的发现导致CASE失败的原因。 3、 运行速度慢,ANDROID可以启动多个服务,分布运行。 后续计划不断提高自动化覆盖率,减少重复性的工作 集成压力回归测试,保证上线的性能 提供更多的测试工具,方便和提高测试效率
|