质量保证金 |如果依赖场景失败,运行 场景应该跳过

QAF | If dependent scenario fails, running scenario should skip

QAF 是否支持开箱即用的依赖场景选项?我在下面 link 中读到 dependsOnMethods 不工作且不受支持。

https://github.com/qmetry/qaf/issues/281

如果依赖场景选项在QAF中没有开箱即用,我们是否可以编写一个自定义函数来检查依赖场景结果并在依赖场景失败时跳过执行场景?任何过去的帖子或指导都会很有帮助。

注意:我正在使用 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)

test/scenario 支持使用 QAF 在 java 中编写的测试依赖项。

BDD 中的场景之间存在依赖关系不是一个好主意,一种可能的方法是,使用 testng listener 在 after 方法中设置标志并在 before 方法中检查标志。假设场景 2 依赖于场景 1,

  • 确保功能文件中的顺序正确
  • 在方法检查测试名称或元数据是否为场景 1 且状态为失败后,将标志设置为 my-preconditionfalse
  • 在方法检查测试名称或元数据是否为场景 2 且 my-precondition 是否为 false 之前,抛出 SkipExeption.

上述方法也可能有副作用。

如果您想利用测试依赖性和 BDD,RuntimeScenarioFactory. The good part of it is, it doesn't required separate feature file. If you required to have feature file for any reason you can generate feature files using Behavior Generator 支持它。此外,使用 RuntimeScenarioFactory 你可以比功能文件中的场景有更多的编程控制。

您还可以在功能文件(场景)中组合测试以及在 java 文件中进行测试(使用 RuntimeScenarioFactory)。两者具有相同的功能,例如:详细报告、干燥 运行、数据驱动、元数据、元数据过滤器等

编辑: 下面的例子对我来说很好。

特征文件示例:

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