前言
软件测试是软件工程中的一个重要环节,是开发项目的一部分。软件测试作为一种能够保证软件质量的有效手段,重要程度不言而喻。随着软件复杂程度的增加、规模的增大,软件测试也面临着更大的压力和挑战。如何提高测试执行的效率也成为测试团队关注的重中之重。
测试分发是一种现代的测试并行方法,通过使用现有的测试套件并将其分布在远程代理上,以更快地在本地和CI上执行,从而大大加快了测试执行的时间。Gradle企业级解决方案测试分发Test Distribution ( TD ) 可同时扩展支持Gradle和Maven构建工具。一起来看看Gradle 测试分发的功能是如何帮助测试团队提升效率的。
测试分发 Test Distribution http://www.gradle.com.cn/gradle-enterprise-solutions/test-distribution/
测试时间是构建时间的关键因素之一。影响测试时间的因素有很多,主要来自以下三个方面:
· 越来越多的集成和功能测试
为了保证覆盖率,开发者往往需要编写大量的测试代码来验证其代码的可用性,随着测试的密度增加,就会使单元测试和集成测试越来越多。
· 串行运行测试
如果是串行执行测试,如果每个测试平均需要2秒,想象一下数千个测试会是多长时间...
· 对外部服务的依赖
某些测试可能需要连接数据库,或者多个中间件以及跨网络的请求才能完成,这无疑会花费大量时间。如果是串行执行,必定会阻塞后续测试的运行。
时间就是金钱,任何能够节省时间的事情都是值得去尝试的,但是构建加速不仅仅是节省时间,当构建速度提高,开发者就能及时发现问题,并快速修改,开发者就有更多的时间和注意力集中在代码上,而不是等待。毕竟对于开发者,心流是至关重要的。减少内耗,提高效率。所以,我们需要一些方法来加速构建:
Java开发中最常用的编译构建工具就是Gradle和Maven,这两种构建(Maven > 3.0)都具有并行运行测试的能力。
我们分别在Gradle和Maven上进行了并行测试:
· Gradle
· Maven
本地开启多线程确实会明显提高测试的执行效率,但是本地的机器性能毕竟有限,开启多线程后,可能会导致电脑做不了任何其他事情。
如果可以把本地的测试任务交给远程服务器去运行,则既可以多线程运行,也可以节省本地的性能资源。
· 配置TD资源池
既然要让把测试任务交给TD,那TD就需要有若干个Agent去分配任务。
我尝试这里配置了一个最大20个Agent的资源池。
如果要充分利用这里的资源池,那么Agent就需要自动伸缩的能力,在不需要运行的时候自动退出,按需启动Agent,这里使用K8s的自动伸缩能力来做到这一点。
接下来我们再看一下开启远程后Gradle和Maven分别运行的结果。
· Gradle(3m30s→29s)
接入远程后的构建时间从并行后的55s降低到了29s,又缩短了大概一半时间。
· Maven(1m46s→24s)
开启远程后,时间同样节省了一半
点击Gradle Enterprise日志中的链接即可快速查看构建扫描结果
总 结
本地单机并行运行可能会得到显著的加速效果,但会受限于并行的数量,并将取决于机器的 CPU 和内存资源:
● 消耗大量本地开发人员的机器资源,个人电脑可能无法继续其他事情。
● 公司投资购买昂贵、功能强大的机器来运行 CI Agent并缩短测试执行时间,导致机器容量大量未充分利用。一旦 CI 构建开始,CI 机器资源就完全专用于 CI 构建,而不能用于其他作业。
● 由于本地单机并行可能要求在多个本地 JVM 中运行测试以避免相互干扰,因此通常会导致资源共享冲突。它们共享相同的文件系统和相同的“进程空间”,因此从测试开始的服务器需要使用不同的端口。
测试分发 Test Distribution ( TD )的优势在于:
● TD 可用于所有本地和 CI 构建,无论在何处调用(例如,本地命令行、IDE)。
● 由于测试以分布式和透明的方式自动运行,而不是在本地运行,因此开发人员的工作流程没有任何变化。
● 由于运行测试的先决条件构建步骤只运行一次,因此资源消耗大大减少。
● 由于有效的细粒度分布允许每个代理顺序执行测试,可靠性提高了。
● TD 历史和动态调度服务可用于在测试Agent之间适当且弹性地平衡测试执行负载,并优化测试执行时间和计算资源消耗。
● 为了最大限度地利用可用资源,如果没有可用的远程测试Agent或可选的本地/远程混合执行模式,TD 支持本地测试执行回退。
- 了解更多:
Test Distribution http://www.gradle.com.cn/gradle-enterprise-solutions/test-distribution/