

























首先,按我自己的理解,简单说一下TDD 和 BDD 有何区别?
首先是思路上的区别, 传统的 TDD 关注的是接口是否被正确地实现了, 所以通常每个接口有一个对应的单元测试类。而BDD是通过故事模板和场景,描述产品在用户操作时的具体功能表现,有点类似传统的Use Case。写BDD的测试时更像测试人员平常写的测试用例。由于BDD一般是使用自然语言来表达,所以就算不是开发人员也看得懂。以下就是一个BDD的例子:

Behat是PHP下的一个BDD框架,可以配合PHPUnit来使用。
更详细的介绍可以去behat的官方网站查看,http://behat.org/
在对Web应用做自动化测试时,碰到界面测试时,无论是使用TDD和BDD都会遇到一些麻烦。
通常有两种解决方案:
1. 绕过GUI的测试。由于大部分的Web开发都会使用MVC框架,根据MVC的原理,Controller只需将正确的数据传递给View就算完成任务了。因此,我们在做测试时只需只需验证Controller是否把正确的数据传递给指定的View就可以了,至于View能否正确展现数据,那就要靠集成测试来验证了。
2. 使用一些GUI测试框架或浏览器模拟器。今天我要讲的使用浏览器模拟器。
浏览器模拟器大概可以分为两种:
但其实在真正做测试时,一般两种模拟器都需要用到。因为你不能全部都使用In-browser模拟器做测试,因为当测试比较多时,那速度是无法忍受的。但是当你需要测试类似Ajax请求时,你又不能使用Headless模拟器,必须使用In-browser模拟器。
由于这两种模拟器是很不同的,各自拥有不同的API,同时使用两套API来做测试是很麻烦的。
这时MINK的优势就出来了,MINK是一个浏览器模拟器抽象层,用同一套API同时支持In-browser和Headless模拟器。
下面就介绍如何使用Behat和MINK对WEB应用做BDD。
1. 安装Behat
$ pear channel-discover pear.symfony.com
$ pear channel-discover pear.behat.org
$ pear install behat/behat
2. 安装MINK
$ pear channel-discover pear.behat.org
$ pear install behat/mink-beta
3. 新建一个sosobaike目录,进入sosozhidao目录,执行behat --init命令
$ mkdir sosobaike
$ cd sosobaike
$ behat --init
这时behat会帮你创建一个features目录和features/bootstrap/FeatureContext.php文件
FeatureContext.php是真正存放单元测试的方法的地方
4. 创建features/search.feature文件

但如果我们没有使用MINK,直接运行behat命令时,behat会建议你在features/boostrap/FeatureContext.php加上一些测试方法,你需要自己在这些测试方法使用累似Selenium之类的脚本进行断言。

5. 但如果你使用MINK的话,事情就简单多了,只需修改features/bootstrap/FeatureContext.php文件,
加入两行代码。
a) require_once 'mink/autoload.php';
b) 将FeatureContext的父类由BehatContext修改为Behat\Mink\Behat\Context\MinkContext
6. 执行behat -dl命令,如果一切正常的会,你将会看到累似以下的结果

以上其实就是MINK支持的一些API。
7. 执行命令behat features/search.feature,你将会看到以下累似的结果

到此,就算完成了一个BDD测试,整个过程做起来很简单,并不比写一个测试用例所耗费的时间长,并且获得测试用例所没有的功能 -- 可以自动执行去验证功能。
因此,个人觉得做测试的同学可以尝试使用此方法代替测试用例,可以节省不少时间。
对于开发的同学,我个人认为对Web应用做BDD或TDD时,应该使用绕过GUI的测试的方案,也就是只测试Controller的方案。
原因有以下几点:
1. 开发人员和测试人员对测试的运行速度要求是不一样的,测试人员对测试的运行速度没有太高的要求,他们可以把测试起起来,然后去做其他事情,一会回来看结果就好了。但是开发人员就不一样了,他们每修改一处代码都需要运行一次完整的测试,以确保自己的修改没有破坏其他功能。如果运行一次完整的测试很耗时间的话,那么就会有开发人员想做单元测试了。使用MINK虽然比在真正的浏览器里访问要快,但是由于始终是访问真正的产品代码,也就因为着很多测试会访问数据库,一旦测试很多的话,所有测试跑完是很耗费时间的。
2. 由于使用MINK是会访问真正的产品代码,那就意味者需要配置相关环境(依赖库,数据库等),甚至需要恢复数据库到初始状态。只要有任何一个配置环节出错,都有可能引起原来通过的单元测试会无法通过。这是无法达到一个好的单元测试的标准的。好的单元测试必须任何时候运行都必须保证运行结果是一致的。要达到这个效果,那就不能依赖外部条件(例如:数据库、网络),对于这些外部条件应该使用代码去尽量模拟。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。