持续集成:从六个层次加速测试执行

在持续集成领域,一个产品的发布往往都有自己的过程周期(lifecycle),大体都会划分为:构建->部署->测试->发布等几个重要阶段,其中测试是发布产品前不可或缺的重要阶段,是产品质量的保证。而能让持续集成奏效,除了要求测试脚本更充分健壮,还要求测试脚本运行得更快更好。这点对于小型项目而言可能显得无关紧要,毕竟大多小项目的测试脚本不过百条,验证点不过千“点”;但对于一个大型项目而言,测试代码源文件可能成百上千,执行完所有的测试可能要等很久,而苦等之后的结果却可能是满眼的failure, 于是如果提高测试执行速度成为迫切需要解决的问题,试想把测试阶段从2小时压缩到1小时,再从1小时压缩到30分钟,每次时间压缩带来的不仅是技术人员本身的成就感,更是对整个产品发布过程体验的改善。

那么如何加速测试的执行呢?提起速度,我们立马可能联想到“性能”调优的步骤:先进行tuning,然后找到问题的瓶颈所在,最后逐个击破。本文暂不讨论如何进行这些步骤, 而是基于C++和Java为语言案例,TestNG和Google test为测试框架,Jenkins为持续平台做分析,从以下六个层次提出提高测试执行的一般方法:

硬件资源层次

工欲善其事必先利其器,提高硬件(CPU、内存、磁盘等)配置是改善执行速度的“硬”方法,硬件资源的优化不应仅仅局限在单机自身的各项指标提升,在需求不断提高的情况下,可以考虑实施虚拟机、分布式集群等方式来进一步获取更优的硬件资源,当然,涉及分布式执行时,可以借助以下持续集成平台层次的“软”实施来共同作用。

另外,在硬件资源紧张的情况下,不同项目或者不同团队可能不得不复用一套测试环境,造成可利用资源更为紧张,此时可以错开时间测试(例如A项目组测试定时在凌晨0点启动,B项目组定时在凌晨2点)以提高速度。

语言编码实现层次

测试代码本身也是代码,显而易见,如果代码编写时注重效率,速度上肯定有所收益。这点可能需要“纠结”于一些日常的编码细节:例如Java中Stringbuffer和Stringbuilder的比较;C++中是i++和++i的比较。这种语言层次提高效率的文章书籍很多,这里不做过多描述。在语言编码层次上最重要的不是这些语言细节,而是避免一些消费时间的测试代码设计,减少不必要的耗时操作,例如以下几点:

(1) 冗余的日志信息,不合理的日志级别设置等

输出日志带来的磁盘频繁访问必然让速度下降,所以在保证日志信息充足的前提下,尽量减少日志,或者只记录失败测试的日志(毕竟对于测试者而言很少去关注成功日志),可以让测试加快。

(2) 不合理的等待

用户执行完某个操作,必须等待某条件的发生(例如DB里面插入一条新数据)进而执行后续动作是测试中经常面对的场景,那么等待多久成为需要考虑的问题,假设用TimeUnit.MINUTES.sleep(1)等待一分钟,在10秒即可满足条件的场景下浪费的就是50秒,所以这里必须去考虑合理sleep的时间来兼顾对资源的消耗和运行速度的影响,同时在等待方式上也可以考虑是采用循环短时间条件等待或异步通知的方式去进行。

(3) 用例的过程

先执行完所有测试步骤,然后做对所有步骤做一次性校验,还是做完一步校验一步,这两种方式的速度在不同场景下有所不同,所以需要权衡;相类似的,对于需要获取DB连接的用例,是每条都执行获取DB连接然后释放连接,还是所有用例执行之前获取连接,所有case执行完之后释放连接也会对执行速度有所影响。

构建测试脚本层次

对于一个大型项目,源文件的数目庞大或依赖的dependency过多导致代码编译占用大量时间,如何提高编译代码的速度?除了使用更好的磁盘,注重代码编写时对编译速度的影响,还可以针对不同的语言采取不同的有效策略,例如针对C++, 使用make命令编译项目时,可以加上参数-j来并行编译项目。-j参数的含义可以参考下文:

