如何从 @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