QMetry执行BDD套件文件时抛出ScenarioFactory.getTestsFromFile()异常
看起来你遇到的是QAF(Qmetry Automation Framework)框架中ScenarioFactory工厂方法参数不匹配的问题,异常核心是java.lang.IllegalArgumentException: wrong number of arguments——也就是调用ScenarioFactory.getTestsFromFile()时传入的参数数量不符合方法要求。结合你说的「朋友机器能正常运行」的情况,可以从这几个方向排查:
版本兼容性校验:对比你和朋友机器上的QAF、TestNG版本是否完全一致。QAF对TestNG的版本有明确依赖要求,比如部分QAF版本仅支持TestNG 6.x系列,要是你本地装了过高或过低的TestNG版本,很可能触发反射调用时的参数不匹配问题。建议直接同步朋友的依赖版本(比如查看pom.xml/build.gradle里的配置)。
BDD套件文件与配置检查:虽然朋友那边运行正常,但你本地的BDD套件文件(.feature或测试套件XML)可能存在隐性的语法/配置错误。比如XML中调用Factory方法时传递的参数数量不对,或者.feature文件里的场景定义有异常,导致
ScenarioFactory解析时参数数量不符。Factory方法调用正确性确认:检查你的测试类里调用
ScenarioFactory.getTestsFromFile()的方式是否正确。这个方法需要特定的参数(比如测试文件路径、配置对象等),要是少传、多传参数,或者参数类型不匹配,都会触发这个异常。可以对照QAF的官方示例代码核对调用逻辑。清理依赖缓存:本地Maven/Gradle的依赖缓存可能存在损坏或不完整的情况,导致类加载时方法签名解析错误。试试执行以下命令清理缓存并重新下载依赖:
- Maven:
mvn clean install -U - Gradle:
./gradlew clean build --refresh-dependencies
- Maven:
JDK版本一致性检查:确认你和朋友使用的JDK版本是否相同。不同JDK版本(比如Java 8 vs Java 11)的反射机制细节可能有差异,会导致方法调用时参数解析出现问题,同步版本后再尝试运行。
附上你提供的异常堆栈:
The factory method class com.qmetry.qaf.automation.step.client.ScenarioFactory.getTestsFromFile() threw an exception at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:197) at org.testng.internal.TestNGClassFinder.processFactory(TestNGClassFinder.java:223) at org.testng.internal.TestNGClassFinder.processMethod(TestNGClassFinder.java:179) at org.testng.internal.TestNGClassFinder.processClass(TestNGClassFinder.java:171) at org.testng.internal.TestNGClassFinder.<init>(TestNGClassFinder.java:121) at org.testng.TestRunner.initMethods(TestRunner.java:370) at org.testng.TestRunner.init(TestRunner.java:271) at org.testng.TestRunner.init(TestRunner.java:241) at org.testng.TestRunner.<init>(TestRunner.java:192) at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33) at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66) at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:713) at org.testng.SuiteRunner.init(SuiteRunner.java:260) at org.testng.SuiteRunner.<init>(SuiteRunner.java:198) at org.testng.TestNG.createSuiteRunner(TestNG.java:1271) at org.testng.TestNG.createSuiteRunners(TestNG.java:1249) at org.testng.TestNG.runSuitesLocally(TestNG.java:1107) at org.testng.TestNG.runSuites(TestNG.java:1028) at org.testng.TestNG.run(TestNG.java:996) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) Caused by: java.lang.IllegalArgumentException: wrong number of arguments at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:167) ... 21 more
内容的提问来源于stack exchange,提问作者Swapnil