-j [jobs], --jobs[=jobs]

指定同步运行的作业(命令)的数量。如果有一个以上-j选项,那么只有最后一个有效。如果-j选项没有参数,那么编译过程就不会限制能够同步运行的作业的数量。

需要说明的是,编译过程可能要求特定的顺序而导致并行编译失败,如果遇到这种问题,可以先并行、后串行(去掉-j)重复执行一次以解决。

而对于java,Maven 3 开始支持并发build,提供了以下几种常见方式:

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

同时使用maven管理java项目常出现时间消耗在依赖jar的下载上,此时可以检查是否有冗余失效的repository配置、较长的下载timeout时间设置、所选择repository的连接速度等,甚至在不同测试环境下可以使用 profile来管理repository来加速测试脚本构建。

测试框架支持层次

在测试框架支持层次上,应该充分运用框架本身提高的丰富功能来提高测试执行速度,以Java测试框架TestNG为例:

(1) 利用timeout控制失效等待

如果某个测试用例等待某条件的触发而陷入长时间等待,等待的时间过长往往对于用例本身而言已失效,特别是当条件永远无法满足时。因此需要控制用例执行允许的最大timeout时间。TestNG可以给test或者test suite设置 timeout时间,分别控制具体某个或一组(testing.xml配置)自动化测试用例执行的最大允许时间:

1. @Test(timeout = 1000)
2. testng.xml : <suite name="Module Test" parallel="none" time-out="200000">

(2) 利用@BeforeTest、@BeforeClass等条件注解,减少无意义测试

测试的顺利完成都需要满足很多基础条件,例如需要测试环境就绪, 如果不使用@before类标签,则当条件不具备时,仍然会执行完所有的用例,必然带来巨大的时间浪费,因此使用@before类标签可以避免无意义的测试,@before标记的方法一旦失败,后续的相应的测试不会继续进行。

(3) 使用框架自带的多线程支持

例如对于TestNG自身,可以在testng.xml中设置parallel参数来指定是否并发以及并发的级别:methods|tests|classes,除了测试框架自身外,软件项目管理工具也可以提供多线程支持,例如maven的测试组件maven-surefire-plugin,提供了并发参数的设置:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编译
, 测试
, 编译速度
, maven deploy 失败
, jenkins
, java编译加速技术
, 层次
, 时间
, 速度
, 持续集成
, maven surefire
, mvn test
, surefire
执行速度
,以便于您获取更多的相关知识。

时间: 2024-08-04 06:14:57

持续集成:从六个层次加速测试执行的相关文章

持续集成---减少持续集成的时间

在持续集成领域,一个产品的发布往往都有自己的过程周期(lifecycle),大体都会划分为:构建->部署->测试->发布等几个重要阶段,其中测试是发布产品前不可或缺的重要阶段,是产品质量的保证.而能让持续集成奏效,除了要求测试脚本更充分健壮,还要求测试脚本运行得更快更好.这点对于小型项目而言可能显得无关紧要,毕竟大多小项目的测试脚本不过百条,验证点不过千"点":但对于一个大型项目而言,测试代码源文件可能成百上千,执行完所有的测试可能要等很久,而苦等之后的结果却可能是满

通过Docker容器运行持续集成/持续部署

本文讲的是通过Docker容器运行持续集成/持续部署,[编者的话] 对于Docker主流的应用场景:持续集成和持续部署(CI/CD)大家也许并不陌生.这篇文章从独特的视角阐述了如何利用各种云平台构建属于自己的CI/CD容器,笔者还自己扩展了Gitlab CI引擎,对CI感兴趣的同学对这个文章应该很感兴趣. 我曾经使用Docker了一段时间,在过去的一年里伴随着众多的Docker容器涌入,帮助用户们更容易的部署Docker容器到生产环境中.一些工具是第三方公司提供,当然也包括Docker公司自己的

初创公司应该如何做好持续集成和部署?

