除非在父类或本地类中,否则不会调用TestNG BeforeGroups

时间:2016-04-14 00:20:04

标签: java testng

首先,我不认为这是this issue

无论如何,这在我运行actualTest时起作用:

public class Foo {
    @BeforeGroups("Group1")
    public static void doThisFirst() {
        System.out.println("first");
    }

    @Test(groups="Group1")
    public void actualTest() {
        System.out.println("test");
    }
}

打印出“first”然后“test”。这也有效:

public class Foo {
    @BeforeGroups("Group1")
    public static void doThisFirst() {
        System.out.println("first");
    }

    public class Bar extends Foo {
        @Test(groups="Group1")
        public void actualTest() {
            System.out.println("test");
        }
    }
}

但是有效,只有在运行actualTest时打印“test”:

public class Foo {
    @BeforeGroups("Group1")
    public static void doThisFirst() {
        System.out.println("first");
    }

    public class Bar {
        @Test(groups="Group1")
        public void actualTest() {
            System.out.println("test");
        }
    }
}

BeforeGroups注释是否必须在类或超类中才能运行?我在doc中没有看到任何关于此的内容。我用Google搜索了,上面的链接是我发现的最接近的东西。有谁知道我错过了什么?

我也尝试了@BeforeGroups(groups="Group1")变体。同样的行为。

作为一项规则,我从套件中运行该组(通常来自maven-surefire-plugin,有时使用TestNG插件从eclipse运行),但是当我搜索特定问题时,我尝试运行单独测试(几乎总是来自eclipse)以便更快地迭代。

我还应该说我有一个解决方法。我有一个包含所有BeforeGroups和AfterGroups方法的类,然后我为任何需要这些方法的类扩展它。但看起来像TestNG应该能为我做的簿记。

2 个答案:

答案 0 :(得分:0)

您的问题与测试背景有关。如果你从例如IDEA,它将生成以下xml:

<suite name="Default Suite">
    <test name="testngex">
        <classes>
            <class name="Foo$Bar">
                <methods>
                    <include name="actualTest"/>
                </methods>
             </class>
        </classes>
    </test>
</suite>

如您所见,没有关于您的@Before方法的信息。要使其工作,您需要具有以下xml:

<suite name="Default Suite">
    <test name="testngex">
        <packages>
            <package name="path.to.foo.class"/>
        </packages>
    </test>
</suite>

你会得到预期的结果。无论如何用@Before和@After扩展BaseTestClass是更好的解决方案。

答案 1 :(得分:0)

面临同样的问题。 将@Test(groups="Group1")添加到您的Foo课程