我们的功能测试套件很慢

我已经继承了使用Selenium 2(Webdriver)和Junit的功能测试套件。我们为Java Web应用程序编写了大约500个测试。运行完整套件需要花费几个小时,因此我们仅在CI服务器上将其运行一整夜。我想通过并行运行测试来加快测试套件的速度,我研究了各种并行执行解决方案,包括使用Selenium Grid。

我们当前如何处理数据

我们的测试套件当前在每个测试类之间删除和还原数据库,我们这样做是为了了解状态并避免测试之间的数据冲突。但是,如果我们要并行运行多个测试,那么除非在多个测试之间进行协调,否则数据库可能会导致错误(我不想在执行另一个测试的同时删除数据库)。 >
一些可能的解决方案:

以下是一些想法:


创建测试组(例如:可以同时运行的测试与必须同时运行的测试按顺序运行)
让每个测试删除它创建的数据(并非总是可能)
使用不同的用户运行每个测试以最大程度地减少数据冲突(创建500个用户非常耗时)
部署多个我们的Web应用程序实例,每个实例都有其自己的数据库(每个测试都必须知道其在哪个实例上运行并删除正确的数据库)


编辑:这些人接触到此问题http ://youtu.be/oX-0Mt5zju0?t = 9m10s

#1 楼

您的清单很不错,涵盖了所有通常的基础。

另一种可能性:


围绕单个数据段实施某种“关键区域”机制在测试之间共享,并且不同的测试要求具有不同的值。

当然会产生自己的问题。它导致一个测试阻塞,而等待另一个测试完成数据。如果测试将数据保留足够长的时间,则其他测试可能会在等待时超时(如果您的测试超时,或者您正在诸如Sauce Labs之类的某些服务上运行,可能会中止空闲的浏览器会话)。

因此,仅在数据冲突很少且持续时间短的情况下使用此技巧。

较长的运行时也可能会受益于另一个想法:仅将UI用于测试的那些部分需要用户界面。在UI上跳到一些更快的机制来进行设置和拆卸,甚至可以进行断言(如果您不断言关于如何通过UI显示信息的事)。

#2 楼

在性能测试期间,我曾遇到过这种情况。每当任何正在运行的线程拾取数据时,该行的标志将设置为1。下一个线程将在标志等于零的位置查找数据。这样,为执行测试而拾取的数据始终是未使用的输入数据。