Search code examples
qaf

com.qmetry.qaf.automation.step.client.ScenarioFactory.getTestsFromFile() threw an exception


Followed steps outlined here: https://qmetry.github.io/qaf/qaf-2.1.14/gherkin_client.html

<test name="Gherkin-QAF-Test">
   <parameter name="step.provider.pkg" value="com.cucumber.steps" />
   <parameter name="scenario.file.loc" value="resources/features/component/test/smoke.feature" />
   <classes>
      <class name="com.qmetry.qaf.automation.step.client.gherkin.GherkinScenarioFactory" />
   </classes>
</test>

Added feature file:

@Web
Feature: Google Search

@Smoke
Scenario: Search InfoStrech

Given I am on Google Search Page
When I search for "git qmetry"
Then I get at least 5 results
And it should have "QMetry Automation Framework" in search results

Added steps in java

@QAFTestStep(description = "I am on Google Search Page")
public void step1() {
    System.out.println("I am on Google Search Page");
}

@QAFTestStep(description = "I search for {0}")
public void iSearchFor(String s) {
    System.out.println("I search for " + s);
}

@QAFTestStep(description="I get at least {num} results")
public void iGet_inSearchResults(Integer n) {
    System.out.printf("I get at least %d results\n", n);
}

@QAFTestStep(description="it should have {0} in search results")
public void itShouldHave_inSearchResults(String s) {
    System.out.printf("it should have %s in search results\n", s);
}

Ran xml file as TestNG, getting error below:

The factory method class com.qmetry.qaf.automation.step.client.ScenarioFactory.getTestsFromFile() threw an exception

org.testng.TestNGException: 
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:1295)
    at org.testng.TestNG.createSuiteRunners(TestNG.java:1273)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    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(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:167)
    ... 21 more
something else I've noticed. After an update to "Scenario" in feature file next to each line of conditions I see warning with text:

Step '********' does not have a matching glue code


Solution

  • To answer original question, easiest way is to start using maven template or ANT template.

    Regarding your question in comment, of using testng annotations, when using BDD you can move that code into respective testng listener. For example, method with Before/AfterSuite annotation can be moved to Suite listener and Before/AfterMethod can be moved to Method Invocation listener.

    When you are using QAF you may not required much of the code for driver management because qaf provides inbuilt feature of thread safe driver and resource management. You can take benefit of that with driver and element listeners and locator repository features. It is highly configurable, for example you can set property selenium.singletone to specify driver instance scope. Possible value can be Tests (testng xml test) or Methods (test mtehod) or Groups.