如何在 JUnit 4 中运行属于特定类别的所有测试

2022-08-31 13:41:16

JUnit 4.8 包含一个名为“类别”的新功能,它允许您将某些类型的测试组合在一起。这是非常有用的,例如,为慢速和快速测试提供单独的测试运行。我知道JUnit 4.8发行说明中提到的内容,但想知道我如何实际运行所有带有特定类别注释的测试。

JUnit 4.8 发行说明显示了一个示例套件定义,其中 SuiteClasses 注释从特定类别中选择要运行的测试,如下所示:

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
  // Will run A.b and B.c, but not A.a
}

有谁知道我如何运行SlowTests类别中的所有测试?看来你必须有SuiteClasses注释...


答案 1

我发现了一种实现我想要的可能方法,但我不认为这是最好的解决方案,因为它依赖于不属于JUnit的ClassPathSuite库。

我为慢速测试定义了测试套件,如下所示:

@RunWith(Categories.class)
@Categories.IncludeCategory(SlowTests.class)
@Suite.SuiteClasses( { AllTests.class })
public class SlowTestSuite {
}

AllTests 类定义如下:

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

我不得不在这里使用ClassPathSuite项目中的ClassPathSuite类。它将找到所有带有测试的类。


答案 2

以下是TestNG和JUnit在组(或类别,如JUnit调用它们)方面的一些主要区别:

  • JUnit是类型化的(注释),而TestNG是字符串。我之所以做出这个选择,是因为我希望能够在运行测试时使用正则表达式,例如“运行属于组”database*“的所有测试。此外,每当需要创建新类别时,都必须创建新注释也很烦人,尽管它的好处是IDE会立即告诉您使用此类别的位置(TestNG在其报告中向您显示这一点)。

  • TestNG非常清楚地将静态模型(测试的代码)与运行时模型(运行测试)分开。如果要先运行组“前端”,然后再运行“servlet”组,则可以执行此操作,而无需重新编译任何内容。因为 JUnit 在注释中定义了组,并且您需要将这些类别指定为运行器的参数,所以每当您想要运行一组不同的类别时,通常都必须重新编译代码,这在我看来违背了目的。


推荐