2016-08-11 4 views
0

У меня есть платформа автоматизации тестирования с объектной моделью страницы. Все мои тесты расположены в отдельных классах в одном пакете.TestNG не продолжает выполнять тесты после сбоя

В 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.

ответ

1

От documentation:

alwaysRun: Для после методов (afterSuite, afterClass, ...): Если установлено правда, этот метод конфигурации будет работать, даже если один или несколько методы вызываются ранее провалился или был пропущен.

Затем просто замените @AfterClass на @AfterClass(alwaysRun = true).

+0

я узнал, что этот метод работает при запуске пакета в проекте с некоторыми тестами. Но если вы запустите Testng.xml, он все равно останавливается, даже имея alwaysRun в тестах. Когда первый тест терпит неудачу, его король замораживается при исполнении. –

+0

Мы также пользователь Gradle, tasks.withType (Test) { scanForTestClasses = ложь включают "**/* Test.class" } тест { useTestNG { люксов testng.xml ' }} –

+0

Еще один, который я нашел: Когда в testng.xml я указываю на запуск пакета, он запускает все тестовые классы, даже если первый из них не работает. И после этого мне показывают только неудачные тесты. Но если я укажу несколько классов вместо пакета в testng.xml, первый сбой остановит выполнение. –

2

Ваш тег пакета в вашем xml должен включать configfailurepolicy = "continue". Это говорит testng, что хотя конфигурация не удалось выполнить в одном классе, вы все равно хотите запускать другие классы в этом пакете. См. «Configfailurepolicy» в поле documentation.

Так что ваш 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>