Java TestNG在失败后不继续执行测试

Java TestNG在失败后不继续执行测试,java,automation,testng,Java,Automation,Testng,我有一个带有页面对象模型的测试自动化框架。 我的所有测试都位于同一个包中的不同类中 在testng.xml中,我有 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Smoke Test"> <test name="SmokeTest"> <classes> <class name="name.tes

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

在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();
    }
}
公共类LoginTestTest{
公共AndroidDriver;
公共AOWebClient AOWebClient;
AOWebClient aoWeb;
公共LoginTest(AndroidDriver驱动程序,AOWebClient aoWeb){
this.driver=driver;
this.aoWeb=aoWeb;
initElements(新的AppiumFieldDecorator(驱动程序),this);
}
公共登录测试(){
}
SoftAssert-SoftAssert=新的SoftAssert();
@课前
public void setUp()引发异常{
driver=DesiredCapabilitiesSetup.startAppiumServer();
aoWebClient=DesiredCapabiliteSetup.getAOWeb();
登录=新登录(驱动程序、aoWebClient);
logIn.logIn();
}
@org.testng.annotations.Test
public void goToSettings()引发中断异常{
HeaderMenu header=新的HeaderMenu(驱动程序,aoWeb);
HamburgerMenuList火腿=新的HamburgerMenuList(司机);
header.单击汉堡按钮();
header.单击汉堡按钮();
header.editButtonClick();
softAssert.assertAll();
}   
@下课
public void拆卸(ITestResult结果)引发异常{
if(result.getStatus()==ITestResult.FAILURE){
TakeScreenshot screenshot=新的TakeScreenshot();
截图。截图(“截图/”);
}
注销注销=新注销(驱动程序,aoWeb);
logOut.logOut();
}
}
如果我的测试在
@test
中失败,它将永远不会继续使用
@AfterClass
方法。 我希望如果
@Test
失败,它将继续执行
@AfterClass
方法,并在这个类continue之后从
testng.xml
的其他类执行测试

来自:

alwaysRun:对于after方法(afterSuite,afterClass,…):如果设置为 如果为true,则即使有一个或多个 以前调用的方法失败或被跳过

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

即可:

alwaysRun:对于after方法(afterSuite,afterClass,…):如果设置为 如果为true,则即使有一个或多个 以前调用的方法失败或被跳过


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

xml中的套件标记应包括configfailurepolicy=“continue”。这告诉testng,即使一个类中的配置失败,您仍然希望运行该套件中的其他类。请参阅中的“配置故障策略”

因此,您的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>

xml中的套件标记应包括configfailurepolicy=“continue”。这告诉testng,即使一个类中的配置失败,您仍然希望运行该套件中的其他类。请参阅中的“配置故障策略”

因此,您的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>


我发现,当您在项目中运行带有一些测试的包时,这种方法是有效的。但如果您运行Testng.xml,它仍然会停止执行,即使在测试中始终运行。当第一个测试失败时,它是执行冻结的国王。我们也使用Gradle,tasks.withType(test){scanForTestClasses=false包括“***test.class”}test{useTestNG{suites'testng.xml'}}我发现的另一个问题是:当在testng.xml中我指向运行一个包时,它运行所有的测试类,即使第一个失败。在它告诉我只有失败的测试之后。但是如果我指向多个类而不是testng.xml中的包,第一个失败将停止执行。抱歉,但我不知道预期的行为是什么,观察到的行为是什么。我想如果我在套件中一个接一个地创建一个类列表的测试套件(testng.xml),它应该继续一个接一个地运行它们,即使第一个是失败的。但现实是,如果第一个失败,它将停止执行其余的。当它不是指向testng.xml中的测试类而是指向整个包时,即使某些测试失败,它也会执行所有包。我发现,当您在项目中运行带有一些测试的包时,该方法是有效的。但如果您运行Testng.xml,它仍然会停止执行,即使在测试中始终运行。当第一个测试失败时,它是执行冻结的国王。我们也使用Gradle,tasks.withType(test){scanForTestClasses=false包括“***test.class”}test{useTestNG{suites'testng.xml'}}我发现的另一个问题是:当在testng.xml中我指向运行一个包时,它运行所有的测试类,即使第一个失败。在它告诉我只有失败的测试之后。但是如果我指向多个类而不是testng.xml中的包,第一个失败将停止执行。抱歉,但我不知道预期的行为是什么,观察到的行为是什么。我想如果我在套件中一个接一个地创建一个类列表的测试套件(testng.xml),它应该继续一个接一个地运行它们,即使第一个是失败的。但现实是,如果第一个失败,它将停止执行其余的。当它不是指向testng.xml中的测试类而是指向整个包时,它将执行所有包,即使某些测试失败。