2017-02-24 108 views
2

我正在处理大量遗留代码。有一个JUnit-TestSuite开始。使用gradle运行所有测试时,失败。在IntelliJ中运行测试时,他们工作。我们配置了gradle以使用测试套件。JUnit测试互相影响

现在有人报告了当地没有gradle的测试,但没有使用gradle。现在是我们解决这个混乱的时候了。

是否有智能的方法来确定哪些测试会在后面留下某些配置或者哪些测试依赖于其他测试?

+1

可能是它的执行顺序,我认为IDE和JUnit一般不保证订单或执行。而且,如果存在不可变的静态变量可能会导致一些问题。 - 赞同基于意见的评论。 – cesaregb

+1

我不知道一个简单的方法...我会用'@ BeforeClass'来寻找测试。测试失败也会明显地指向你犯错的课程。我会把这个错误修正称为错误修复,如果有一种自动修复错误的方法,我们都会失去工作。如果您可以获得代码覆盖率报告,则可能会指出发生故障的确切位置。 –

+0

谢谢,@cesaregb,我会寻找静态变量! –

回答

3

从一次测试到另一次测试的“流血”最可能的原因是可变静态值。默认情况下,所有测试都由同一个JVM运行,因此一个测试“变异”的静态变量将在另一个测试中变得“脏”。

可变静力学是邪恶的!我正在研究一个目前各地都有可变静态代码的代码库,这是一团糟。如果可能的话,你应该重构使用依赖注入和存储可变状态的实例,而不是静态。

作为一种解决方法,要使测试运行在gradle中,您可以使用Test.forkEvery为每个测试使用一个单独的JVM,因此每个测试调用的静态变量都将是“干净的”。例如

test { 
    forkEvery = 1 
} 
+0

谢谢!我会寻找可变的静态值。我们有一个设置类,所以我有强烈的怀疑,那里可能有东西。我从来没有用过依赖注入,我必须研究一下。我不需要gradle技巧(尽管它非常酷),因为gradle现在使用测试套件成功运行。 –

+1

每一个改变'Settings'静态的测试都应该在'@ After'或'@ AfterClass'方法中调用'Settings.reset()'。有时,如果你不能追踪顽皮的测试,也可以在'@ Before'或'@ BeforeClass'中放置'Settings.reset()''' –