仅在 Windows 上运行单元测试

2022-09-02 05:15:46

我有一个类,通过JNA进行本机Windows API调用。如何编写将在 Windows 开发计算机上执行但在 Unix 构建服务器上被忽略的 JUnit 测试?

我可以使用轻松获取主机操作系统System.getProperty("os.name")

我可以在测试中编写保护块:

@Test public void testSomeWindowsAPICall() throws Exception {
  if (isWindows()) {
    // do tests...
  }
}

这个额外的样板代码并不理想。

或者,我创建了一个仅在Windows上运行测试方法的JUnit规则:

  public class WindowsOnlyRule implements TestRule {
    @Override
    public Statement apply(final Statement base, final Description description) {
      return new Statement() {
        @Override
        public void evaluate() throws Throwable {
          if (isWindows()) {
            base.evaluate();
          }
        }
      };
    }

    private boolean isWindows() {
      return System.getProperty("os.name").startsWith("Windows");
    }
  }

这可以通过将这个带注释的字段添加到我的测试类来强制执行:

@Rule public WindowsOnlyRule runTestOnlyOnWindows = new WindowsOnlyRule();

在我看来,这两种机制都存在缺陷,因为在Unix机器上,它们会默默地通过。如果可以在执行时以某种方式标记它们,效果会更好,类似于@Ignore

有人有其他建议吗?


答案 1

在 Junit5 中,有一些选项可用于为特定操作系统配置或运行测试。

@EnabledOnOs({ LINUX, MAC })
void onLinuxOrMac() {

}

@DisabledOnOs(WINDOWS)
void notOnWindows() {
    // ...
}

答案 2

你有没有研究过假设?在前面的方法中,您可以执行以下操作:

@Before
public void windowsOnly() {
    org.junit.Assume.assumeTrue(isWindows());
}

文档:http://junit.sourceforge.net/javadoc/org/junit/Assume.html


推荐