首页 > 解决方案 > 删除重复的 TestNG Cucumber Runner 文件

问题描述

我已经为我的 selenium 项目实现了 Testng 和 Cucumber。我通过运行我已将它们重定向到 Testng Runner 文件的 Testng.xml 来运行我的测试用例。每个 Runner 文件的唯一区别是链接到 Cucumber 功能场景的 @tag,因此我使用 @sanity @regression 等创建了单独的运行器文件。我想避免创建这么多运行器文件,因为只有 @tag 是一个变量. 我想参数化注释,以便我只有一个运行器文件。


package com.ibm.wce.scbn.cc.runner;

import org.apache.log4j.Logger;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import cucumber.api.CucumberOptions;
import cucumber.api.testng.CucumberFeatureWrapper;
import cucumber.api.testng.TestNGCucumberRunner;

@CucumberOptions(features = "./Features", glue = { "com.ibm.wce.scbn.cc.stepdefinitions" }, tags = { "@Sanity" }

)

public class Sanity {

    private TestNGCucumberRunner testNGCucumberRunner;
    private static final Logger logger = Logger.getLogger(Sanity.class.getName());

    @BeforeClass(alwaysRun = true)
    public void setUpClass() throws Exception {

        logger.info("initialize TestNG cucumber runner");
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    }

    @Test(dataProvider = "features")
    public void feature(CucumberFeatureWrapper cucumberFeature) {
        logger.info("Running Cucumber features in loop");

        testNGCucumberRunner.runCucumber(cucumberFeature.getCucumberFeature());
    }

    @DataProvider
    public Object[][] features() {
        logger.info("inside data provider");

        return testNGCucumberRunner.provideFeatures();
    }

    @AfterClass(alwaysRun = true)
    public void tearDownClass() throws Exception {
        logger.info("close cucumber runner");

        testNGCucumberRunner.finish();
    }

}
Feature: Validating Mailbox response using Json data provider

  @Sanity
  Scenario: Validate Mailbox Bad Request response
    Given We have an ENDPOINT_baseURI "api.baseUrl"
    Given I set test report name "Mailbox API-Without required fields(Bad Request)"
    And We declare a new Request
    And We have Json request "bad_request" in file "api.mailboxJsonPayLoads"
    And We have below Header parameters
      | Content-Type | application/json |
    When We send post request to service "api.mailboxService"
    Then The response status code should be Bad Request
<suite name="Suite1">
    <test name="Sanity">
        <classes>
            <class name="com.ibm.wce.scbn.cc.runner.Sanity" />
        </classes>
    </test> <!-- Test -->
    <test name="Regression">
        <classes>
            <class name="com.ibm.wce.scbn.cc.runner.Regression" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Sanity1 -->

标签: seleniumcucumbertestng

解决方案


注释不能参数化。

如果你想完成这件事,那么有一个关于这样做的方法。

以下是您需要遵循的步骤

  1. 您首先让一个类实现注释接口cucumber.api.CucumberOptions
  2. 在此类中进行规定,以便它可以从 JVM 参数中读取要执行的标签,并在cucumber.api.CucumberOptions#tags调用时返回它。
  3. 构建一个实现的 TestNG 侦听器org.testng.IInvokedMethodListener
  4. 在此侦听器的beforeInvocation()方法中,您将可以访问测试方法并通过它访问它的封闭类。检索类对象。
  5. 在检索到的类对象上,读取并检查它是否具有注释cucumber.api.CucumberOptions。如果它具有注释集,那么您需要对类使用反射,其中您将原始注释对象替换为您在 (1) 中创建的自定义对象
  6. <listeners>使用标签或通过服务提供者机制将此侦听器连接到您的套件文件中。

那应该注意让您完成您的要求。

以下是我构建的一个开源库中的一些代码示例,它利用了这个概念。

  1. 实现注释,请参见此处
  2. 通过 TestNG 侦听器连接您的实现,请参见此处
  3. 允许您在运行时更改注释值的反射实用程序,请参见此处
    1. Service Provider 接口在监听器中的接线机制,见这里

推荐阅读