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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

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

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

см. Код ниже, используя @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 Listener. реализовать 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>
0 голосов
/ 10 апреля 2019

Я работаю в 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 не должна прерываться непредвиденными проблемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...