【问题标题】:PHPSpec and BehatPHPSpec 和 Behat
【发布时间】:2021-11-08 03:57:16
【问题描述】:
我刚开始学习 BDD 的概念。
我为此学习了 PHPSpec 和 Behat,但我不清楚为什么我需要同时使用这两者。我知道 behat 用于功能/验收测试,而 PHPSpec 主要用于单元测试,但我在此找到的文章和视频基本上是对代码进行两次测试:一次使用 behat(带有场景),一次使用 phpspec。有人可以用简单的例子向我解释一下有什么区别,什么时候需要使用 behat 和 whan phpspec?
提前感谢您的回答,
兄弟。
【问题讨论】:
标签:
php
unit-testing
testing
behat
phpspec
【解决方案1】:
好吧,在开始回答之前,我想指出,下面是一个比“phpspec and behat”更普遍的答案。
正如您所说的那样,phpspec 是一种旨在编写单元测试的工具,而 behat 则是用于其他类型的测试(比如说从集成到 e2e/smoke 测试)。到目前为止,一切都很好。所以现在我们可以抽象和区分单元测试工具和其他测试工具。
让我们开始定义什么是单元测试,什么不是。单元测试是针对系统的“小”部分(单元)进行的一种测试。通常它的重点是单个类或方法(但并不总是如此)。单元测试在运行快速和隔离时促进快速重构。请注意快速和隔离,我们会尽快回复。
其他类型的测试更繁琐,并且旨在测试某些组件之间的交互,或整个功能,或用户使用它的“整个”系统。为什么麻烦?因为你可能需要设置一个数据库,你可能需要运行一个网络服务器,你可能需要一个像 selenium 这样的浏览器模拟器,等等。因此,这些测试比单元测试要慢得多。此外,当除单元之外的其他测试出现错误时,由于您具有“整体”功能,因此寻找错误会更加痛苦,而对于单元测试,至少,您知道什么类(或其中的一组)是导致错误。
说了这么多,还记得关于单元测试速度和隔离的说法吗?好吧,速度可以帮助您“更快地失败”(您无需等待整个系统引导,无论它对您的项目意味着什么)并以更“本地化”的方式(隔离)失败。
我的建议是遵循test pyramid:大量的单元测试(所有可能的 I/O 排列,例如,一个方法)并且只对集成及以上有价值的测试。举个例子:您可以针对特定查询测试存储库(与 DB 交互,因此您不能对单元执行某些操作),您可以测试要访问的登录页面或主页(作为应用程序的状态健康)等等。
我的回答只是一个简短的总结;希望这能推动您朝着正确的方向前进。