如何使用Grid并行执行黄瓜测试用例?

时间:2015-12-22 21:10:52

标签: java selenium-webdriver cucumber selenium-grid

在对如何同时运行Cucumber测试用例进行了大量研究后,我发现了以下非常有用的文章:

https://www.opencredo.com/2013/07/02/running-cucumber-jvm-tests-in-parallel/

本文提供了一些很好的信息,可以帮助您开始使用多线程环境,包括可以从Github下载的一些代码。

https://github.com/tristanmccarthy/Cucumber-JVM-Parallel

如果我理解正确的文章,驱动程序应该可配置为使用Grid,使您能够跨多个设备运行多个测试用例。在使用chromedriver对代码进行一些测试之后,它确实像文章中描述的那样工作。但是,一旦配置为使用Grid,测试用例就不再并行执行。相反,它们是按顺序执行的。

目前,我已将Grid配置为具有1个集线器和2个节点。每个节点在任何给定时间最多可以有2个会话。

注意:如果没有Cucumber,我能够在多个设备上成功部署多个测试用例,所以我不认为这个问题与我的网格设置有关。

以下是与网络驱动程序相关的代码示例:

static {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setJavascriptEnabled(true);
    capabilities.setBrowserName("chrome");
    capabilities.setPlatform(Platform.ANY);
    try {
        REAL_DRIVER = new RemoteWebDriver(new URL("http://xxx.xxx.xxx.xxx:4444/wd/hub"), capabilities);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    REAL_DRIVER.manage().timeouts().pageLoadTimeout(3000, TimeUnit.SECONDS);
    REAL_DRIVER.manage().window().maximize();
    Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);
}

public SharedDriver() {
    super(REAL_DRIVER);
}

@Override
public void close() {
    if (Thread.currentThread() != CLOSE_THREAD) {
        throw new UnsupportedOperationException(
                "You shouldn't close this WebDriver. It's shared and will close when the JVM exits.");
    }
    super.close();
}

我怀疑如果您使用多种浏览器类型,您应该能够在多个设备上运行测试用例(每台设备1个浏览器),但在我的情况下,我正在使用Chrome驱动程序。有谁知道什么可能阻止测试用例分布在多个设备上,或者更好地理解Grid如何与黄瓜一起工作?请分享与此问题相关的任何文章或信息。

1 个答案:

答案 0 :(得分:2)

Grid对于分割作业没有任何作用。我花了一段时间(以及大量的苏格兰威士忌)才最终意识到Grid所做的就是从某处获取工作并将其传递给可用节点。

您需要一个测试运行器,将您的功能/场景测试分成不同的块以传递给Grid。不幸的是,黄瓜运动员不这样做。有几种不同的方法可以将这些测试拆分为单独的作业以传递给Grid。

OpenCredo博客指向a newer post that uses Maven。一定要检查出来!

有人提到过TestNG。我没用过它,所以我不能评论它。

您可以自行拆分您的功能/场景,并通过运行不同的测试通道将作业单独传递给您的网格 - 这对于长期可维护性来说很麻烦,但这是一个快速的开始。

我们编写了一个小型跑步者,用于扫描场景并动态传递给网格。不能共享代码,因为它在工作,我在我的酒店......

要记住一件事:您必须管理依赖项和并发问题。希望你正在构建测试,因此它们之间没有依赖关系。并发是另一回事。我们有一些代码可以为测试提供解锁资源(想想用户,数据集等)。

祝你好运!