条件测试

为什么我们不直接注释掉@Test,而是要加一个@Disabled?这是因为注释掉@Test,JUnit就不知道这是个测试方法,而加上@Disabled,JUnit仍然识别出这是个测试方法,只是暂时不运行。它会在测试结果中显示:

  1. Tests run: 68, Failures: 2, Errors: 0, Skipped: 5

类似@Disabled这种注解就称为条件测试,JUnit根据不同的条件注解,决定是否运行当前的@Test方法。

我们来看一个例子:

  1. public class Config {
  2. public String getConfigFile(String filename) {
  3. String os = System.getProperty("os.name").toLowerCase();
  4. if (os.contains("win")) {
  5. return "C:\\" + filename;
  6. }
  7. if (os.contains("mac") || os.contains("linux") || os.contains("unix")) {
  8. return "/usr/local/" + filename;
  9. }
  10. }
  11. }

我们想要测试getConfigFile()这个方法,但是在Windows上跑,和在Linux上跑的代码路径不同,因此,针对两个系统的测试方法,其中一个只能在Windows上跑,另一个只能在Mac/Linux上跑:

因此,我们给上述两个测试方法分别加上条件如下:

  1. @Test
  2. @EnabledOnOs(OS.WINDOWS)
  3. void testWindows() {
  4. assertEquals("C:\\test.ini", config.getConfigFile("test.ini"));
  5. }
  6. @Test
  7. @EnabledOnOs({ OS.LINUX, OS.MAC })
  8. void testLinuxAndMac() {
  9. assertEquals("/usr/local/test.cfg", config.getConfigFile("test.cfg"));
  10. }

我们来看一些常用的条件测试:

不在Windows平台执行的测试,可以加上@DisabledOnOs(OS.WINDOWS)

  1. void testOnNonWindowsOs() {
  2. // TODO: this test is disabled on windows
  3. }

只能在Java 9或更高版本执行的测试,可以加上@DisabledOnJre(JRE.JAVA_8)

只能在64位操作系统上执行的测试,可以用@EnabledIfSystemProperty判断:

  1. @Test
  2. @EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
  3. void testOnlyOn64bitSystem() {
  4. // TODO: this test is only run on 64 bit system
  5. }

需要传入环境变量DEBUG=true才能执行的测试,可以用@EnabledIfEnvironmentVariable

  1. @Test
  2. @EnabledIfEnvironmentVariable(named = "DEBUG", matches = "true")
  3. void testOnlyOnDebugMode() {
  4. // TODO: this test is only run on DEBUG=true

当我们在JUnit中运行所有测试的时候,JUnit会给出执行的结果。在IDE中,我们能很容易地看到没有执行的测试:

带有⊘标记的测试方法表示没有执行。

下载练习:条件测试 (推荐使用快速下载)。

条件测试是根据某些注解在运行期让JUnit自动忽略某些测试。