【问题标题】:How to pass TestNG parameter into Cucumber?如何将 TestNG 参数传递给 Cucumber?
【发布时间】:2019-04-23 10:11:27
【问题描述】:

我正在尝试在不同的浏览器下运行我的黄瓜测试,所以我有test.xml(是的,目前只有一个浏览器)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="SelfCare" verbose="1" thread-count="1" parallel="tests" configfailurepolicy="continue">
    <parameter name="environment" value="TEST" />
    <test name="Chrome">
        <parameter name="browser" value="chrome" />
        <parameter name="width" value="1024" />
        <parameter name="height" value="768" />
        <classes>
            <class name="TestNGRunner">
                <methods>
                    <include name="scenario"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>

这个 TestNG 运行器类,我可以从这个运行器类访问参数browser,但我需要将此变量传递给 Cucumber,在 Cucumber 中基于传递的变量创建浏览器实例。到目前为止,我在没有 TestNG 的情况下使用它,并且通过环境变量传递这些变量,但是我认为如果我在不同的浏览器上并行运行测试,这将不起作用。

import cucumber.api.CucumberOptions;
import cucumber.api.testng.CucumberFeatureWrapper;
import cucumber.api.testng.PickleEventWrapper;
import cucumber.api.testng.TestNGCucumberRunner;
import org.testng.annotations.*;

@CucumberOptions(
        plugin = {"html:target/cucumber-html-report",
                "json:target/cucumber.json",
                "pretty:target/cucumber-pretty.txt",
                "junit:target/cucumber-results.xml"},
        strict = true,
        extraGlue = {"src/test/resources/Hooks.java"},
        features = {"src/test/resources/Header.feature"}
)
public class TestNGRunner {
    private TestNGCucumberRunner testNGCucumberRunner;
    private String browser;

    @BeforeClass(alwaysRun = true)
    public void setUpClass() throws Exception {
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    }

    @Parameters("browser")
    @BeforeTest
    public void beforeSuite(String browser) {
        System.out.println("Browser for this test set is " + browser);
        this.browser = browser;
    }

    @Test(groups = "Cucumber", description = "Runs Cucumber Feature", dataProvider = "scenarios")
    public void scenario(PickleEventWrapper pickleEvent, CucumberFeatureWrapper cucumberFeature) throws Throwable {

        testNGCucumberRunner.runScenario(pickleEvent.getPickleEvent());
    }

    @DataProvider
    public Object[][] scenarios() {
        return testNGCucumberRunner.provideScenarios();
    }

    @AfterClass(alwaysRun = true)
    public void tearDownClass() throws Exception {
        testNGCucumberRunner.finish();
    }

}

有什么想法可以实现吗?

【问题讨论】:

    标签: java cucumber testng parameter-passing cucumber-java


    【解决方案1】:

    显然,我可以从任何usginReporter.getCurrentTestResult().getTestContext().getCurrentXmlTest().getParameter("browser")访问参数

    【讨论】:

      【解决方案2】:

      第 1 步。 Runner 类应扩展 AbstractTestNGCucumberTests 并实现 @Parameters 和 @BeforeTest 注释。

      package com.jacksparrow.automation.suite.runner;
      
      import org.testng.annotations.BeforeTest;
      import org.testng.annotations.Parameters;
      import com.jacksparrow.automation.steps_definitions.functional.BaseSteps;
      import cucumber.api.CucumberOptions;
      import cucumber.api.testng.AbstractTestNGCucumberTests;
      
      @CucumberOptions(features = "classpath:features/functional/",
                           glue = {"com.jacksparrow.automation.steps_definitions.functional" },
                         plugin = { "pretty","json:target/cucumber-json/cucumber.json",
                                  "junit:target/cucumber-reports/Cucumber.xml", "html:target/cucumber-reports"},
                         tags = { "@BAMS_Submitted_State_Guest_User" },
                         junit ={ "--step-notifications"},
                         strict = false,
                         dryRun = false,
                     monochrome = true)
      
      public class RunCukeTest extends AbstractTestNGCucumberTests {
      
          @Parameters({ "browser" })
          @BeforeTest
          public static void setUpScenario(String browser) {
              BaseSteps.getInstance().getBrowserInstantiation(browser);
          }
      } 
      

      注意 - 我在 BaseSteps 类下确实有浏览器实现方法。您可以根据需要实施。

      第 2 步。下面是我们如何在 TestNG.xml 中定义参数名称和值

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
      <suite name="Suite">
      
          <test thread-count="1" name="Test" parallel="classes">
              <parameter name="browser" value="chrome" />
              <classes>
                  <class
                      name="com.jacksparrow.automation.suite.runner.RunCukeTest" />
              </classes>
          </test>
      </suite>
      

      【讨论】:

      • 是否可以通过 testng.xml 将标签添加到黄瓜选项中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2019-11-27
      相关资源
      最近更新 更多