作者介绍 裴双才,Geekwolf,现MAKA运维负责人,博客: http://www.simlinux.com.<FastDFS分布式存储实战>作者,<Ansible中文手册>译者.RHCA/RHCVA,混迹各种开源社区,专注高效运维.DevOps.性能优化.Docker.MySQL等方向,热衷技术分享,欢迎一起讨论技术,互相学习,共同进步. 前言 持续集成和部署是每一个互联网开发团队都必须要面对的问题,特别是在初创公司,由于业务和技术团队快速增长,技术积累较弱,所以一个高效的,

直播|阿里巴巴持续集成持续交付之分层自动化

很多人对阿里测试工作很好奇,尤其是对自动化测试工作充满疑问.比如为什么做自动化?为什么做了自动化没有效果,性价比很低?阿里巴巴旗下一站式研发提效平台--云效,一半的需求不需要人工测试,研发测试比可以达到8:1,甚至更高,这是怎么做到的?面对这些问题,云效将于11月24日(本周四)16:00邀请阿里巴巴B2B事业群高级产品经理金桐,为大家带来<阿里巴巴持续集成持续交付之分层自动化>在线直播分享,为企业提供分层自动化实施解决方案. 直播时间:2016-11-24(本周四) 16:00  直播嘉宾:

持续集成工具之Hudson

一.什么是持续集成 持续集成的核心概念 CI 过程会经常构建软件组件:在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时,都要构建软件组件.CI 的好处是:经常构建软件可以确保尽早遇到问题(比如代码缺陷),避免问题在软件开发周期晚期变复杂时才被发现. 工具与过程 尽管 CI 实际上是一个过程,但是持续集成 这个词常常与一个或多个工具相关联.在本教程中,讲解如何安装.配置和使用 Hudson 作为 CI 服务器,但是要记住,CI 远不只是个工具.

持续集成 .Net手册

持续集成 .Net手册一.概念Martin Fowler的文章:Continuous Integration 中文翻译:持续集成 二.工具传统工具:VisualStudio.Net,VisualSourceSafe,Rational ClearCase 自动编译工具:NAnt,NAntContrib 回归测试工具:NUnit 代码检查工具:FxCop 持续集成工具:CruiseControl.Net 三.步骤CruiseControl.Net监控远程版本控制系统的变化 变化发生时CruiseCo

持续集成 Java手册

持续集成 Java手册一.概念Martin Fowler的文章:Continuous Integration 中文翻译:持续集成 二.工具传统工具:VisualStudio.Net,VisualSourceSafe,Rational ClearCase 自动编译工具:Ant 回归测试工具:JUnit 代码检查工具:CheckStyle 持续集成工具:CruiseControl 三.步骤CruiseControl监控远程版本控制系统的变化 变化发生时CruiseControl调用编译工具进行编译(

另一个关于持续集成和版本分支的故事

经典书籍<持续交付>[1]的作者曾就分支合并和代码演化等问题详细地讨论 过滥用分支对持续集成的负面影响.而我今天要说的是这样一个故事,一个只能 申请到非常有限的硬件设备的团队,他们是如何在多分支策略下实践持续集成的 . 一个团队接手了一个项目,需要在开发新特性的同时维护几个发布分支.团队 计划实践持续集成,但手头的硬件资源严重不足,无法满足所有分支的部署流水 线同时运转. 流水线分为三个阶段,分别是: commit 编译.单元测试和部分集成测试并打包 at 部署应用程序并运行自动化验收测试 u

通过持续集成尽早发现缺陷

持续集成(Continuous Integration,CI)是持续地编译.测试.检查和部署 源代码的过程.在许多持续集成环境中,这意味着每当源代码管理库中的代码发 生改变时,都要执行新的构建.CI 的好处很明确:经常组装软件可以大大提高在 早期发现缺陷的可能性,而缺陷在早期还不复杂,容易解决.本教程是 追求代码 质量 系列的配套文章.在本教程中,Andrew Glover 介绍持续集成的基本方面, 并讲解如何用最好的开放源码技术设置 CI 过程. 开始之前 了解本教程讨论的内容以及如何从本教程