Twist 2.0 支持行为驱动开发和协同测试

  • Srini Penchikala
  • 石永超

2010 年 4 月 26 日

话题:敏捷ThoughtWorks语言 & 开发文化 & 方法

ThoughtWorks 工作室最近发布了最新版的敏捷测试自动化工具——Twist,该版本是第二个重大修改版本。Twist 2.0 帮助测试人员、开发人员以及业务分析师进行协同测试。它允许使用行为驱动开发(BDD)以及领域特定语言(DSL)技术实现自动化测试,同时它也支持使用Groovy动态语言来编写测试脚本。

Twist 提供了一个用户界面,为手动及自动功能测试创建可复用的自动化测试脚本。它还为分布式项目和团队提供了持续可见的测试活动。最新版的特性包括:

  • 执行混合测试:在相同的测试场景中,同时允许有手动和自动测试步骤,以提高手动测试与自动测试的协作
  • 测试场景重用:提供高层次的测试场景和测试步骤(手动及自动),可以在多个项目中重用和共享
  • 支持 Sahi Web 测试驱动:测试人员可以选择使用SahiSelenium做 Web 测试
  • SWTBOT 支持:允许 Twist 用户测试基于 Java SWT的应用程序
  • 数据驱动的场景:建立即时的数据驱动测试,提高测试覆盖率

InfoQ 采访了 ThoughtWorks 工作室的 Chad Wathington,获取更多有关他们自动化测试工具最新版本的细节。

InfoQ:发布 Twist 最新版的主要动力是什么?

在 Twist 2.0 中,我们正不断增加必要的功能以帮助团队在大型自动化功能测试上取得成功。我们已经让编写数据驱动的测试变得更加简单。我们增加了 Groovy 的支持,使测试编写工作更快更简单。我们让你可以轻而易举地增加新的测试抽象层。我们让它可以运行同时包含手动步骤和自动步骤的测试,帮助用户进行探索式测试。我们将继续我们的目标,最终给测试人员、企业用户以及开发人员提供合适的工具,支持构建、协作以及维护大型测试套件。

InfoQ:可以进一步解释一下企业用户编写场景以表达需求的情况吗,比如他们要遵循什么样的语法,比如工具如何帮助他们记录需求(通过代码自动完成)等?

我们假设,至少企业用户应该能够轻松地阅读 Twist 场景。对于更高级的用户,他们懂一点逻辑,懂得如何创建测试场景,可以使用编辑器和功能测试的领域特定语言去构造测试。Twist 也支持手动测试,因此技术较弱的用户可以先创建手动测试,而技术用户可以在团队准备就绪时将其转化成自动化测试。

Twist 的场景编辑器实质上是一个富文本编辑器,让企业用户编写测试相关的内容时有很大的灵活性。场景可以执行的部分,就是你可以构建实际领域特定语言的地方,用普通的英语编写(或者任何其它语言),因此几乎不需要学什么特别的语法。我们特意选择了比许多ATDD和 BDD 框架更加灵活的方式,没有神奇的词汇或者强制的语句结构。

在应用程序中的任何地方,Ctrl+Space 组合键都提供自动完成 / 上下文帮助,这种方式可以很好地重用你的领域特定语言。最后,任何双引号中的单词都是一个参数,没有特别的变量语法。就是这么简单。

InfoQ:Twist 同其它诸如JBehaveeasyb,或者Cucumber等 BDD 框架比起来怎么样?

Twist 有几个关键的不同。与其说它是一个框架,不如说它是一个整合的开发环境(IDE)——开发 Twist 是为了给测试人员、企业人员以及开发人员有关测试的 IDE 支持。Twist 帮助你使用测试套件进行工作,而不只是单独的测试,归根到底,管理套件是环节中最艰难的问题。所以,通过自动完成,我们让你可以很方便地搞清楚你创建的领域特定语言中有什么。我们让它可以非常容易地从测试语义上创建额外的抽象层,而不只是在代码中。我们让它可以很容易地重构你的测试套件,而且我们也提供了混合手动测试和自动测试的能力。大多数 BDD 工具是开发人员的工具,但它们已慢慢走向测试人员。我们构建的工具适合测试人员、开发人员以及企业用户。

InfoQ:与其它像DBUnit之类的数据测试框架相比,Twist 2.0 的数据驱动测试场景怎么样?

我们的起点不同。DBUnit 是关于跨测试执行(test runs)去维护数据库完整性(事实上,在 Twist 测试中,你可以使用 DBUnit 作为测试初始化和运行结束的一部分)。我们正努力给大家提供一种方式,通过大型数据集驱动测试场景。比如说我们在 Twist 中写下以下测试:

