当前位置: 首页 > 知识库问答 >
问题:

可以TestNG跨浏览器测试执行与cucumber运行?

年文柏
2023-03-14

我正在用cucumber和硒网络司机一起工作。我的测试工作与预期的组合。为了实现跨浏览器测试,我添加了TestNG框架。为了验证我的跨浏览器测试运行良好,我单独使用TestNG运行了它,没有使用cucumber。它在Chrome和火狐浏览器中都运行完美。

public class WebTest {


  WebDriver driver = null;
  BasePageWeb basePage;
  public String browser;


  @Parameters({ "Browser" })
  public WebTest(String browser) {
    this.browser = browser;
  }

  
  @BeforeClass
  public void navigateToUrl() {
    switch (browser) {

      case "CHROME":
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        break;

      case "FF":
        WebDriverManager.firefoxdriver().setup();
        driver = new FirefoxDriver();
        break;

      default:
        driver = null;
        break;
    }
    driver.get("https://demosite.executeautomation.com/Login.html");

  }

  @Test
  public void loginToWebApp() {

    basePage = new BasePageWeb(driver);
    basePage.enterUsername("admin")
            .enterPassword("admin")
            .clickLoginButton();

    driver.quit();
  }

}

测试开始了。xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="tests" thread-count="5">

    <test name="Chrome Test">
        <parameter name="Browser" value="CHROME"/>
        <classes>
            <class name="tests.web.WebTest"/>
        </classes>
    </test>
    <test name="Firefox Test">
        <parameter name="Browser" value="FF"/>
        <classes>
            <class name="tests.web.WebTest"/>
        </classes>
    </test>
</suite>

我需要将TestNG测试与Cucumber设置相集成,这样我就可以用Cucumber运行整个测试。为此,我将cucumber testng依赖项添加到POM中,并创建了一个cucumber runner来扩展AbstractCucumberTestNG类。我指定了特征文件和步骤定义的位置。步骤定义映射到TestNG测试。

cucumber跑步者:

@CucumberOptions(
                plugin = {"pretty", "html:target/surefire-reports/cucumber",
                        "json:target/surefire-reports/cucumberOriginal.json"},
                glue = {"stepdefinitions"},
                tags = "@web-1",
                features = {"src/test/resources/features/web.feature"})
          
   

 public class RunCucumberNGTest extends AbstractTestNGCucumberTests {
    }

步骤定义:

public class WebAppStepDefinitions {
      private final WebTest webTest = new WebTest("CHROME"); //create an object of the class holding the testng test. If I change the argument to FF, the test will run only on Firefox
      static boolean prevScenarioFailed = false;
    
    
      @Before
      public void setUp() {
        if (prevScenarioFailed) {
          throw new IllegalStateException("Previous scenario failed!");
        }
    
      }
    
      @After()
      public void stopExecutionAfterFailure(Scenario scenario) throws Exception {
        prevScenarioFailed = scenario.isFailed();
      }
    
      @Given("^I have navigated to the web url \"([^\"]*)\"$")
      public void navigateToUrl(String url) {  test
        webTest.navigateToUrl(url); //calling the first method holding the testng
      }
    
    
      @When("^I log into my web account with valid credentials as specicified in (.*) and (.*)$")
      public void logintoWebApp(String username, String password) {
        webTest.loginToWebApp(username, password); //calling the second method holding the testng
      }
    }

在运行该类时,测试只在一个浏览器(Chrome)中执行。不知怎的,Firefox在构建过程中迷失了方向。我怀疑我从另一个类错误地调用了参数化的TestNG方法。如何成功地拨打电话?

共有1个答案

夏侯浩气
2023-03-14

对于使用Cucumber运行TestNG测试,您必须在testng.xml.中定义TestRunner类

您的Test Runner类是RunCucumberNGTest

因此,xml应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="tests" thread-count="5">

    <test name="Chrome Test">
        <parameter name="Browser" value="CHROME"/>
        <classes>
            <class name="some.package.name.RunCucumberNGTest"/>
        </classes>
    </test>
    <test name="Firefox Test">
        <parameter name="Browser" value="FF"/>
        <classes>
            <class name="some.package.name.RunCucumberNGTest"/>
        </classes>
    </test>
</suite>

从这个xml中,我看到了下一个需求:

