TestNG是否支持JUnit4的@Rule?

Fra*_*sco 35 testng junit4

TestNG有类似的东西@Rule吗?我在具体思考:

@Rule public TemporaryFolder folder = ...
Run Code Online (Sandbox Code Playgroud)

甚至

@Rule public MethodRule globalTimeout = new Timeout(20);
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用setUp()tearDown()等价物手动实现这些东西,但这些并没有给我带来的便利@Rule.

Ced*_*ust 5

规则很容易模仿,例如超类:

public void Base {
  @BeforeMethod
  public void createTempDir() { ... }

  @AfterMethod
  public void deleteTempDir() { ... }
}

public void MyTest extends Base {
  @Test
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果扩展 Base,将始终自动创建一个临时目录,然后将其删除。

这种方法相对于规则的优势在于规则始终是类范围的,而使用 TestNG,您可以围绕方法、测试、类、组甚至套件来实现它们。

  • 这是非常幼稚的。像 TestNG 这样的流行测试框架应该提供更多!当您拥有许多资源并希望将它们*全部* 完全关闭时,就会出现问题。使用@Rule,关闭资源时抛出的任何异常都会被自动捕获(在 JUnit 4.12 上尝试过),以便可以执行所有资源关闭器。使用@AfterMethod,您需要自己完成,例如使用一系列 try/catch。请参阅 gist http://git.io/vUNnM 上的代码示例 结论:`@Rule` 和 `@AfterMethod` 不是等价的。顺便说一句,这是我认为 JUnit 应该优于 TestNG 的原因之一。 (15认同)
  • 非常感谢您的回答。但我从中得到的是 _TestNG 不支持等效构造_。我知道我可以使用 _setUp()_-like 和 _tearDown()_-like 方法通过注释每个方法来创建一个临时文件夹或为类中的每个测试设置超时,但这错过了解决每个问题的便利单个参数声明。 (14认同)
  • ...更不用说与字段相比,您只能拥有一个超类。规则可以共享和组合,继承则不行。 (10认同)
  • 这里有趣的部分是 TestNG 一开始是为了避免子类化并只使用注释,现在 JUnit 似乎做得更好。 (8认同)
  • 在 JUnit4 中,规则可以是类范围或方法范围(使用 `@ClassRule`)。我可以在套件中使用类规则 (2认同)