Spock + GEB 与 Robot Framework 对比

12
之前我使用Robot Framework自动化测试应用程序,但新客户要求关注Spock + GEB。我从未使用过它,但需要快速比较这两个工具并做出选择。请帮助我理解它们的区别以及各自的优缺点。

你能分享一下你做出的选择以及原因吗? - binithb
第一个选择是RF。它很容易开始并快速获得UI的烟雾测试结果。它可以通过Python脚本进行扩展,因此我们也能够成功地通过Web服务加载XML文件并将应用程序中的数据与DB /文件中的数据进行比较。现在我们要切换到Geb + Spock。这更难理解。这不是我的决定,而是项目方向使用Geb + Spock。我刚刚开始使用它,这种方式看起来很有前途。此外,我发现可以从LoadUI启动geb的脚本以进行负载测试,因此这可能是一个很好的优势。 - Evgeniy
1
我们在几个项目中都使用了GEB和Robot;并且在最近的项目中继续使用Robot。我们发现其中一个好处是我们的测试团队很容易编写Robot测试,因此我们的测试现在由测试人员和开发人员共同编写(而使用GEB时仅由开发人员编写)。对我们来说,我们的测试人员现在正在为其他项目(主要是测试Web服务)使用Robot,因此他们可以轻松地在项目之间迁移,而无需为每个项目学习新工具。编写Robot测试很简单,而且很容易让它们在各种浏览器上运行,这也很不错。 - Bryce
1个回答

14

我告诉你关于Geb的事情,我已经使用gebish测试Web应用程序超过六个月了。这是它的所有好处:

  • 交叉浏览器自动化
  • 类似jQuery的API
  • 页面对象
  • 异步性
  • 测试
  • 构建系统集成

现在更详细地介绍每一项。

  • 交叉浏览器自动化

Geb利用WebDriver库进行浏览器自动化。这意味着Geb可以与任何WebDriver支持的浏览器一起工作,而WebDriver支持的浏览器列表不断增长。

核心支持的浏览器包括:

  • Firefox
  • Internet Explorer
  • Google Chrome
  • Opera

还有实验性支持:

  • Android上的Chrome
  • iPhone和iPad上的Safari

WebDriver还支持远程驱动程序。这允许您自动化在另一台机器上运行的浏览器!这意味着您可以轻松地从Mac或Linux机器上运行测试套件来针对IE浏览器(反之亦然)。

  • 类似jQuery的API

Geb受到jQuery的启发,提供了一种简洁有效的获取内容的方式。这称为Navigator API。

您可以在任何地方使用dollar函数来基于CSS选择器、属性匹配器和/或索引选择内容。

// CSS 3 selectors
$("div.some-class p:first[title='something']")

// Find via index and/or attribute matching
$("h1", 2, class: "heading")
$("p", name: "description")
$("ul.things li", 2)

// 'text' is special attribute for the element text content
$("h1", text: "All about Geb")

// Use builtin matchers and regular expressions
$("p", text: contains("Geb"))
$("input", value: ~/\d{3,}-\d{3,}-\d{3,}/)

// Chaining
$("div").find(".b")
$("div").filter(".c").parents()
$("p.c").siblings()
  • 页面对象

Geb对于页面对象模式提供了一流的支持,利用Groovy的DSL功能,使开发人员可以轻松定义页面中有趣的部分,并以简洁、可维护和可扩展的方式实现。

import geb.Page

class LoginPage extends Page {
    static url = "http://myapp.com/login"
    static at = { heading.text() == "Please Login" }
    static content = {
        heading { $("h1") }
        loginForm { $("form.login") }
        loginButton(to: AdminPage) { loginForm.login() }
    }
}

class AdminPage extends Page {
    static at = { heading.text() == "Admin Section" }
    static content = {
        heading { $("h1") }
    }
}
  • 异步性

现代网页包含许多异步操作,如 AJAX 请求和动画效果。Geb 提供了内置的支持,以应对这个事实。

任何内容查找或操作都可以用 waitFor 子句包装。

waitFor { 
    $("p.status").text() == "Asynchronous operation complete!"
}

这将持续测试条件一定时间(可配置),直到通过。同样的技术也可以用于仅等待内容,而不一定是为了使内容具有某些特征。

def dynamicParagraph = waitFor { $("p.dynamically-added") }
dynamicParagraph.text() == "Added dynamically!"
您还可以在页面对象的内容DSL中定义隐式等待的内容。
import geb.Page

class DynamicPage extends Page {
    static content = {
        dynamicParagraph(wait: true) { $("p.dynamically-added") }
    }
}

根据此定义,当请求dynamicParagraph时,Geb将隐式等待一定时间以使其出现。

  • 测试

Geb为流行的测试框架提供了集成模块,例如Spock、JUnit、TestNG、EasyB和Cucumber(通过Cuke4Duke)。

虽然Geb可以与所有这些框架很好地配合使用,但是它在与Spock配合使用时表现得非常出色。Spock是一个创新的测试框架,非常适合与Geb一起使用。使用Spock + Geb可以轻松编写非常清晰、简洁、易于理解的测试规范。

import geb.Page
import geb.spock.GebSpec

class LoginSpec extends GebSpec {
    def "login to admin section"() {
        given:
        to LoginPage

        when:
        loginForm.with {
            username = "admin"
            password = "password"
        }

        and:
        loginButton.click()

        then:
        at AdminPage
    }
}
  • 构建系统集成

Geb易于集成到任何构建系统中,可以获取有关将其与以下构建/项目系统集成的信息和示例:

  • Gradle
  • Grails
  • Maven

您可以在此处查看我的示例(Spock+GEB):github

官方网站了解更多关于Geb的信息。

谢谢!!!


非常感谢您如此全面和详细的回复。但是,不幸的是,我在这方面完全是个新手,以下问题仍然对我来说很重要:
  1. GEB如何与Spock交互?我查看了官方网站,但没有找到需要设置什么才能使用Geb + Spock的信息?如何开始在我的PC上编写最简单的测试。
  2. 我理解所有测试都是用Groovy编写的,旨在测试用Java编写的应用程序。但是与机器人框架相比,我不明白其中的优劣势是什么? 感谢您的帮助。
- Evgeniy
首先,您需要在计算机上安装构建自动化工具(gradle、maven、grails)。我使用gradle,因为它是DSL语言。之后,访问Geb主页并查看如何配置构建文件(pom.xml - maven,build.gradle - gradle)此处 - plsgogame
所有的测试都是用Groovy编写的 - 99%的Java,在你的测试中,你可以检查GUI(web-driver)+其他检查(检查数据库,检查REST和其他)。我认为这个框架的优势在于它的强大性。 - plsgogame
看看我的简单示例。 - plsgogame

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接