我应该在暂存/生产环境中使用 PHPUnit 吗?


Should I use PHPUnit in a staging/production environment?

我已经安装了PHPUnit框架来执行单元测试。我已经编写了测试用例,并使用了现有的 PHPUnit 库进行测试。

是否需要在暂存和生产环境中配置 PHPUnit 框架?如果是这样,phpunit 测试框架和相关文件在暂存和生产中占用了内存,这是不必要的。

在本地

环境中使用 PHPUnit 测试框架就足够了吗?

如果你把你的单元测试放在它们自己的顶级子目录中(例如,请参阅你如何管理项目中的单元测试文件?你把它们添加到 git 中吗?),那么你可以在 git 签出后简单地删除tests目录。或者,如果使用 ftp,则 ftp 除该目录之外的所有其他目录。或者如果使用 rsync,则--exclude=tests/ .

但是,我发现我不同意到目前为止回复的其他人。为了让您高枕无忧,在暂存服务器和生产服务器上运行单元测试可能非常有用。如果测试在开发服务器上通过,但在暂存或生产中失败,则会出现大红旗。最好让你的单元测试告诉你实时服务器上的一个依赖项是不同的版本,而不是让你的客户为你发现它!

但是,这需要小心。如果任何单元测试不是自包含的,则不得运行它们。显而易见的情况是,如果他们使用数据库,并且单元测试不会从创建该数据库(其名称永远不会与生产数据库冲突)开始,而是通过删除它结束。另一种情况是直接或间接导致磁盘文件更新的任何测试。特别是考虑任何执行日志记录的函数。您应该注意的另一种类型的测试是那些需要很长时间才能完成或使用大量 CPU 或内存的测试。确保在生产服务器处于活动状态并遇到负载时永远不会运行这些服务器。

一个想法是制作一份明确列出那些安全且没有副作用的测试的phpunit.xml.dist的副本。然后用phpunit --configuration production_tests.xml运行它。或者,在测试中,使用 @group 标记安全或不安全的测试函数,然后是 phpunit --group safe_for_productionphpunit --exclude-group modifies_db

我想理想的情况是你有 3 个级别:开发、暂存和生产。

开发是你保留phpunit和调试器的地方,但这台机器可能与生产完全不同。例如,在这里您可以在Windows上进行开发,即使您打算在ubuntu上部署

暂存机也可以保留phpunit和调试器,但它必须具有非常接近的架构,如果不是与服务器相同,并且可以访问真实数据库的副本。它必须具有与生产服务器相同的Linux风格,相同版本的apache/php/mysql/libraries。访问真实数据有时也会有所作为。

生产计算机不应具有 phpunit 或调试器工具。作为开发人员,它甚至不应该在您控制之下。也许首席开发人员和系统管理员正在那里部署代码并根据需要微调应用程序,并准备回滚或其他紧急情况。

No.正如GordonM所提到的,这样做对安全性不利。此外,您应该在将其放入生产环境之前对其进行测试,那么为什么要这样做。一些调试工具(不是特定的PHPUnit,而是其他一些)也会降低应用程序的效率。