2011-05-23 71 views
30

确实TestNG的有类似@Rule?我对特别想:TestNG是否支持类似于JUnit4的@Rule?

@Rule public TemporaryFolder folder = ... 

甚至

@Rule public MethodRule globalTimeout = new Timeout(20); 

我知道我可以手动实现使用setUp()tearDown()等同这些东西,但这些不给我,我得到了便利使用@Rule

+0

我发现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

回答

4

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

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

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

public void MyTest extends Base { 
    @Test 
    ... 
} 

如果扩展基地,一个临时目录总是会自动创建,然后删除。

这种做法在规则的好处是,规则总是类范围,而使用TestNG,您可以实现他们身边方法,测试,阶层,团体,甚至套房。

+14

非常感谢您的答复。但是我从中得出的结论是_TestNG不支持相同的构造。我知道我可以使用_setup()_-像和_tearDown()_-类似的方法来创建temporaryFolder或通过注释每种方法设置在每类测试超时,却忽略解决每一个问题与方便一个参数声明。 – Francisco 2011-05-24 09:05:19

+10

...更何况,你只能有一个超级类,而不是字段。规则可以共享和组成,而继承则不可以。 – whiskeysierra 2013-07-26 10:16:34

+15

这是非常天真的。像TestNG这样的流行测试框架应该提供更多!问题出现在你有很多资源时,并希望他们全部关闭干净。随着@rule,同时关闭资源被自动捕获抛出的任何异常(试了一下JUnit的4.12),这样所有的资源闭门器可以被执行。用@AfterMethod你需要自己完成,例如用try/catch链。请参阅gist http://git.io/vUNnM上的代码示例。结论:'@ Rule'和'@ AfterMethod'不等价。顺便说一句,这是我认为JUnit应该比TestNG更受欢迎的原因之一。 – 2015-05-15 14:08:38

0

BeforeClass/TestNG中的AfterClass可以模拟类似的JUnit的rule/ruleClass,但也有一些功能和效果,这些类不能复制,如:重复,过滤器等

不过,也有TestNG提供的一些接口可以用来模拟这些功能,例如IAnnotationTransformerIMethodInterceptor