更好或自定义JUnit测试过滤

时间:2012-03-16 12:47:52

标签: java eclipse junit

我想实现一个更好的系统来过滤测试,以便在Eclipse中的JUnit下运行。我想要@Categories,但不必在@SuiteClasses({})注释中指定类列表,因为我认为这会降低价值,增加我们必须做的手动维护量。

有没有办法挂钩Eclipse运行JUnit测试的进程,能够对所有带有@Test的类进行自定义过滤?例如。像这样的一个类:

    @CustomFilteredTesting 
    public class TheCustomFilteredTestRun {
        public boolean includeThisTestClass(Class<?> klass) {
            // e.g. test whether klass is in a package or subsystem 
            // or a subtype of some interface. 
        } 
    }

任何帮助表示赞赏,-j

3 个答案:

答案 0 :(得分:5)

Eclipse使用默认的JUnit代码来运行测试,因此您只需要教授JUnit您的新技巧,Eclipse就能够这样做。

这样做:如何在没有@SuiteClasses的情况下将测试拆分成套件?

坚韧。根据我的经验,有几种解决方案:

  1. 编写一个读取所有套件并尝试查找所有测试的测试,然后确保每个测试都在一个套件中。当您忘记向套件添加新测试时,此测试将通知您。

    很好:没有涉及JUnit魔法,如果你忘了某些东西会保证你的安全(比如在新的测试中添加@Category)。

    缺点:需要相当丑陋的文件阅读/代码解析/反射魔力。

  2. 您可以通过扩展BlockJUnit4ClassRunner来编写自己的测试运行器。这样您就可以添加自己的自定义注释来对测试进行分类并运行它们。

  3. 添加假设。 org.junit.Assume是一个很好的小野兽,可以默默地通过测试。测试将不会运行(或者它将在第一个假设失败之前运行)但它也不会记录错误。这有点像聪明的@Ignore

    编写确定要运行的测试的设置代码,并将assumeThat()放入代码中。

  4. 我实际上更喜欢使用套房,因为:

    1. “我有所有测试”测试告诉我什么时候错了
    2. 我有一个地方可以看到哪个测试在哪里
    3. 我可以轻松编写更多测试以确保测试不会在套件中重复

答案 1 :(得分:3)

考虑使用ClassPathSuite:http://johanneslink.net/projects/cpsuite.jsp。我们使用它并按如下方式定义套件:

@RunWith(ClasspathSuite.class)
@ExcludeBaseTypeFilter({ NotUnitTestable.class })
public class AllTests {
}

使用Annotations无法排除,因此我们只是定义了一个标记接口(NotUnitTestable)。我们使用JUnit ANT集成在Eclipse和命令行构建中以这种方式开始我们的测试。

答案 2 :(得分:2)

使用TestNG。它有测试组,你可以在首页看到一个例子。它在参数化测试中有更好的支持。通过弹簧测试与Spring的集成更好。