【问题标题】:Better or custom JUnit test filtering更好的或自定义的 JUnit 测试过滤
【发布时间】:2012-03-16 12:47:52
【问题描述】:

我想实现一个更好的系统来过滤测试以在 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

【问题讨论】:

    标签: java eclipse junit


    【解决方案1】:

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

    顺便说一句:如果没有@SuiteClasses,如何将测试拆分为套件?

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

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

      很好:不涉及任何 JUnit 魔法,如果您忘记了某些内容(例如在新测试中添加 @Category),它将确保您的安全。

      缺点:需要相当难看的文件读取/代码解析/反射魔力。

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

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

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

    我实际上更喜欢使用套件,因为:

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

    【讨论】:

    • 你可以跳过所有这些障碍,或者只使用 TestNG。
    • 我有一些代码用于类发现 - 稍后会发布!
    • 努力;不过,我并不完全明白。 - 你所说的“我是否有所有测试”测试是什么意思?很高兴了解 Assume 事情,但我如何传达运行特定测试子集的意图?
    • 在 Eclipse 中是否有一种简单的方法可以替换您自己的适用于 all 测试且不需要特殊注释的 Runner?否则,“这将允许您添加自己的自定义注释以对测试进行分类并运行它们”似乎不太理想,因为您在每个测试中引入了大量样板注释。
    • "在 Eclipse 中替换您自己的适用于所有测试的 Runner"
    【解决方案2】:

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

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

    使用注释是不可能排除的,所以我们简单地定义了一个标记接口(NotUnitTestable)。我们在 Eclipse 和使用 JUnit ANT 集成的命令行构建中都以这种方式开始测试。

    【讨论】:

    • 有趣的提示。我理解它的主要目的是多项目(模块?)测试。不过,我不确定它是否能解决问题?
    【解决方案3】:

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

    【讨论】:

    • 似乎TestNG使用字符串作为组的标识符;例如'@Test(groups = { "slow" })'。这意味着它们与用于构建应用程序的包和其他东西完全分开。另外,我想使用 IDE 可以交叉引用的东西。便于维护。你知道 TestNG 是否允许 @Test(xgroups=...) 在哪里可以使用类型吗?
    • Jonas:字符串的选择是故意让使用正则表达式选择它们变得容易(例如“运行属于组“前端。*”的所有方法)。Eclipse,IDEA HTML 报告在最后给你一个报告,告诉你所有你需要做的关于哪些组运行和不运行,哪些方法属于哪些组,等等......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2018-07-31
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多