确实TestNG的有类似@Rule
?我对特别想:TestNG是否支持类似于JUnit4的@Rule?
@Rule public TemporaryFolder folder = ...
甚至
@Rule public MethodRule globalTimeout = new Timeout(20);
我知道我可以手动实现使用setUp()
和tearDown()
等同这些东西,但这些不给我,我得到了便利使用@Rule
。
确实TestNG的有类似@Rule
?我对特别想:TestNG是否支持类似于JUnit4的@Rule?
@Rule public TemporaryFolder folder = ...
甚至
@Rule public MethodRule globalTimeout = new Timeout(20);
我知道我可以手动实现使用setUp()
和tearDown()
等同这些东西,但这些不给我,我得到了便利使用@Rule
。
规则是很容易模仿,例如用超类:
public void Base {
@BeforeMethod
public void createTempDir() { ... }
@AfterMethod
public void deleteTempDir() { ... }
}
public void MyTest extends Base {
@Test
...
}
如果扩展基地,一个临时目录总是会自动创建,然后删除。
这种做法在规则的好处是,规则总是类范围,而使用TestNG,您可以实现他们身边方法,测试,阶层,团体,甚至套房。
非常感谢您的答复。但是我从中得出的结论是_TestNG不支持相同的构造。我知道我可以使用_setup()_-像和_tearDown()_-类似的方法来创建temporaryFolder或通过注释每种方法设置在每类测试超时,却忽略解决每一个问题与方便一个参数声明。 – Francisco 2011-05-24 09:05:19
...更何况,你只能有一个超级类,而不是字段。规则可以共享和组成,而继承则不可以。 – whiskeysierra 2013-07-26 10:16:34
这是非常天真的。像TestNG这样的流行测试框架应该提供更多!问题出现在你有很多资源时,并希望他们全部关闭干净。随着@rule,同时关闭资源被自动捕获抛出的任何异常(试了一下JUnit的4.12),这样所有的资源闭门器可以被执行。用@AfterMethod你需要自己完成,例如用try/catch链。请参阅gist http://git.io/vUNnM上的代码示例。结论:'@ Rule'和'@ AfterMethod'不等价。顺便说一句,这是我认为JUnit应该比TestNG更受欢迎的原因之一。 – 2015-05-15 14:08:38
BeforeClass
/TestNG中的AfterClass
可以模拟类似的JUnit的rule
/ruleClass
,但也有一些功能和效果,这些类不能复制,如:重复,过滤器等
不过,也有TestNG提供的一些接口可以用来模拟这些功能,例如IAnnotationTransformer
,IMethodInterceptor
。
我发现TestNG的-dev的谷歌小组的讨论,有人已经实现了这个功能。 这里是讨论:https://groups.google.com/forum/#!topic/testng-dev/RounLOTz_UU 和GitHub的回购与功能:https://github.com/wolfs/testng-rules – 2011-08-01 13:46:42