2

我的集成测试按顺序运行,但我想并行化它们。问题是,它们都设置和拆除相同的数据库行,所以如果它们并行运行,当另一个测试清理时,它们的数据会在它们中间消失。

我计划通过使每个测试设置并拆除每个测试的唯一行来改变这一点,这样它们就不会相互干扰。我已经通过将每个测试的 id 转换为同名的常量来开始这个过程,比如ROW_ID. 但是我们有很多测试,很容易错过其中一个,我也不希望人们ROW_ID将来添加重复的值,所以我认为编写一个测试可能是个好主意我的测试。

以下是我想象的工作方式:迭代所有 IntegrationTest 类,使用反射来获取其ROW_ID字段的值,将其放入数据结构中,然后检查重复项。我的问题是我不知道如何迭代所有的 IntegrationTest 类。它们都有一个共同的命名模式“*IntegrationTest”。有人可以帮我完成这一步吗?

如果有更好的方法来完成我正在尝试做的事情,请务必将其作为答案给我。

4

2 回答 2

2

关于唯一行 ID 问题,您有很多不同的选择:

  1. 使用数据库序列而不是手动设置您的 ID。
  2. 实现一个线程安全计数器并将其用作您的 ROW_ID(参见下面的示例);

.

public class SequenceNumberGenerator {  

    private static AtomicInteger counter = new AtomicInteger();  

    public static int nextVal() {  
        return counter.incrementAndGet();
    }    
}  

我也不会在每个测试类中创建一个常量 ROW_ID(以避免重复)。相反,我认为您可以在超类上定义它(所有集成测试都将对其进行扩展),在测试执行之前设置它的值并简单地为其提供一个 getter 访问器。像这样的东西:

//superclass
private int rowId;

@Before
public void generateRowId() {
    rowId = SequenceNumberGenerator.nextVal();
}

protected int getRowId() {
    return rowId;
}
于 2013-06-28T06:31:05.913 回答
1

您可以使用 JUnit 类别。阅读这个网页,也许还有这个。还有其他框架允许更好的过滤(通过包/包括子包/包括以 x/etc 开头的那些),但我不记得它的名称......但是,我认为你需要的是简单的@Categories。

于 2013-06-27T22:09:59.307 回答