QAF中使用@dependsOnMethods出现嵌套异常错误求助
QAF中使用
@dependsOnMethods依赖Scenario Outline触发异常问题 在以下测试场景中使用@dependsOnMethods注解时会触发嵌套异常,不使用该注解则所有场景可正常运行:
- 测试版本:qaf.version 3.2.0(Selenium 3.141.59)、4.0.0-RC2(Selenium 4.11.0)
测试代码示例
@test0 @priority:1 @dependsOnMethods:[] Scenario Outline: Scenario Test 1 Given Test step Then I comment "<test_data>" Examples: | test_data | | test data 1 | | test data 2 | @test @priority:2 @dependsOnMethods:["Scenario Test 1"] Scenario: Scenario Test 2 Given Test step
报错信息
T E S T S ------------------------------------------------------- Running TestSuite SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Added "QAFMethodSelector" include groups [] exclude groups: [] Scanarios location: tests/ org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) 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) Caused by: org.testng.TestNGException: Method "tests.test.feature.Scenario Test 2()[pri:2, instance:com.qmetry.qaf.automation.step.client.Scenario@2]" depends on nonexistent method "Scenario Test 1" at org.testng.DependencyMap.getMethodDependingOn(DependencyMap.java:65) at org.testng.TestRunner.createDynamicGraph(TestRunner.java:1041) at org.testng.TestRunner.privateRun(TestRunner.java:723) 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) ... 9 more Preparing For Shut Down...
问题原因与解决方案
核心原因
Scenario Outline会根据Examples中的数据生成多个实际运行的测试方法,原始的Scenario Outline名称不会作为有效方法名存在,导致@dependsOnMethods无法匹配到对应方法,触发TestNG依赖异常。
解决方案
改用@dependsOnGroups注解实现依赖,给Scenario Outline指定一个分组,让依赖场景关联该分组:
@test0 @priority:1 @groups:["scenario1_group"] @dependsOnMethods:[] Scenario Outline: Scenario Test 1 Given Test step Then I comment "<test_data>" Examples: | test_data | | test data 1 | | test data 2 | @test @priority:2 @dependsOnGroups:["scenario1_group"] Scenario: Scenario Test 2 Given Test step
这种方式下,Scenario Outline生成的所有实例化测试方法都会继承该分组,依赖场景会等待分组内所有方法执行完成后再运行,是适配Scenario Outline依赖的可靠方式。
内容的提问来源于stack exchange,提问作者Renish K.R
相关产品推荐
相关产品推荐

