在集成测试环境中, 根据历史测试结果自动进行测试分配

在我目前和以前的项目中,都遇到了测试运行时间太长,需要把测试分配到多台机器上并行运行的问题。有一些项目在手工的进行测试分配,而本文将介绍如何自动的进行测试分配,从而减少花在这些琐事上的时间。

最开始的问题是什么

随着项目的不断进行,测试会越来越多,而跑一次测试的时间也越来越长,尤其是如果界面测试多的话,那么测试运行时间很容易比较长。以我目前所在的项目为例,基于浏览器的界面测试(以下称为Functional Test)如果单机跑的话大约要80分钟。这样开发人员提交一次代码需要很长时间才能从CI Server上得到结果,而CI反馈周期过长会很大的降低开发人员对CI的关注度,即使仍然关注也会因为不断的切换上下文而降低工作效率。

初始的解决方案

开始时大家会用各种简单的办法来解决这个问题,比如通过tag或annotation(不同的测试框架有不同的概念)手工的把测试分成几部分,然后增加Build agent的数量,让每个Build agent 只跑一部分测试,理想的结果是每个Build agent的测试时间一样长,这样运行测试的时间在理想情况下就是:总的测试时间 / Build agent的数量

但这样同时也带来了新的问题:当增加测试时,设置或修改哪个测试在哪台机器上跑的工作是很琐碎的,我们需要经常关注每个Build agent当前的运行时间是多少, 新的测试加到哪个上面比较合适。我在工作中就经常听到有人说,现在测试太慢了,我们再加一个Build agent, 然后分点测试过去吧。简单重复劳动做的多了,就说明需要关注一下,看看有没有好的办法来解决。 Continue reading “在集成测试环境中, 根据历史测试结果自动进行测试分配”

Using multi-configuration project for distributed builds on Jenkins

Sometimes we need to run tests on different machines because of kinds of reasons:

  1. run tests on different environment, e.g. run tests against different OS, DB
  2. distributed test in order to get fast feedback, e.g. split tests into n parts, and only run one part on one machine

The following is a real screenshot of Jenkins in one of my projects, we created several jobs for the same functional tests, and the only difference between them is what test tag(s) need to run on this job.

The Problem

The settings for each job are almost same: Continue reading “Using multi-configuration project for distributed builds on Jenkins”