QAF|如果依赖场景失败,则运行场景应跳过
QAF是否支持开箱即用的依赖方案选项?我在下面的链接中看到,DependsOnMethods不起作用,不受支持。
https://github.com/qmetry/qaf/issues/281
如果QAF中没有现成的Dependent Scenario选项,我们是否可以编写一个自定义函数来检查Dependent Scenario的结果,并在Dependent Scenario失败时跳过正在执行的场景?过去的任何帖子或指导都将非常有帮助。注意:我正在使用BDDTestFactory2。
#
已在TestNG Listner中尝试以下代码,但它没有跳过测试。
@Override
public void onTestStart(ITestResult result) {
if (dependentTc == "fail") {
resultOperation(result, "skipped");
throw new SkipException("################# Testing skip - Triggered. #################");
}
}
以下摘自控制台日志:
org.testng.SkipException: ################# Testing skip - Triggered. #################
at com.rt.listener.rt_listener.onTestStart(rt_listener.java:117)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1724)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1699)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:622)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:756)
at org.testng.TestRunner.run(TestRunner.java:610)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
at org.testng.TestNG.runSuites(TestNG.java:1133)
at org.testng.TestNG.run(TestNG.java:1104)
at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:122)
at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:92)
at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:104)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70)
解决方案
用Java编写的测试/场景支持测试依赖。
让BDD中的场景之间存在依赖关系不是一个好主意,一种可能的方法是在After方法中设置标志,并使用TestNGlistener在之前方法中检查标志。假设场景2依赖于场景1,
- 确保功能文件中的顺序正确
- 在After方法检查测试名称或元数据是否为Scenario-1且状态为FAIL中,将标志let SAY
my-precondition
设置为false
。 - 在方法前检查测试名称或元数据是否为Scenario-2且
my-precondition
是否为false
中,引发SkipExeption
。
上述方法也可能有副作用。
如果您希望在使用BDD的同时利用测试依赖,RuntimeScenarioFactory
支持。它的好处是,它不需要单独的功能文件。如果您出于任何原因需要有特征文件,您可以使用Behavior Generator生成特征文件。此外,与功能文件中的方案相比,使用RuntimeScenarioFactory
可以获得更多编程控制。
您还可以在功能文件(场景)中进行测试组合,以及在Java文件中进行测试(使用RounmeScenarioFactory)。两者具有相同的功能,例如:详细报告、演练、数据驱动、元数据、元数据筛选等。
编辑: 下面的例子对我来说很好。
功能文件示例:
@smoke
Feature: scenario with dependency
@TestCaseId:Test-111
Scenario: scenario1
Given COMMENT: "some situation"
When process data
Then verify update address response with {'addr1':'123 main st'}
@dependsOnMethods:['scenario1']
@TestCaseId:Test-112
Scenario: scenario2
Given COMMENT: "some situation"
When COMMENT: "some_action_performed"
Then COMMENT: "it_should_have_some_behavior"
示例侦听程序,如果一个或多个方案失败,将跳过该方案所依赖的方案。
package qaf.example.listener;
...
public class DependecyListener implements ITestListener{
@Override
public void onTestStart(ITestResult result) {
ITestNGMethod method = result.getMethod();
String[] methodsDependedUpon = method.getMethodsDependedUpon();
if (method.isTest() && null != methodsDependedUpon && methodsDependedUpon.length > 0) {
List<String> methodsDependedUponLst = Arrays.asList(methodsDependedUpon);
IResultMap failedTests = result.getTestContext().getFailedTests();
List<ITestResult> falildMethodsDependedUpon = failedTests.getAllResults().stream()
.filter(t -> methodsDependedUponLst.contains(t.getName())).collect(Collectors.toList());
if(!falildMethodsDependedUpon.isEmpty()) {
throw new SkipException("Skipped because of dependency failure!");
}
}
}
}
在您的XML配置文件中添加侦听器>;
<listeners>
<listener class-name="qaf.example.listener.DependecyListener" />
</listeners>
相关文章