2012-03-13 51 views
2

我有一套传统的单元测试,其中大部分都是Spring AbstractTransactionalJUnit4SpringContextTests测试,但有一些管理自己的事务。不幸的是,这似乎引入了副作用,导致完全不相关的测试在修改测试数据集时失败,即失败的测试在独立运行时(使用相同的初始数据集)工作,但在运行时失败部分完整的测试。自动确定Junit测试副作用

测试通常在Maven的常规Maven构建过程中通过Maven的surefire插件运行。

我正在寻找的是一种自动化的方式来排列执行测试的数量和顺序来找出罪魁祸首。一种天真而又相当昂贵的方法,将采用所有测试的能力集并运行所有可能的组合。更优化的方法将使用现有的测试执行顺序(主要是随机的但稳定的)并测试所有潜在的有序子集。我知道这个过程的运行时间可能很长。

是否有任何工具/ Maven插件可以做到这一点开箱即用?

+0

不是您的问题的答案,而是依赖于Spring管理的事务和回滚(在您的情况下失败),请考虑在每次测试之前重新创建整个数据库。看看我的[文章](http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html)。 – 2012-03-13 11:56:58

+0

Tomasz Nurkiewicz:从头开始,我会这样做。不幸的是,加载所有需要的数据需要大约20秒,这就排除了这种方法(我知道单元测试不应该依赖太多的数据,但是在使用遗留代码时,必须使用这些数据)。 – 2012-03-13 12:01:03

回答

1

我不知道一个工具,特别是你想什么呢,但你可以与runOrder parameter in maven surefire玩一下。从这个页面:

定义的测试将在运行该命令支持的值 “字母”,“reversealphabetical”,“随机”,“小时工” (就连小时按字母顺序排列,扭转在奇数字母。小时), “failedfirst”,“balanced”和“filesystem”。

奇数/偶数每小时 确定在扫描类路径时,这意味着它可能会在多模块构建过程中发生更改 。

所以,你可以做一个简单的按字母顺序排列的runOrder,并采取第一次失败,并从那里开始。至少你有一个可预测的运行顺序。然后,你可以逐一运行(使用-D包含)每个测试,然后在失败的测试之前检测哪个测试失败。

然后重复所有失败测试的整个过程。你可以在一夜之间循环运行这个东西。

0

你可以简单地修改测试,每次都使用干净的数据库副本吗? DBUnit是一个很好的工具。

http://www.dbunit.org/

+0

不幸的是,没有。加载数据需要大约20秒,对于大约700次测试来说成本太高...... – 2012-03-13 12:02:25

+0

够公平 - 您只能加载特定测试所需的数据,但我认为分析需要您只要你提出的方式,所以没有收益。 – TrueDub 2012-03-13 13:43:58