可以使用 UI 驱动程序实现 BDD(行为驱动设计)测试吗?
例如,给定一个 Web 应用程序,而不是:
- 为后端编写测试,然后在前端用 Javascript 进行更多测试
我是不是该:
- 将测试编写为 Selenium 宏,在实际浏览器中模拟鼠标点击等?
我看到这样做的好处是:
- 测试是用一种语言编写的,而不是几种语言
- 他们专注于 UI,让开发人员从外向内思考
- 它们在真实的执行环境(浏览器)中运行,这使我们能够
- 测试不同的浏览器
- 测试不同的服务器
- 深入了解实际性能
想法?
可以使用 UI 驱动程序实现 BDD(行为驱动设计)测试吗?
例如,给定一个 Web 应用程序,而不是:
我是不是该:
我看到这样做的好处是:
想法?
We've done this for a C# application using a WPF testing tool (WipFlash) and writing NUnit tests in a BDD-like fashion.
e.g.
Given.TheApplicationWindowIsOpen();
When.I.Press.OKButton();
The.Price.ShouldBeCalculated();
We had to code a lot of the DSL ourselves, needless to say. But it becomes a business/customer readable solution.
尝试将 SpecFlow 与 WatiN 一起使用:(我不确定您是否在这里使用 .NET)
对于 Web 测试,您可以尝试 WebDriver。Selenium 团队目前正忙于集成 WebDriver。来自 Google 的 Simon Stewart 创建了 WebDriver,他在博客中介绍了它与 Selenium 的工作方式有何不同。
WebDriver 为每个浏览器使用不同的技术。对于 Internet Explorer,WebDriver 使用 Microsoft 的 UI 自动化—— @ Brian Agnew 提到的 WipFlash 所基于的技术相同。这与您假装单击按钮一样接近。Simon 的博客展示了为什么这种方法可以比 Selenium 的 Javascript 解决方案更强大。
WebDriver 可从 Selenium 站点获得,但尚未作为 Selenium 的一部分完全实现。
对于 BDD 和任何用例驱动的测试,能够传达测试正在做什么是很重要的。许多测试套件的问题在于,没有人在编写后完全确定测试在做什么。如果您使用非专业语言写作,这将经常出现。专业化并不一定意味着一种特殊的语言,只是一种语言的抽象就足够了,所以很清楚正在发生什么。
例如,很多测试都有这样的代码(伪代码,我不会选择任何特定的框架):
object = createBrowser()
response = object.gotoURL( "http://someurl.com" );
element = response.getLink( "Click Here" );
response = element.doClick();
这对于某人来说很难快速转化为业务驱动力(可能是产品经理或用户)。相反,您想创建专门的功能,或者如果您喜欢冒险,则可以创建一种语言,因此您可以拥有:
GotoURL http://someurl.com/
Click link:Click Here
Selenium 及其宏或接口在这方面仍然相当低级。如果您确实使用它们,那么至少在它们周围构建一些包装器。
您当然也可以使用名为TestPlan的产品。它在后端有 Selenium,并公开了一个高级 API 和一个用于测试的自定义语言。它不仅限于网络,还包括电子邮件、FTP 等 。上面的示例语言是一个 TestPlan 片段
实际上你可以两者都做——创建一个以用户为中心的驱动界面(与 GUI / tech / impl 无关)。然后您可以编写一个 UIDriver 和一个 APIDriver 并选择一个驱动程序来运行特定的测试。通过 UI 运行通常较慢(超出过程,控制重绘,但最初以某种方式创建了更高的置信度)。通过 API 运行要快得多(在 proc 中,易于设置-拆卸)。
这里的诀窍是将 What 与 How 分开。否则,您将最终得到 ObscureTests 和高测试维护。确保主要关注测试而不是自动化。
您当然可以通过这种方式进行一些验收测试,但我认为大多数 BDD 倡导者不会建议在所有测试中都使用这种方式。当然,真正的 BDD 拥护者不会称它们为测试......
RSpec Book提倡两级循环,首先编写验收测试(或场景)(主要在Cucumber中),然后在更类似于传统 TDD 的内部循环中编写单元测试(在RSpec中)。
验收测试的外部循环也可以使用像 Selenium 这样的工具来通过 UI 驱动整个应用程序(RSpec Book 的作者在这方面花了一章)。但它不适合单元测试。
通过 UI 执行整个应用程序的测试更难重复,并且比单元测试更慢且更脆弱。