测试失败或发生异常时,我需要始终注销应用程序。我该怎么办?

时间:2019-04-10 11:46:47

标签: java selenium testing testng

我有一个如下的测试用例:

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

现在,例如,如果第4行发生异常,那么我的应用程序将永远不会注销[line7]。这将导致我的其他测试用例失败,因为它们将无法登录,因为用户会话将处于活动状态。 当测试过早失败时,如何使注销始终发生?

我尝试将注销逻辑放入@AfterMethod中。效果很好,但这是在@AfterMethod之类的配置方法中编写测试代码的最佳实践吗?

2 个答案:

答案 0 :(得分:1)

将注销放入@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>

答案 1 :(得分:0)

我使用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中的逻辑不应因意外问题而中断。