我有下面的@AfterSuit方法。如果我删除alwaysRun = true,则TestNG不会执行它。

@AfterSuite(alwaysRun=true)
public void finishsuit()
{
    System.out.println("completed suit");
}


我检查了alwaysRun文档,它说:


  对于after方法(afterSuite,afterClass,...):如果设置为true,则此
  即使调用一个或多个方法,配置方法也将运行
  先前失败或被跳过。


这就是我的理解:如果在属于当前诉讼的任何@Test中指定的任何类内定义的任何<test>方法失败,则除非我们指定@AfterSuit,否则将不会执行alwaysRun=true

但就我而言,所有@Test都没有失败。仍然没有@AfterSuite我的alwaysRun=true无法执行

最佳答案

您可能正在成组运行测试方法,而AfterSuite不属于任何组,这就是为什么需要alwaysRun=true的原因。

但是因为我看到您对alwaysRun行为有些困惑,所以我将继续说明...

对于@BeforeXXXX方法,如果您要运行该方法,尽管它不属于您正在运行的组,则需要分配alwaysRun。
例如。

public class TestConfig {

    @BeforeSuite
    public void beforeSuite() {
        doSomething();
    }

}

public class TestClassA extends TestConfig {

    @Test(groups = { "groupA" })
    public void testA() {
        doTest();
    }

}


在这种情况下,如果我们运行组'groupA',则@BeforeSuite方法不属于我们正在执行的组,除非我们指定alwaysRun = true

这同样适用于@AfterXXXX方法,此外,即使您的@Before对应方法失败或任何依赖的方法,如果您要运行它们,它们也需要alwaysRun = true。例如:

public class TestClassA {

    @BeforeSuite( groups = { "testA" })
    public void beforeSuite() {
        doSomethingBefore();
        throw new RuntimeException();
    }

    @Test( groups = { "testA" })
    public void testA() {
        doTest();
    }

    @AfterSuite( groups = { "testA" })
    public void afterSuite() {
        doSomethingAfter();
    }

}


现在,@ AfterSuite方法将无法运行,因为它的对应@BeforeSuite失败了。如果@AfterSuite在@BeforeClass失败的类上,则同样适用。但是,如果我们添加alwaysRun=true,则testng将忽略任何先前的失败并继续进行。

这都不适用于@TEST方法。除非指定test dependency,否则@BeforeXXXX和@AfterXXXX方法将忽略任何@Test结果运行。

最后,@ Test方法中的alwaysRun的行为与ignoreMissingDependencies=true类似。例如:

@Test
public void testA() {
    doTestA();
}

@Test(dependsOnMethods = { testA }))
public void testB() {
    doTestB();
}


同样,在这种情况下,testB将不会运行,因为它依赖于@TestA,除非我们指定alwaysRun = true(或ignoreMissingDependencies = true)。

希望对您有帮助。

09-27 05:49