【问题标题】:QAF | If dependent scenario fails, running scenario should skip质量保证 |如果依赖场景失败,运行场景应该跳过
【发布时间】:2022-01-18 15:52:31
【问题描述】:

QAF 是否支持开箱即用的 Dependent Scenario 选项?我在下面的链接中读到,dependsOnMethods 不起作用且不受支持。

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

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

注意:我正在使用 BDDTestFactory2。

##################### 已更新##################### #

在 testng 列表器中尝试了下面的代码,但它没有跳过测试。

@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 selenium testng bdd qaf


    【解决方案1】:

    使用 QAF 用 java 编写的测试/场景支持测试依赖。

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

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

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

    如果您想利用 BDD 和测试依赖关系,RuntimeScenarioFactory 支持它。它的好处是,它不需要单独的功能文件。如果您出于任何原因需要功能文件,您可以使用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>
    

    【讨论】:

    • 非常感谢您的详细解释。我在 TestNg 监听器中尝试了 SkipException,但它没有跳过测试。测试仍在执行。我也尝试过@BeforeMethod,它甚至没有被触发。我已经用我的监听器代码和控制台日志更新了上述问题。
    • 在更新的答案中参考完整的工作示例。
    • 不使用场景名称,如何使用 testcaseid 例如:@dependsOnMethods:['test_case_id-1', test_case_id-2]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多