在JUnit中,如何获得所有集成测试的列表?

时间:2013-06-27 21:58:47

标签: java maven junit integration-testing junit4

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 使用数据库序列,而不是手动设置ID。
  2. 实现一个线程安全的计数器并将其用作ROW_ID(参见下面的示例);
  3. 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;
    }
    

答案 1 :(得分:1)

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