为什么@AfterSuit 在没有alwaysRun=true 的情况下不运行?

aut*_*ier 2 java testng selenium annotations

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

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

我检查了alwaysRun的文档,它说:

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

这就是我的理解:如果当前套装中指定@Test的任何类中定义的任何方法失败,则除非我们指定,否则不会执行。<test>@AfterSuitalwaysRun=true

但就我而言,没有一个@Test失败。而且我的仍然@AfterSuite没有执行alwaysRun=true

Rod*_*nde 5

您可能正在组中运行测试方法,而 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我们运行组“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();
    }
    
}
Run Code Online (Sandbox Code Playgroud)

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

这些都不适用于@TEST方法。@BeforeXXXX 和 @AfterXXXX 方法将忽略任何 @Test 结果运行,除非您指定测试依赖项

最后,@Test 方法中的alwaysRun 的行为方式与ignoreMissingDependencies=true. 例如:

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

@Test(dependsOnMethods = { testA }))
public void testB() {
    doTestB();
}
Run Code Online (Sandbox Code Playgroud)

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