在登录时合并银行帐号:

  •  用帐户“johndoe”和密码“abc123”登录

在帐户合并页面上:

  • 出现合并提示时,“接受”它
  • 选择用户名“johndoe”作为主帐户
  • 接受许可条款
  • 验证你已经成功合并了你的帐户

编写完这个测试后,你可能想尝试不同的组合,比如说参数是双引号括起来的单词。你可以在这个测试上右单击并自动创建一个数据表,该表会使用指定的数据集运行 n 次。Twist 会帮你管理参数,因此你的测试仍然是可读的——在你的场景中没有变量名——只有一个清晰的表格。我们认为,这就像是把语义和意图散布到类似FIT的普通列固件(column fixture)中。

InfoQ:Groovy 脚本功能为开发人员提供了什么样的现代化编程特性?

因为 Groovy 是一门动态语言,它可以大幅度提高简洁性和可读性。Groovy 一流的闭包支持,让一些在 Java 中十分艰巨的任务变得轻而易举。迭代集合是一个最普通的例子。例如 with(),它是 Groovy 对象上的方法,让 Selenium 扁平化的 API 看起来更加清晰。不像在 Java 中的写法:
selenium.open("http://foo.com");
selenium.click("link=foobar");
assertTrue (selenium.isTextPresent("myfoo"));

在 Groovy 中,你可以写成:

selenium.with {
open "http://foo.com"
click "link=foobar"
assertTrue isTextPresent("myfoo")
}
  • Groovy 的标准库包超越了 Java 中提供的功能。例如,在许多情况下,使用 groovy.sql 做数据库的工作比 JDBC 简单。它也可以很好地访问任何用 Java 编写的东西。
  • 你也可以使用元编程(metaprogramming)技术。例如,如果你需要即时对 Selenium 类增加新的功能,你可以给它打动态补丁(monkey patch),这比编写一个新的子类去连接 Spring 快得多, 默认情况下,会在 Twist 场景中注入驱动。

InfoQ:您能否详细描述一下该产品公告中的一段声明,并解释一下该工具怎么会对不重写测试脚本有所帮助:“简化维护——改动应用程序无需重写测试脚本”。

Twist 的设计可以很好地抽象测试场景,恰巧既在语义上有意义,也具有说明性,可以帮助你维护测试。因此,假如你把测试编写成像单击按钮、在小窗口中键入文本、勾选这个框,那么测试将很难维护,大家使用 Selenium 之类的标准驱动框架时通常会这样做。但如果你说,把小窗口 x 加入到我的购物车里,我的账单地址是“abc”,接着结帐,你不考虑如何做这些事情,那么你就有了模块化测试套件的组成部分。当那些动作底下的机制改变时,你可以在一个地方修改好。我们减少了 GUI 应用程序测试的许多脆弱性。

另一个关键部分是重构。Twist 支持在你的基于领域特定语言的测试场景和你的代码间做双向重构(Groovy 除外)。因此,本质上讲,你可以相当容易地做跨测试套件的改动。比如说,你想改变你的应用程序只用用户名登录的想法(这始于用户故事 1),转而使用用户名和口令登录。你可以用另一种方式登录,在你的一个场景中同时接受用户名和口令,它会应用到全局,甚至是代码。在代码级别,你可以重构引入参数,接着你的测试场景将同样使用新的参数。或者,比如你想引入OpenID。你可以在代码级别重载登录有关的测试代码,然后,你的场景就会接受要么用户名和口令,要么 Open ID。你可以做很大的改动,基本上不需要重写一些测试。

InfoQ:Twist 可以作为单独的产品与其他像Hudson之类的持续集成工具或Subversion一起工作吗?

是的。Twist 场景是纯文本,因此可以签入到任何源代码控制管理系统。Twist 也可以在任何持续集成环境中运行(随同 Twist 我们一起发布了一个自定义的Ant任务),它的报表与 JUnit 兼容,所以你们的标准构建工具以及持续集成工具可以解析它们。

InfoQ:Twist 产品未来在新功能和增强功能方面的路线图是怎么样的?

我们将继续改进场景编辑器,让创建测试以及维护过程更加简单和丰富。我们打算让它可以更容易地做探索式测试。同时我们也将让测试管理变得更加简单,并改进同我们其他的产品MingleCruise的整合。我们的路线图中有更多的计划,但目前我们就说那么多吧。

查看英文原文Twist 2.0 Supports Behavior Driven and Collaborative Testing

敏捷ThoughtWorks语言 & 开发文化 & 方法