当我们这样做时,我们期望发生什么? 块引用>
除非我们重构现有代码,否则除非我们遇到失败的红色步骤,否则我们不允许编写任何代码。
有时,有必要迭代地解决我们正在处理的故事或功能(我交替使用的两个词)的一小部分。这通常意味着使用 PhpSpec 编写规范。有时,在整个故事(在接受级别上)通过之前,需要在集成或单元级别上进行多次迭代。这一切听起来很复杂,但事实并非如此。我坚信边做边学,所以我认为一旦我们开始编写一些实际的代码,一切都会变得更有意义。
我们将在四个不同的层面上编写故事和规范:
1. 验收
大多数时候,我们的功能套件将充当我们的接受层。我们在功能套件中描述功能的方式将与我们编写接受故事的方式(使用自动化浏览器框架)非常相似,因此会产生大量重复。
只要故事从客户的角度描述了行为,它们就可以作为接受故事。我们将使用 Symfony DomCrawler 来测试应用程序的输出。在本系列的后面,我们可能会发现我们需要通过也可以运行 JavaScript 的实际浏览器进行测试。通过浏览器进行测试增加了一些新的问题,因为我们需要确保在套件运行时加载小时测试环境。
2. 功能性
在我们的功能套件中,我们将可以访问Laravel应用程序,这非常方便。首先,它可以轻松区分环境。其次,不通过浏览器使我们的测试套件更快。每当我们想要实现一个新功能时,我们都会使用 Behat 在我们的功能套件中编写一个故事。
3. 集成
我们的集成套件将测试应用程序核心部分的行为,这些部分不一定需要访问 Laravel。集成套件通常是 Behat 故事和 PhpSpec 规范的混合体。
4.单位
我们的单元测试将用 PhpSpec 编写,并将测试应用程序核心的独立小单元。我们的实体、值对象等都会有规格。
案例
在本系列中,从下一篇文章开始,我们将构建一个跟踪时间的系统。我们将首先通过编写 Behat 特征来描述外部行为。我们的应用程序的内部行为将使用 PhpSpec 进行描述。
这两个工具一起将帮助我们对正在构建的应用程序的质量感到满意。我们将主要在三个层面上编写功能和规格:
功能性 集成 单位 在我们的功能套件中,我们将以无头模式抓取应用程序的 HTTP 响应,这意味着我们不会通过浏览器。这将使与 Laravel 交互变得更容易,并使我们的功能套件也充当我们的接受层。
稍后,如果我们最终拥有更复杂的 UI 并且可能还需要测试一些 JavaScript,我们可能会添加专用的验收套件。该系列仍在进行中,因此请随时在评论部分提出您的建议。
我们的设置
请注意,在本教程中,我假设您全新安装并运行了 Laravel (4.2)。最好您也使用 Laravel Homestead,这就是我在编写此代码时使用的。
在开始任何实际工作之前,让我们确保 Behat 和 PhpSpec 已启动并运行。首先,每当我开始一个新的 Laravel 项目时,我喜欢做一些清理工作并删除我不需要的东西:
git rm -r app/tests/ phpunit.xml CONTRIBUTING.md
登录后复制
如果您删除这些文件,请务必相应地更新您的
composer.json
文件:"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds"
]
},登录后复制
当然:
$ composer dump-autoload
登录后复制
现在我们准备好引入我们需要的 BDD 工具了。只需将
require-dev
部分添加到您的composer.json
:"require": {
"laravel/framework": "4.2.*"
},
"require-dev": {
"behat/behat": "~3.0",
"phpspec/phpspec": "~2.0",
"phpunit/phpunit": "~4.1"
},登录后复制
“我们为什么要引入 PHPUnit?”你可能在想?在本系列中,我们不会编写优秀的 PHPUnit 测试用例,但断言与 Behat 一起是一个方便的工具。我们将在本文后面编写第一个功能时看到这一点。
请记住在修改
composer.json
后更新依赖项:$ composer update --dev
登录后复制
我们即将完成安装和设置。 PhpSpec 开箱即用:
$ vendor/bin/phpspec run
0 specs
0 examples
0ms登录后复制
但是 Behat 需要使用
--init
选项快速运行才能设置所有内容:$ vendor/bin/behat --init
+d features - place your *.feature files here
+d features/bootstrap - place your context classes here
+f features/bootstrap/FeatureContext.php - place your definitions, transformations and hooks here$ vendor/bin/behat
No scenarios
No steps
0m0.14s (12.18Mb)登录后复制
第一个命令创建了一个闪亮的新
FeatureContext
类,我们可以在其中编写功能所需的步骤定义: