【问题标题】:How do I make a JUnit Test Suite that runs tests conditionally based on a list of Test Classes?如何制作一个基于测试类列表有条件地运行测试的 JUnit 测试套件?
【发布时间】:2014-07-24 16:03:23
【问题描述】:

我需要制作一个基于用户提供的输入文件运行测试的 JUnit 测试套件。 IE 如果用户说应该运行 10 个测试中的 5 个,那么将运行这 5 个测试,仅此而已。有没有办法获取包含测试我的案例的类列表并只运行那些? 我尝试像这样使用 for 循环

for (Class a: classes)
    JUnitCore.runClasses(a);

但我得到了这个错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
at TestRunner.main(TestRunner.java:56)
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more

【问题讨论】:

  • 我唯一能想到的就是添加一个增强的 for 循环,该循环遍历类,如 for (Class a : classes) JUnitCore.runClasses(a);但这只是给我一个 classnotfound 异常
  • 我想,这就是Parameterized test runner 的用途。
  • @ArtjomB。不,我不这么认为。
  • 为什么只运行那些测试?该特定子集有什么特别之处吗?相同的子集是否总是被分组在一起?

标签: java unit-testing testing junit junit4


【解决方案1】:

有两种选择。

使用类别运行器

它允许您“标记”测试并通过标记构建测试套件。 您可以查看文档: https://github.com/junit-team/junit/wiki/Categories

优点:

  • 更容易设置
  • 只有标有类别的测试才会运行

缺点:

  • 固定的测试套件,要更改它们,您必须更改测试代码

使用规则

编写您的测试规则并在此规则中忽略(通过抛出 AssumptionViolatedException)不在您的列表中的所有测试。 文档在这里:

https://github.com/junit-team/junit/wiki/Rules

查看TestWatcher规则,它有关于Description对象中的测试类名和方法名的信息传递给它的方法。

优点:

  • 非常灵活的测试套件

缺点:

  • 更难设置
  • 所有测试都会运行,但那些不在列表中的测试会被忽略,即即使没有运行测试,某些 @Before 和 @After 方法也可能会触发
  • 您的所有测试都必须使用此规则,不使用规则的测试将照常运行

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2015-02-20
    • 2015-01-31
    • 2019-01-19
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多