【问题标题】:TestNG does not continue execute tests after failureTestNG 失败后不继续执行测试
【发布时间】:2021-07-08 16:00:15
【问题描述】:

我有一个带有页面对象模型的测试自动化框架。 我所有的测试都位于同一个包中的不同类中。

在 testng.xml 我有

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test">
    <test name="SmokeTest">
        <classes>
            <class name="name.test1"/>
            <class name="name.test2"/>
            <class name="name.test3"/>
        </classes>
    </test>
</suite>

问题是运行TestNG.xml后,如果第一次测试失败,它将停止测试执行。但我想继续执行所有测试用例。

我在我的项目中使用 Jenkins,如果其中一项测试失败,它会立即停止执行。

测试示例

public class LoginTestTest {
    public AndroidDriver<AndroidElement> driver;
    public AOWebClient aoWebClient;

    AOWebClient aoWeb;
    public LoginTestTest(AndroidDriver<AndroidElement> driver, AOWebClient aoWeb){
        this.driver = driver;
        this.aoWeb = aoWeb;
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

    public LoginTestTest() {
    }

    SoftAssert softAssert = new SoftAssert();

    @BeforeClass
    public void setUp() throws Exception {

        driver = DesiredCapabilitiesSetup.startAppiumServer();
        aoWebClient = DesiredCapabilitiesSetup.getAOWeb();

        LogIn logIn = new LogIn(driver,aoWebClient);
        logIn.logIn();
    }

    @org.testng.annotations.Test
    public void goToSettings() throws InterruptedException {
        HeaderMenu header = new HeaderMenu(driver,aoWeb);
        HamburgerMenuList ham = new HamburgerMenuList(driver);

        header.clickHamburgerButton();
        header.clickHamburgerButton();

        header.editButtonClick();


        softAssert.assertAll();
    }   

    @AfterClass
    public void tearDown(ITestResult result) throws Exception {
            if (result.getStatus() == ITestResult.FAILURE) {
                TakeScreenshot screenshot = new TakeScreenshot();
                screenshot.TakeScreenshot("screenshots/");
            }
        LogOut logOut = new LogOut(driver,aoWeb);
        logOut.logOut();
    }
}

如果我的测试在 @Test 中失败,它将永远不会继续使用 @AfterClass 方法。 我希望如果@Test 失败,它将继续使用@AfterClass 方法,并且在此类之后继续执行来自testng.xml 的其他类的测试。

【问题讨论】:

    标签: java automation testng


    【解决方案1】:

    您的 xml 中的套件标签应包含 configfailurepolicy="continue"。这告诉 testng,即使一个类中的配置失败,您仍然希望在该套件中运行其他类。请参阅documentation 中的“configfailurepolicy”。

    所以你的 xml 会变成:

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="Smoke Test" configfailurepolicy="continue">
        <test name="SmokeTest">
            <classes>
                <class name="name.test1"/>
                <class name="name.test2"/>
                <class name="name.test3"/>
            </classes>
        </test>
    </suite>
    

    【讨论】:

    • 官方文档说 -configfailurepolicy “如果 @Before* 方法失败,TestNG 是否应该继续执行套件中的剩余测试或跳过它们。默认行为是跳过。” (testng.org/doc/documentation-main.html)。似乎该属性仅取决于带有 @Before* 注释的方法
    【解决方案2】:

    来自documentation

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

    然后,只需将您的 @AfterClass 替换为 @AfterClass(alwaysRun = true)

    【讨论】:

    • 我发现当您在项目中运行带有一些测试的包时,此方法有效。但是如果你运行 Testng.xml 它仍然会停止执行,即使在测试中有 alwaysRun 也是如此。当第一次测试失败时,它是执行冻结之王。
    • 我们也使用 Gradle,tasks.withType(Test) { scanForTestClasses = false include "**/*Test.class" } test { useTestNG { suites 'testng.xml' } }
    • 我发现的另一个:当在 testng.xml 中我指向运行一个包时,即使第一个测试类失败,它也会运行所有测试类。在它告诉我只有失败的测试之后。但是如果我在 testng.xml 中指向多个类而不是包,第一个失败将停止执行。
    • 抱歉,我不明白预期的行为是什么,观察到的行为是什么。
    • 我认为如果我在套件中一个一个地创建一个包含类列表的测试套件(testng.xml),它应该继续一个一个地运行所有这些,即使第一个失败。但现实是,如果第一个失败,它将停止执行其余的。而当不是指向 testng.xml 中的测试类而是指向整个包 时,即使某些测试失败,它也会执行所有包。
    【解决方案3】:

    在套件语法下的 testng.xml 文件中添加以下属性

    <suite thread-count="25" name="Smoke" parallel="classes" skipfailedinvocationcounts="true">
    

    为我工作,希望它也对你有用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2019-01-15
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多