12

以前我使用 Robot Framework 来自动测试应用程序,但是一个新客户要求注意 Spock + GEB。我从未使用过它,但我需要快速比较其中两个工具并做出选择。请帮助我了解它们的不同之处以及它们各自的优点/缺点。

4

1 回答 1

14

我告诉你关于 Geb,我使用 gebish 测试 web 应用程序超过 6 个月。这就是他的所有好处:

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

现在有更多关于他们每个人的细节。

  • 跨浏览器自动化

Geb 利用 WebDriver 库实现浏览器自动化。这意味着 Geb 可以与 WebDriver 使用的任何浏览器一起使用,并且 WebDriver 使用的浏览器列表一直在增长。

支持的核心浏览器是:

  • 火狐
  • IE浏览器
  • 谷歌浏览器
  • 歌剧

也有实验支持:

  • 安卓上的 Chrome
  • iPhone 和 iPad 上的 Safari

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

  • 类 jQuery API

Geb 从 jQuery 中汲取灵感,提供了一种简洁有效的获取内容的方式。这称为导航器 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 对 Page Object 模式具有一流的支持,利用 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!"

您还可以在 Content 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 很容易集成到任何构建系统中,并且提供了有关与以下构建/项目系统集成的信息和示例:

  • 摇篮
  • 圣杯
  • 马文

你可以在这里查看我的示例(Spock+GEB):github

在此处阅读有关 geb 的更多信息:官方网站

谢谢!!!

于 2013-05-10T21:50:54.227 回答