Mark TestNG测试通过

问题描述:

在我的测试场景中,如果设置了某个标志,我需要跳过其余的步骤。由于测试套件的功能不同,这里只有一个简单的if-else是不够的。所以我抛出了一个异常,并在我执行IHookable.run()中记录一些日志。Mark TestNG测试通过

现在,即使我在捕获异常后不重新抛出异常,TestNG会将测试标记为失败。我在catch块中尝试了Reporter.getCurrentTestResult().setStatus(ITestResult.SUCCESS);Reporter.getCurrentTestResult().setThrowable(null);,但似乎没有任何东西阻止TestNG将测试标记为失败。

关于如何实现这种情况的任何其他想法?感谢您的时间!

你可以编写你自己的监听器来为你做这件事。我写了一些有用的东西(我不知道这是你正在寻找什么)。

我的听众:

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()); 
     } 
     } 

    } 
    } 

此侦听器将套件后运行(这正是我ahve完成,您可以实现其他的听众也能得到什么你到底需要这只是我的版本)。在这里,我将得到失败的测试,看看失败的测试是否会抛出我的自定义异常。在这种情况下,我将从失败的测试中移除该结果并将其添加到传递的集合中。

我的测试类:

@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 
=============================================== 

如果您需要跳过TestNG测试,您应该丢弃SkipException并且这会将测试标记为已跳过。

+0

它确实将测试标记为已跳过,但由于某些测试已被跳过,套件被标记为失败。我需要将其标记为已通过。感谢您的建议!任何其他想法? – atlantis 2015-04-03 08:20:14

Gosakas解决方案是伟大的,否则你可以实现

public interface ITestListener. 

,并重写方法onTestFailure(ITestResult result)像它上面完成。这将在每次测试失败后调用。像这样的东西可能会工作

 @Override 
     onTestFailure(ITestResult result){ 
     if(result.getThrowable().getClass().equals(new MyOwnException())){ 
      result.setStatus(ITestResult.SUCCESS); 
     } 
     }