PHPSpec 和 Behat

PHPSpec and Behat

我刚开始学习 BDD 的概念。

我为此学习了 PHPSpec 和 Behat,但我不清楚为什么我需要同时使用两者。我知道 behat 用于 functional/acceptance 测试,而 PHPSpec 主要用于单元测试,但我在此找到的文章和视频基本上是对代码进行两次测试:一次使用 behat(使用场景),一次使用 phpspec .有人可以用简单的例子向我解释有什么区别,我什么时候需要使用 behat 和 whan phpspec?

提前感谢您的回答, Br.

好吧,在开始回答之前,我想指出以下是比“phpspec and behat”回答更笼统的回答。

正如您正确指出的那样,phpspec 是一种旨在编写单元测试的工具,而 behat 是用于其他类型测试的工具(比如从集成到 e2e/smoke 测试)。到目前为止,一切都很好。所以现在我们可以抽象和区分单元测试工具和其他测试工具。

让我们开始定义什么是单元测试,什么不是。单元测试是针对系统的“小”部分(单元)进行的一种测试。通常它的重点是单个 class 或方法(但并非总是如此)。单元测试促进快速重构,因为它们 运行 快速 隔离 。请关注 fastisolation,我们会尽快回复他们。

其他类型的测试更加繁琐,并且面向测试某些组件之间的交互,或者整个功能,或者用户将使用它的“整个”系统。为什么麻烦?因为您可能需要设置一个数据库,您可能需要 运行 一个网络服务器,您可能需要一个像 selenium 这样的浏览器模拟器,等等。因此,这类测试比单元测试慢得多。此外,当其他测试而不是单元出现错误时,由于您具有“完整”功能,因此查找错误会更加痛苦,而对于单元测试,至少您知道 class (或组其中)导致错误。

话虽如此,还记得关于单元测试速度和隔离的说法吗?好吧,速度可以帮助您“更快地失败”(您不需要等待整个系统 bootstrap,无论这对您的项目意味着什么)并以更“本地化”的方式(隔离)失败。

我的建议是遵循 test pyramid:大量的单元测试(I/O 的所有可能排列,例如,方法的排列)以及仅对集成及以上有价值的内容。举个例子:您可以针对特定查询测试存储库(与数据库交互,因此您无法使用单元进行操作),您可以测试要访问的登录页面或主页(作为应用程序的状态)健康)等等。

我的回答只是一个简短的总结;希望能引导您朝着正确的方向前进。