Testng: 类级别的@Test(enabled=false) 注释应该禁用类中的所有方法

创建于 2011-12-21  ·  20评论  ·  资料来源: cbeust/testng

复制自http://code.google.com/p/testng/issues/detail?id=102

也用 TestNG 6.3.1 测试过

哪些步骤将重现该问题?
我有一个这样的测试类:

@Test(启用 = 假)
公共类 MyTest {
@DataProvider(name = "bla")
私有对象[][] bla() {
返回新对象[][] {
新对象[] {“bla”}
};
}

@Test(dataProvider = "bla")
公共无效 blatest(字符串 bla){
System.out.println(bla);
}
}

什么是预期的输出?
我希望方法 blatest 不会运行并且没有控制台输出。 相反 blatest 运行并打印“bla”。

您使用的是什么版本的产品?
我已经用 testng 5.11/6.0.1 进行了测试,从 maven 2.2.1/3.0.3 和surefire 插件 2.7.2 运行。

请在下面提供任何附加信息。

所有20条评论

嗨,尼古拉斯,

如果你没有在你的方法上使用任何@Test方法,你应该看到这一点,但是一旦你这样做(就像你在上面使用 dataProvider 的例子中所做的那样)然后enabled属性被覆盖,它的默认值是真的,因此你看到的行为。

这有意义吗?

是的,谢谢塞德里克。

我错误地假设类上的注释 @test(enabled=false) 从执行中完全排除了该类

我同意这有点违反直觉,但现在改变已经太晚了,遗憾的是......

嗨,塞德里克!
@Test注释添加一个新参数并将其命名为“enabledClass”之类的东西并默认设置为 true 怎么样? 它应该只在类级别 (enabledClass = false) 上使用以禁用整个类,而不管方法级别的注释如何,如果为方法添加,则将其忽略。
通过这种方式,我们将保持向后兼容性,同时提供非常有用的功能。
如果您愿意,我可以自己实现并提供拉取请求。
提前致谢!

@andronix83

恐怕这会让事情变得更加混乱,因为您需要解释enabledenabledClass之间的细微差别。

当前的enabled行为并不是最直观的,但如果我根据这个问题被提出的次数来判断(几乎从来没有),它似乎不是一般的问题。

嗨塞德里克,

我实际上就在上周遇到了这个问题。 我正在开发一个依赖 Facebook Graph API 的网络服务器。 我有一个测试类,其中一些测试方法依赖于访问 Graph API 的代码,而其他测试方法根本不需要依赖该服务。 然后,整个 Facebook 发生了一个多小时的全球中断。 这导致此类中的一些测试失败。

为了让我的开发团队的其他成员畅通无阻,我希望做的是立即通过类级别的 @Test(enabled=false) 注释禁用该类上的所有测试。 当然,那没有用。 相反,我不得不一个一个地禁用每个失败的测试方法,这花费了我比预期更多的时间,甚至是解决这个问题所必需的。

理想情况下,TestNG 支持某种类似于 JUnit 的@Ignore注释的功能: http : //junit.sourceforge.net/javadoc/org/junit/Ignore.html 长话短说,开发人员确实需要这个功能。

谢谢你。

@ecbrodie这已经得到支持(试试吧!)但有一个警告:每个具有@Test注释的单独方法都将重新启用测试。

@Test(enabled = false)
public class T {
  void f() {} // will not run
}
@Test(enabled = false)
public class T {
  <strong i="10">@Test</strong>
  void f() {} // WILL run!
}

这是由于方法级别的属性覆盖了在类级别定义的属性的语义,所以方法级别的@Test注释基本上是说@Test(enabled = true)因为它是默认值......

说得通?

@cbeust ,谢谢你的例子,但这已经是对问题的理解了,所以我想你可能误解了我的意思。 考虑到@Test(enabled=true/false) 的当前语义,并且希望有一种方法确实指定类级别上启用的覆盖以忽略方法中设置的任何内容,我试图提出的这一点是级别,也许是时候重新考虑您反对添加某种enabledClass注释值的立场了。

您似乎对使用 @Test(enabled) 语义所采用的原始方法表示不屑。 如果确实如此,那么为什么不将其语义带入您认为更直观的事物中呢?

同意,我认为@Test(enabledClass = false)是有意义的,这是在不破坏向后兼容性的情况下实施您的建议的唯一方法。 应该也很容易。

也许您或@juherr有兴趣提交 PR?

我感觉不太好。 我不喜欢添加仅在课堂上使用的新属性的想法。
然后,我认为enable=false在源代码中使用时是一种不好的做法,因为当您想运行测试时必须修改源代码。
IMO,如果你想取消选择一个类,应该使用testng.xml代替。
@ecbrodie你如何运行你的测试?

顺便说一句,我建议提供一个IAnnotationTransformer实现,它将覆盖enable=false在课堂上的默认行为。
IAnnotationTransformer只需enable=false每次测试他们的类是否有enable=false
它不会破坏向后兼容性,也不会添加特定参数。
@cbeust你怎么看?

@juherr Cool PR,使用IAnnotationTransformer确实非常简单。

我唯一担心的是,对于用户来说,使用它有点神秘,而不是enabledClass属性。

请注意,我们已经有一些仅适用于类级别的属性( suiteNametestName )。

正如我所说,我不喜欢这个用例。 我想这对于过去 4 年中仅有的 2 个问过它的人来说就足够了:)

@juherr 很公平。

@ecbrodie您如何看待公关?

https://github.com/cbeust/testng/pull/816

@cbeust
只是好奇。 如果我们提供一个可以做到这一点的内置 AnnotationTransformer 会怎样?

是的,就是#816提议的

@juherr
感谢您分享公关信息。 有什么理由等待合并?

如果我有如下场景怎么办:

@Test(groups = { "regression", "smoke" }, dependsOnGroups = { "Creation" })
public class EditName {

    @Test(dataProvider="SomeTestData",dataProviderClass=SearchData.class)
    public void TC_1(String Msg) throws Exception{
        System.out.println(Msg);
    }

    @Test(dataProvider="SomeTestData",dataProviderClass=SearchData.class, dependsOnMethods = { "TC_1" }))
    public void TC_2(String Msg) throws Exception{
        System.out.println(Msg);
    }
}
  1. TC_1 和 TC_2 是否同时属于回归组和烟雾组?
  2. TC_1 和 TC_2 是否都依赖于“Creation”组?
  3. TC_2 将依赖于组“Creation”以及 TC_1,还是仅依赖于 TC_1?

@Rameshwar-Juptimath 你的样本和这个问题之间有什么关系?

由于@Test在类和方法级别的这些非直观行为。
应该推荐什么作为最佳实践?
我们应该避免在测试中同时使用两者吗?
既然我们或多或少地在方法级别使用它来为每种情况提供不同的数据提供者,我们应该避免在类中使用它吗?
想法?

@aliciatang所有注释属性的行为都是相同的:方法上的值将覆盖类上的值。

从 6.13 开始,您可以使用您期望的行为@Ignore 。 可以在此处找到@Ignore文档

此页面是否有帮助?
0 / 5 - 0 等级