1

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

Krishnan Mahadevan
  • 14,121
  • 6
  • 34
  • 66
user3812972
  • 77
  • 1
  • 6
  • What is you step method signature? Can you proved your step method? it looks it requires parameters and you didn't provided placeholders in step description. – user861594 Feb 13 '20 at 00:21
  • Also try changing ` Scenario Outline:` to ` Scenario:` as you don't have examples. – user861594 Feb 13 '20 at 00:28
  • Thanks for your reply: Step method signature in java file as: @QAFTestStep(description = "I am on Google Search Page") public void step1() { System.out.println("I am on Google Search Page"); } I've also tried changing to "Scenario" from "Scenario Outline". I do not think for that step parameters required. Tried running again but same issue continues...any other ideas what could be wrong in configuration? – user3812972 Feb 13 '20 at 02:57
  • refer https://qmetry.github.io/qaf/latest/bdd-configuration.html – user861594 Feb 13 '20 at 05:23
  • Simplest way is to start with using [maven template](https://github.com/qmetry/qaf-blank-project-maven) or [ANT template](https://github.com/qmetry/qaf-blank-project) – user861594 Feb 13 '20 at 05:47
  • I've successfully ran feature file with BDD2/1, and GherkinScenarioFactory from maven template project. Will have to integrate same in existing framework...Thanks for your help! ``` I do have further questions on how deal with existing listeners of TestNG and/or custom ones created in current framework of mine. ``` For instances, @BeforeMethod currently sets browser launch and @AfterMethod closes browser. There are other annotations of Before and AfterSuite as well. As well as other annotations created specifically for requirements of my platform. – user3812972 Feb 13 '20 at 19:34
  • 1
    I've also added a sample feature in existing framework and it works fine now after changes to testng version. 6.14.3 version of testng is not working with cucumber implementation of qaf and throws exception as I have originally reported. Please downgrade to version 6.10.0. It should work fine. org.testng testng 6.10 Looks like original problem reported has been resolved, thanks all. I am still waiting on suggestions/thoughts on how to handle listeners and annotations with cucumber... – user3812972 Feb 13 '20 at 19:53

1 Answers1

0

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.

user861594
  • 5,733
  • 3
  • 29
  • 45