【问题标题】:Is there a ready made infra for running cucumber tests parallelly?是否有现成的基础设施用于并行运行黄瓜测试?
【发布时间】:2014-09-13 18:02:36
【问题描述】:

我使用 selenium 和 java 编写了一些自动化程序。

我使用 build.gradle 来运行黄瓜功能。

每个功能都有一些测试。

有没有现成的方法可以让独立的脚本并行运行?

他们都使用 selenuim ChromeWebDriver。

如果没有,你建议我怎么写?

【问题讨论】:

  • 我不认为这个问题是重复的。这个问题专门询问如何使用 Gradle 并行执行黄瓜测试

标签: java selenium parallel-processing gradle cucumber


【解决方案1】:

这是一种对我很有效的方法(重要提示:使用 maven 作为构建管理器)

=============================================

您需要在机器上安装 Maven 和 Firefox 才能运行此示例。

一旦您检索到源代码,您可以通过导航到 Cucumber-JVM-Parallel 目录并发出命令来运行:

mvn 全新安装

这将运行示例项目并同时启动两个浏览器窗口。每个浏览器窗口对应于示例中的一个 Cucumber 特征文件。运行完成后,将在 /target/cucumber-report/index.html 生成报告。

本文的其余部分将进一步详细介绍示例项目的结构,但假设您之前有一些 Cucumber 经验。如果没有,Cucumber-JVM 自述文件是一个很好的起点。

功能文件

您需要的第一件事是描述您期望的行为的功能文件。在此示例中,我们有两个独立的功能,但您也可以在单个功能中并行运行场景。

我们可以做的方法是使用 Cucumber 标签,它可以应用于一个特性中的所有场景,也可以应用于单个场景。

在上面,您可以看到我们有两个功能文件。它们位于“src/test/resources”文件夹中。每个功能文件都被标记(@autocorrect@search),并包含一个场景。

胶水代码

现在我们已经有了我们的场景,我们需要添加一些胶水代码来将每个步骤与我们的底层测试框架联系起来

这些被称为步骤定义,可以在“src/java/cucumber.jvm.parallel/cucumber/stepdefs”中找到。

在上面的sn-p中,可以看到我们使用ShareDriver的一个实例直接与浏览器窗口进行通信。这是基于黄瓜示例之一,用于在所有测试之间共享单个浏览器会话(使用依赖注入),以消除每次测试启动浏览器实例的需要,从而加快执行速度。在我们的例子中,这导致每个线程一个浏览器会话。 ShareDriver 类可以在‘/src/test/java/cucumber.jvm.parallel/cucumber’中找到。

页面对象

sn-p 还显示我们使用了一个“SearchPageObject”实例,它只是一个代表 Google 搜索页面的类,位于“/src/test/java/cucumber.jvm.parallel/pageobjects”中。

这不是必需的,但最好使用页面对象模式来简化大型项目的可维护性。

在上面,您可以看到页面对象包含页面上元素的标识符以及特定于该页面的方法。

跑步者

流程的下一个阶段是添加测试运行器。我们使用的是 JUnit 而不是 CLI,这就是我们需要开始专门构建事物以处理并行运行测试的地方。

在上面来自‘SearchAT.class’的sn-p中,你可以看到我们正在指定特征文件的位置。我们还指定了一个标签 (@search),它与我们的黄瓜功能文件标签之一和测试结果的 html 报告目标相关。

这就是“运行所有标记为 @search 的测试并将结果写入 /search 文件夹”。

然后我们有另一个类“AutoCorrectAT”,它对所有标记为“@autocorrect”的测试执行相同的操作。这两个类都可以在“/src/test/java/cucumber.jvm.parallel/cucumber”下找到。

添加另一个线程只是添加具有不同标记的新运行器类的情况。

并行测试运行

到目前为止,这些指令与使用 WebDriver 与网站交互创建一组相对简单的非并行 Cucumber-JVM 测试相同。

我们现在需要转到 Maven POM 文件,看看我们是如何让测试并行运行的。

在上面的 sn-p 中,您可以看到 maven-surefire-plugin 用于运行我们的验收测试——任何以 *AT 结尾的类都将作为 JUnit 测试类运行。感谢 JUnit,让测试并行运行现在是设置 forkCount 配置选项的简单案例。在示例项目中,设置为 5,这意味着我们一次最多可以运行 5 个线程(即 5 个运行器类)。

=============================

更多详情您可以在Running Cucumber-JVM tests in parallel文章中获得

希望对你有所帮助。

【讨论】:

  • 如果我使用 gradle build manager 有什么区别?
  • 坦率地说,只与maven一起工作,因此对我来说比较maven和gradle有点困难。看看:stackoverflow.com/questions/18072456/…。无论如何,我认为它们都有密切的语义
【解决方案2】:

我假设您使用测试任务来执行您的 Cucumber Runners? 如果是这样,您可以在 build.gradle 中使用它:

tasks.withType(Test) {
    maxParallelForks = 5
}

task uiTests(type: Test){  includes = ['**/*Cucumber*'] }

此 uiTests 任务假定所有 Runner 类的名称中都有 Cucumber,如果这不适合您,您可以在其中编写每个 Runner 类。

现在,如果您为每个功能文件提供自己的运行器,不同的运行器将并行执行

你可以在顶部给每个Feature一个不同的tag,然后让每个runner只执行一个tag。这可以像这样配置

@CucumberOptions{tags = @Feature1}

在每个跑步者类中

【讨论】:

  • 这与我在查看 Maven 的不同替代方案后想出的方法相同,需要手工和定制的代码,或者需要不够成熟的第三方代码。虽然我没有考虑过使用标签。我知道已经晚了,但希望寻找这个的人发现你的帖子有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多