Мне нужно всегда выходить из моего приложения, когда мой тест завершается неудачей или возникает исключение. Как мне это сделать?

#java #selenium #testing #testng

#java #селен #тестирование #testng

Вопрос:

У меня есть тестовый пример, как показано ниже:

 @Test
public void checkSomething()
{
//line1
//line2
//line3
//line4[Exception occurs here]
//line5
//line6
//line7 homepage.Logout();
}
  

Теперь, если исключение возникает, например, в строке 4, мое приложение никогда не выйдет из системы [строка 7] . Это приведет к сбою моих дальнейших тестовых примеров, поскольку они не смогут войти в систему, поскольку сеанс пользователя будет активным.
Как мне сделать так, чтобы выход из системы всегда происходил при преждевременном сбое теста?

Я попытался ввести логику выхода из системы в @AfterMethod. Это работает нормально, но лучше ли писать тестовый код в методе конфигурации, таком как @AfterMethod?

Комментарии:

1. В Java используйте «try catch finally» и поместите выход из системы в предложение finally, docs.oracle.com/javase/tutorial/essential/exceptions/… Хотя использование метода @After будет работать, это подрывает его реальную цель, область его действия должна быть ограничена настройкой и отключением служб и ресурсов, связанных с набором тестов, а не с SUT, например, WebDriver или ожидаемым источником данных.

Ответ №1:

Ввести выход из @AfterMethod системы было бы неплохо, но убедитесь, что вы делаете это эффективно.

  • проверьте выход из системы, если не удалось выполнить только тест
  • избегайте использования try catch, потому что он ожидает заданного времени (implicitWait), чтобы проверить наличие элемента, а затем переходит в блок catch вместо использования списка

см. Приведенный Ниже код с использованием @AfterMethod

  @AfterMethod 
 public void screenShot(ITestResult result){
       if(ITestResult.FAILURE==result.getStatus()){
            List<WebElement> username = driver.findElement(By.locator); // element which displays if user is logged in
            if(!username.isEmpty())
                // steps to logout will go here
            }
       }
  }
  

Другой альтернативой является использование прослушивателя TestNG. реализуйте ITestListener в классе и переопределите onTestFailure метод, как показано ниже

 @Override
public void onTestFailure(ITestResult result) {
      if(ITestResult.FAILURE==result.getStatus()){
            List<WebElement> username = driver.findElement(By.locator); // element which displays if user is logged in
            if(!username.isEmpty())
                // steps to logout will go here
            }
       }
}
  

добавьте ниже тег в testng.xml

 <listeners>
   <listener class-name="com.pack.listeners.TestListener"/> // your created class name with package which implemented ITestListener
</listeners>
  

Комментарии:

1. Если я использую test listener, должен ли мой класс, содержащий мой тестовый пример, расширить класс, который реализует интерфейс ITestListener, а затем переопределить его метод onTestFailure? Звучит неплохо. Это то, что вы говорите правильно?

2. @Rajan, нет, вы должны создать отдельный класс и реализовать ITestListener в этом классе, который попросит переопределить все нереализованные методы, и вы должны сделать это дополнительно, вы должны написать код выхода из системы в onTestFailure методе. и, наконец, добавьте этот класс в прослушиватель, как показано в ответе

3. @Rajan, обратитесь к этому блогу seleniumeasy.com/testng-tutorials /…

4. Я понимаю вашу точку зрения. Итак, в основном в классе, где я буду реализовывать интерфейс ITestListener и определять все его методы, такие как onTestFailure и т.д. там мне нужно будет создать объект моего класса HomePage, который имеет функцию выхода из системы, и я вызову эту функцию изнутри метода onTestFailure . И, конечно, я добавлю этот класс в testng.xml как слушатель. Правильно?

5. @Rajan, да, и внутри if(ITestResult.FAILURE==result.getStatus()){ этого

Ответ №2:

Я работаю на C #, но концепция, скорее всего, одинакова для всех языков. В моем случае я использую так называемый тег «TearDown» в моем базовом классе, чтобы отметить один метод, который всегда должен выполняться после теста. Все тесты наследуют этот метод от базового класса и обрабатываются соответствующим образом. В последние годы это работало хорошо, и, насколько мне известно, любая подобная концепция считается наилучшей практикой.

В псевдокоде:

     [TearDown]
    public void Cleanup()
    {
        try
        {
            Logout();
            OtherStuffLikeClosingDriver();
        }
        catch (Exception ex)
        {
            Log(ex);                            // Obviously, this logging function needs to generate logs that are easily readable, based on the given exception.
            FinishTest(testInstance, testName); // Handles critical flows that should always be finished (and "should" not be able to error out)
            throw ex;                           // In my case, throwing the exception again makes sure that the exception is shown in the test output directly. This often speeds up the first diagnose of a failed test run.
        }
    }
  

Просто убедитесь, что обрабатываете исключения и тому подобное соответственно: логика в вашем @AfterMethod не должна прерываться неожиданными проблемами.