是否有现成的基础设施并行运行黄瓜测试?

时间:2014-07-22 18:55:46

标签: java selenium parallel-processing gradle cucumber

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

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

每个功能都有一些测试。

是否有一种现成的方法可以使独立脚本并行运行?

他们都使用selenuim ChromeWebDriver。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

检索完源后,可以通过导航到Cucumber-JVM-Parallel目录并发出命令来运行:

mvn clean install

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

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

功能文件

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

我们可以采用的方法是使用Cucumber标签,可以应用于功能中的所有场景或单个场景。

Cucumber tags

上面,您可以看到我们有两个功能文件。它们位于'src / test / resources'文件夹中。每个要素文件都已标记(@autocorrect@search),并且包含单个方案。

胶水代码

现在我们已经有了我们的场景,我们需要添加一些粘合代码来将每个步骤绑定到我们的底层测试框架

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

code snippet

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

页面对象

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

这不是必需的,但最好使用页面对象模式以便在较大的项目上实现可维护性。

page object

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

运动员

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

runners

在上面的“SearchAT.class”片段中,您可以看到我们正在指定要素文件的位置。我们还指定了一个标签(@search),它与我们的黄瓜特征文件标签和测试结果的html报告目的地相关。

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

然后我们有另一个类'AutoCorrectAT',它对所有标记为'@autocorrect'的测试都做同样的事情。这两个类都可以在'/src/test/java/cucumber.jvm.parallel/cucumber'下找到。

添加另一个线程只是添加一个具有不同标记的新跑步者类的情况。

并行测试运行

到目前为止,这些说明与使用WebDriver与网站进行交互创建一个相对简单的非并行Cucumber-JVM测试集完全相同。

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

POM config

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

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

您可以在Running Cucumber-JVM tests in parallel文章

中获得更多详细信息

希望这会对你有所帮助。

答案 1 :(得分:2)

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

tasks.withType(Test) {
    maxParallelForks = 5
}

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

这个uiTests任务假设所有Runner Classes的名字都有Cucumber,如果这不适合你,你可以在那里写每个Runner类。

现在,如果您为每个要素文件提供自己的跑步者,则不同的跑步者将并行执行

您可以在顶部为每个功能添加不同的标签,然后让每个运行器只执行一个标签。这可以配置为

@CucumberOptions{tags = @Feature1}

在每个跑步者班级