我正在将我的Cucumber-JUnit项目转换为Cucumber-TestNg。在Junit中,我使用RunListener来抓取执行中的Gherkin步骤。我使用这个监听器返回我当前正在执行的步骤:在步骤'给定'条件或步骤'何时'或步骤'然后'等等。但是在TestNg中,我找不到类似的监听器,它返回了我正在执行的Gherkin场景步骤。我尝试了其他TestNg监听器,但我无法解决这个问题。我发现TestNg监听器与测试状态有关,而不像JuNit RunListener。建议即使有替代解决方案。
/**
* Class used to do some report regarding the JUnit event notifier
*/
public class CustomJUnitListener extends RunListener {
SeleniumTest test = null;
public void setSeleniumTest(SeleniumTest test) {
this.test = test;
}
/** {@inheritDoc} */
@Override
public void testFinished(Description description) throws Exception {
// Get which scenario step under execution at run time..here
}
}```
//--------
使TestRunner使用此类@Runwith而不是Cucumber.class
根据TestNG doc。您可以使用IInvokedMethodListener
或ITestListener
,这些听众可以帮助您实现目标。
例如,使用IInvokedMethodListener
,您可以实现类似于此的内容:
public class TestNGCustomInvokedMethodListener implements IInvokedMethodListener {
private static final Logger LOG = LoggerFactory.getLogger(TestNGCustomInvokedMethodListener.class);
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
LOG.info("Running method: " + iInvokedMethod.getTestMethod().getMethodName());
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
LOG.info("Finished method: {} with result: {}", iInvokedMethod.getTestMethod().getMethodName(), statusToString(iTestResult.getStatus()));
}
private String statusToString(int status) {
String statusStr;
switch (status) {
case ITestResult.FAILURE:
statusStr = "FAILURE";
break;
case ITestResult.SKIP:
statusStr = "SKIP";
break;
case ITestResult.STARTED:
statusStr = "STARTED";
break;
case ITestResult.SUCCESS:
statusStr = "SUCCESS";
break;
default:
statusStr = "undefined";
break;
}
return statusStr;
}
}
最后,你可以看看this post,它很好地解释了如何使用配置TestNG Listeners。