>

  • 运行相同的测试集,但使用不同的参数值。

    这应该是并行的,所以这应该是线程安全的。

    1.为Test Runner类引入TestNG参数

    java prettyprint-override">@CucumberOptions(
                    plugin = {"pretty", "html:target/surefire-reports/cucumber",
                            "json:target/surefire-reports/cucumberOriginal.json"},
                    glue = {"stepdefinitions"},
                    tags = "@web-1",
                    features = {"src/test/resources/features/web.feature"})
    public class RunCucumberNGTest extends AbstractTestNGCucumberTests {
    
        // static thread-safe container to keep the browser value
        public final static ThreadLocal<String> BROWSER = new ThreadLocal<>();
    
        @BeforeTest
        @Parameters({"Browser"})
        public void defineBrowser(String browser) {
            //put browser value to thread-safe container
            RunCucumberNGTest.BROWSER.set(browser);
            System.out.println(browser);
        }
    
    }
    

    2.使用步骤定义类中的值

    public class WebAppStepDefinitions {
          private WebTest webTest;
          static boolean prevScenarioFailed = false;
        
          @Before
          public void setUp() {
            if (prevScenarioFailed) {
              throw new IllegalStateException("Previous scenario failed!");
            }
            //get the browser value for current thread
            String browser = RunCucumberNGTest.BROWSER.get();
            System.out.println("WebAppStepDefinitions: " + browser);
            //create an object of the class holding the testng test. If I change the argument to FF, the test will run only on Firefox
            webTest = new WebTest(browser);
          }
        
          @After
          public void stopExecutionAfterFailure(Scenario scenario) throws Exception {
            prevScenarioFailed = scenario.isFailed();
          }
        
          @Given("^I have navigated to the web url \"([^\"]*)\"$")
          public void navigateToUrl(String url) {
            webTest.navigateToUrl(url); //calling the first method holding the testng
          }
        
        
          @When("^I log into my web account with valid credentials as specicified in (.*) and (.*)$")
          public void logintoWebApp(String username, String password) {
            webTest.loginToWebApp(username, password); //calling the second method holding the testng
          }
    
    }
    

    注意:所有TestNG注释都应该从WebTest类中删除,它们不起作用,也不是必需的WebTestWebAppStepDefinitions类显式使用,所有方法均显式调用,而不是由TestNG调用。

    因此,根据您最初的要求:

    public class WebTest {
    
      WebDriver driver = null;
      BasePageWeb basePage;
      public String browser;
    
      public WebTest(String browser) {
        this.browser = browser;
      }
    
      public void navigateToUrl(String url) {
        switch (browser) {
    
          case "CHROME":
            WebDriverManager.chromedriver().setup();
            driver = new ChromeDriver();
            break;
    
          case "FF":
            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver();
            break;
    
          default:
            driver = null;
            break;
        }
        driver.get(url);
    
      }
    
      public void loginToWebApp(String username, String password) {
    
        basePage = new BasePageWeb(driver);
        basePage.enterUsername(username)
                .enterPassword(password)
                .clickLoginButton();
    
        driver.quit();
      }
    

  •  类似资料:
    • 问题内容: 我正在将Selenium WebDriver与Java和TestNG框架一起使用。我想一次在一个代码中使用Firefox,IE,Chrome来进行跨浏览器测试。我只能将Firefox初始化为 但无法以相同方式初始化其他浏览器。例如: 给出错误 给出错误 如何初始化IE和Chrome并在所有所需的浏览器中执行测试? 问题答案: 对于C# 加 创建一个包含浏览器名称的配置文件。实现与配置文

    • 我尝试了以下testng.xml文件,它指向一个运行类,然后指向多个特性文件,但没有成功:/

    • 我有一个有很多功能的项目,我想在不同的浏览器中并行运行一个测试,使用cucumber jvm插件 在我的POM里。XML i添加了cucumber jvm和maver surefire两个插件 我创建runnerClass并添加: 现在,我无法运行测试,如何使用cucumber jvm或selenium网格并行运行浏览器中的不同功能

    • 我已经创建了一个测试套件,使用数据提供商数据工厂和我的TestNG文件发送浏览器详细信息作为参数。在testNG XML中,我调用我的数据工厂类。我也在使用浏览器堆栈进行测试(尽管我怀疑这与我遇到的问题有关) 当我不向testng文件添加parrelell=“true”时,测试运行没有任何问题。 我有一种感觉,这与每个浏览器使用的是同一个驱动程序有关,但我目前无法解决这个问题。 感谢您的指导。 这

    • 我有一个项目与cucumber和maven也我使用JUnit。 我能够从Eclipse成功地运行和构建我的项目。 现在,我想在另一个没有安装eclipse或cucumber的系统中从命令行运行测试。我有一个想法,我们可以从JAR创建一个JAR,我们可以通过java cli命令运行测试。 我已经在类路径中添加了JUNIT Jar。 我以两种方式生成jar, 1)使用->project->export

    • 有没有办法使用Selenide获取每个运行线程的当前浏览器名称 我将TestNG Cucumber与多个浏览器集成<所以我需要知道@After hook上哪个浏览器正在运行测试<基于浏览器做一些事情。 硒化物设定驱动器