php测试驱动开发介绍

分类 开发 时间 2022-02-11

项目一旦变的复杂,每次新需求的到来都会令人心惊胆战,就像杂技运动员同时抛动多个球一样,稍有不慎就会呼啦掉下来。这个时候,就可以考虑使用测试驱动开发了(Test-Driven Development),它能让我们愉快的抛球。抛球这个比喻出自于图书《测试驱动开发》 Kent Beck 著。

为什么能愉快的抛球?TDD 的做法是把所有的功能都自动化测试,每次新的需求完成以后,就跑一次测试。TDD 在常规的开发顺序之前,需要先写测试,这种感觉有点奇怪,但试过几次之后感觉棒极了。

以下针对 PHP 和 codeception 为例,假如要开发一个留言板的功能。

对用户来讲,正常的流程是:

  1. 打开留言板网页
  2. 输入留言内容和联系方式,提交
  3. 跳转到留言成功网页

转化为代码为

$I->amOnPage('/guestbook');
$I->submitForm('#guestbook-form', [
    'contact' => 'foo@bar.com',
    'content' => '留言内容'
]);
$I->see('留言成功');

对开发者来讲,正常的流程是:

  1. 实例留言板表单
  2. 收集用户输入
  3. 保存到数据库

转化为代码为

$model = new Guestbook();
$model->contact = 'foo@bar.com';
$model->content = '留言内容';
$model->save();
$I->seeRecord('Guestbook', ['contact' => 'foo@bar.com', 'content' => '留言内容']);

运行测试,会报出错误,测试不通过。因为我们还没有开始写真正的功能。那么,我们就下来要做的,就是让这几个测试通过。

下边这些是我在做 TDD 之前考虑的几个问题:

  • 如何管理供测试的数据库内容?
  • 是不是要为所有的功能都写测试,如果是,那开发效率就太低了。
  • PHP 测试能操作页面内的 js 交互吗?
  • 后台的测试需要登录,能实现吗?

其实都很容易解决。

  • codeception 有良好的处理数据库的方式
  • 如果是新项目,建议从开始就做测试,可以自主决定哪些功能需要写测试。若是进行中的项目,可以逐步增加测试。
  • 页面内的 js 交互,大部分都是可以模拟的
  • codeception 有良好的办法解决登录问题

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注