如何从 @AfterMethod 中的 TestNG/Selenium 获取测试结果状态?

Posted

技术标签:

【中文标题】如何从 @AfterMethod 中的 TestNG/Selenium 获取测试结果状态?【英文标题】:How to get the test result status from TestNG/Selenium in @AfterMethod? 【发布时间】:2016-07-07 14:51:16 【问题描述】:

对于我正在进行的一项研究,我需要在运行测试方法 (@Test) 后从 @AfterMethod 捕获结果状态(通过/失败)。

我一直在使用 import org.testng.ITestResult;作为我研究的一个结果,在浏览了几个在线博客之后,我的工作变得更轻松了,但它似乎并没有达到我的预期,因为结果输出总是通过,即使断言失败 .

我的代码如下:

public class SampleTestForTestProject 
ITestResult result;

@Test(priority = 1)
public void testcase()

    // intentionally failing the assertion to make the test method fail 
    boolean actual = true;
    boolean expected = false;
    Assert.assertEquals(actual, expected);



@AfterMethod
public void afterMethod()  

    result = Reporter.getCurrentTestResult();

    switch (result.getStatus()) 
    case ITestResult.SUCCESS:
        System.out.println("======PASS=====");
        // my expected functionality here when passed
        break;

    case ITestResult.FAILURE:
        System.out.println("======FAIL=====");
        // my expected functionality here when passed
        break;

    case ITestResult.SKIP:
        System.out.println("======SKIP BLOCKED=====");
        // my expected functionality here when passed
        break;

    default:
        throw new RuntimeException("Invalid status");
    
  

控制台中的结果:

[TestNG] Running:  C:\Users\USER\AppData\Local\Temp\testng-eclipse--988445809\testng-customsuite.xml

======PASS=====

FAILED: testcaseFail
java.lang.AssertionError: expected [false] but found [true]

我的期望是把测试结果传递给一个变量来通过开关,如上面代码sn-p中给出的,并在测试时打印“======FAIL=====”方法失败。

是否有人可以帮助我捕捉每种测试方法的执行测试结果(@Test)。如果我所采用的方法是错误的,请用代码 sn-p 帮助我找到正确的方法。

提前谢谢你

【问题讨论】:

【参考方案1】:

去做吧:

public class stacktest  


@Test
public void teststackquestion() 

    boolean actual = true;
    boolean expected = false;
   Assert.assertEquals(actual, expected);




@AfterMethod
public void afterMethod(ITestResult result)

    try
 
    if(result.getStatus() == ITestResult.SUCCESS)
    

        //Do something here
        System.out.println("passed **********");
    

    else if(result.getStatus() == ITestResult.FAILURE)
    
         //Do something here
        System.out.println("Failed ***********");

    

     else if(result.getStatus() == ITestResult.SKIP )

        System.out.println("Skiped***********");

    

   catch(Exception e)
   
     e.printStackTrace();
   


【讨论】:

我可以知道在您的答案中建议嵌套 if-else 而不是 switch 的原因吗?无论如何,我尝试了您的解决方案,尽管断言未通过测试,但结果仍然显示为 PASSED,如上面的“控制台中的结果”所示 没有理由,我是这样使用的,这就是我这样写的原因......你可以使用switch而不是if else......没问题。 它是否以某种方式为您提供了准确的测试结果?我想知道我是否把你的问题弄糊涂了。 我没有得到准确的测试结果,它总是将测试结果显示为 PASSED,即使测试实际上是 FAILED。您能进一步帮助我吗? 我给你的解决方案已经过测试......如果你对此感到困惑,你会在任何地方看到这种解决方案,所以我认为问题出在你的代码中......请调试你的代码...我想你可以找到你的问题。 你的问题在这里- Assert.assertEquals(actual, expected);尝试使用这个- Assert.assertNotEquals(actual1, actual2);作为第一个寻找两个相等布尔值的断言,这就是它抛出异常的原因。【参考方案2】:

TestListenerAdapter 具有针对每种情况(成功、跳过、失败)的方法。我的建议是让你自己的听众像这样。

public class MyTestResultListener extends TestListenerAdapter 

    @Override
    public void onTestFailure(ITestResult result) 
        // do what you want to do
    

    @Override
    public void onTestSuccess(ITestResult result) 
        // do what you want to do
    

   @Override
    public void onTestSkipped(ITestResult result) 
        // do what you want to do
    

然后将你的监听器添加到测试类中。

@Listeners(MyTestResultListener.class)
public class MyTest 

// your tests


【讨论】:

我发现测试监听器比@afterMetod 更可靠。在某些情况下,使用 @afterMethod 不会执行失败的测试。 @bnieland 正是,这就是我建议它的原因。但它没有被选为答案,也没有被投票。所以我猜这不是他想要的。 @DavidBaak:定制的listner是我尝试的下一个方法,对我来说很成功!谢谢你。赞成和选择! @hirosht 谢谢。你能把我的回复标记为答案吗? @bnieland 这可以通过在 AfterMethod 属性中设置 alwaysRun=true 来解决

以上是关于如何从 @AfterMethod 中的 TestNG/Selenium 获取测试结果状态?的主要内容,如果未能解决你的问题,请参考以下文章

TestNG BeforeClass BeforeMethod Test AfterClass AfterMethod

TestNG @Test 方法在功能级别运行,如何在场景级别运行

关于Spring Aop 通知类型

目录中的总行数

如何在 testNG 报告中包含失败屏幕截图

一些希捷固件型号与FRU的整理,有需要的朋友可以找我们