将 TestNG 测试标记为已通过
Mark TestNG test as passed
在我的测试场景中,如果设置了某个标志,我需要跳过剩余的步骤。由于测试套件的运行方式,简单的 if-else 在这里是不够的。所以我抛出一个异常并在我的 IHookable.run()
实现中捕获它以进行一些日志记录。
现在,即使我在捕获异常后没有重新抛出异常,TestNG 也会将测试标记为失败。我在 catch 块中尝试了 Reporter.getCurrentTestResult().setStatus(ITestResult.SUCCESS);
和 Reporter.getCurrentTestResult().setThrowable(null);
,但似乎没有什么能阻止 TestNG 将测试标记为失败。
关于如何实现此方案的任何其他想法?感谢您的宝贵时间!
如果您需要跳过 TestNG 测试,您应该抛出 SkipException
,这会将测试标记为已跳过。
您可以编写自己的侦听器来为您执行此操作。我已经写了一些有用的东西(我不知道这是否是你正在寻找的东西)。
我的听众:
public class MyResultListener implements ISuiteListener{
@Override
public void onStart(ISuite suite) {
// TODO Auto-generated method stub
}
@Override
public void onFinish(ISuite suite) {
Map<String,ISuiteResult> resultMap = suite.getResults();
for(Map.Entry<String, ISuiteResult> ent :resultMap.entrySet())
{
ISuiteResult res = ent.getValue();
IResultMap failedTestMap = res.getTestContext().getFailedTests();
IResultMap passTestMap = res.getTestContext().getPassedTests();
for(ITestResult testResult :failedTestMap.getAllResults()){
if(testResult.getThrowable().getClass().equals(new MyOwnException())){}
System.out.println("My Own exception thrown");
failedTestMap.removeResult(testResult);
passTestMap.addResult(testResult, testResult.getMethod());
}
}
}
}
此侦听器将在套件后 运行(这正是我所做的,您也可以实施其他侦听器以获得您真正需要的东西。这只是我的版本)。在这里,我将获取失败的测试并查看失败的测试是否抛出我的自定义异常。在那种情况下,我将从失败的测试中删除该结果并将其添加到通过的集合中。
我的测试class:
@Listeners(com.paypal.test.sample.testng.MyResultListener.class)
public class SampleTest {
@Test
public void test1(){
Assert.assertTrue(true);
}
@Test
public void test2() throws MyOwnException{
throw new MyOwnException("Summa");
}
}
This is how my results look:
PASSED: test1
FAILED: test2
com.paypal.test.sample.testng.MyOwnException: Summa
at com.paypal.test.sample.testng.SampleTest.test2(SampleTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
===============================================
Default test
Tests run: 2, Failures: 1, Skips: 0
===============================================
My Own exception thrown
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Gosakas 解决方案很棒,否则您可以实施
public interface ITestListener.
并像上面那样覆盖方法 onTestFailure(ITestResult result)
。这将在每次测试失败后调用。像这样的东西可能有用
@Override
onTestFailure(ITestResult result){
if(result.getThrowable().getClass().equals(new MyOwnException())){
result.setStatus(ITestResult.SUCCESS);
}
}
在我的测试场景中,如果设置了某个标志,我需要跳过剩余的步骤。由于测试套件的运行方式,简单的 if-else 在这里是不够的。所以我抛出一个异常并在我的 IHookable.run()
实现中捕获它以进行一些日志记录。
现在,即使我在捕获异常后没有重新抛出异常,TestNG 也会将测试标记为失败。我在 catch 块中尝试了 Reporter.getCurrentTestResult().setStatus(ITestResult.SUCCESS);
和 Reporter.getCurrentTestResult().setThrowable(null);
,但似乎没有什么能阻止 TestNG 将测试标记为失败。
关于如何实现此方案的任何其他想法?感谢您的宝贵时间!
如果您需要跳过 TestNG 测试,您应该抛出 SkipException
,这会将测试标记为已跳过。
您可以编写自己的侦听器来为您执行此操作。我已经写了一些有用的东西(我不知道这是否是你正在寻找的东西)。
我的听众:
public class MyResultListener implements ISuiteListener{
@Override
public void onStart(ISuite suite) {
// TODO Auto-generated method stub
}
@Override
public void onFinish(ISuite suite) {
Map<String,ISuiteResult> resultMap = suite.getResults();
for(Map.Entry<String, ISuiteResult> ent :resultMap.entrySet())
{
ISuiteResult res = ent.getValue();
IResultMap failedTestMap = res.getTestContext().getFailedTests();
IResultMap passTestMap = res.getTestContext().getPassedTests();
for(ITestResult testResult :failedTestMap.getAllResults()){
if(testResult.getThrowable().getClass().equals(new MyOwnException())){}
System.out.println("My Own exception thrown");
failedTestMap.removeResult(testResult);
passTestMap.addResult(testResult, testResult.getMethod());
}
}
}
}
此侦听器将在套件后 运行(这正是我所做的,您也可以实施其他侦听器以获得您真正需要的东西。这只是我的版本)。在这里,我将获取失败的测试并查看失败的测试是否抛出我的自定义异常。在那种情况下,我将从失败的测试中删除该结果并将其添加到通过的集合中。
我的测试class:
@Listeners(com.paypal.test.sample.testng.MyResultListener.class)
public class SampleTest {
@Test
public void test1(){
Assert.assertTrue(true);
}
@Test
public void test2() throws MyOwnException{
throw new MyOwnException("Summa");
}
}
This is how my results look:
PASSED: test1
FAILED: test2
com.paypal.test.sample.testng.MyOwnException: Summa
at com.paypal.test.sample.testng.SampleTest.test2(SampleTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
===============================================
Default test
Tests run: 2, Failures: 1, Skips: 0
===============================================
My Own exception thrown
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Gosakas 解决方案很棒,否则您可以实施
public interface ITestListener.
并像上面那样覆盖方法 onTestFailure(ITestResult result)
。这将在每次测试失败后调用。像这样的东西可能有用
@Override
onTestFailure(ITestResult result){
if(result.getThrowable().getClass().equals(new MyOwnException())){
result.setStatus(ITestResult.SUCCESS);
}
}