并行运行junit测试时的竞争条件

时间:2016-10-11 17:30:12

标签: java spring multithreading maven junit

我想知道如果我并行运行测试并且两个测试(下面)共享实例变量会有一些竞争条件吗?所以我的测试类运行SpringJunit4ClassRunner,我有2个测试方法a()和b(),变量state将被修改或重新分配每个测试,而doSomethingWithState()将使用变量{{1并将其传递给测试方法。我知道maven-surefire-plugin你可以在方法级别运行它,a()和b()都将被分配给一个线程并并行运行。

state

2 个答案:

答案 0 :(得分:2)

我想唯一合理的答案是:取决于 ...在您的确切上下文和代码库中。

如果竞争条件是:你有多个线程操纵("写")共享数据。你冗长的问题归结为这样的设置。因此,您在上述设置中的竞争条件存在高潜力

然后:如果您正在谈论生产代码中的方法或某些测试框架调用的方法,那么它并没有任何区别。因为竞争条件并不关心。他们只关心"关于多个线程写入共享数据。

这就是重要的事情!

答案 1 :(得分:0)

你必须考虑两件事:

  • 如果需要使用实例变量,则在加载前对它们进行实例化(Junit4提供@Before,@ After注释,以及@BeforeClass和@AfterClass用于静态变量)。

  • Junit不保证每次都会以相同的顺序运行测试用例,因此每个测试必须与其他测试分开编码。

另一个显而易见的观点是,你不能根据其他人的结果来考虑测试。在模拟集成测试的东西时考虑到这一点,也许测试将开始随机失败,你不会知道原因。