【问题标题】:Unit testing PHP API connected to MySQL database单元测试连接到 MySQL 数据库的 PHP API
【发布时间】:2012-01-17 07:17:12
【问题描述】:
These 似乎没有多大帮助,所以我发布了。
我有一个 PHP API,可以进行 MySQL 插入、更新、选择等操作。基本上,每当我更改我的 PHP 代码来测试它时,我都必须使用假数据集(因为我不想破坏我的真实数据)和插入特定值,运行脚本,查看是否发生了必要的插入和选择,然后删除我刚刚添加的所有值并恢复数据库等,并在调试时重复。这是可行的,但需要永远。
有什么更好的方法吗?我都在听……
【问题讨论】:
标签:
php
mysql
unit-testing
debugging
api
【解决方案1】:
您是否在生产和测试中使用相同的数据库?
如果是,请为测试数据切换到单独的数据库。测试套件运行后,您可以删除整个数据库。使用 MySQL 的命令行工具使用干净的测试数据进行批量恢复。
【解决方案2】:
这是一个暂存/QA 环境的明确候选者。然后,您可以保留一个 .sql 文件,该文件为您提供虚拟数据集,并可以快速对其进行核对/修补。
如果您正在寻找实现此功能的方法,我建议您将生产环境镜像到虚拟机中。
【解决方案3】:
使用三种数据库环境:Development、Testing/Staging 和 Production。
当然,生产中的架构应该与测试/登台以及开发相同,减去您在开发中实际进行的更改。
根据上述情况,为您的数据库连接设置三个配置文件。即使您在本地工作并且需要在一台机器上同时拥有开发和声明数据库,也应该没问题,但是如果您可以将它们全部分开(前提是您在能够负担得起的公司环境中工作,或者您至少有其他盒子部署为测试服务器)
实施这种设置后,您真正要做的就是确保将开发更改传播到登台,并且您拥有三个配置文件。最好也为您的代码设置三个单独的文件夹。如果您使用的是 Windows,那么您可以创建一个批处理文件,以便在使用您的开发文件覆盖文件之前在暂存中自动创建备份(减去配置;如果您进行更改,请手动执行)
然后,当您需要测试模拟生产环境的内容时,您只需运行批处理文件,然后访问暂存主机进行测试。
【解决方案4】:
我正在尝试和你做同样的事情。
我找到了使用 PHPUnit 和 PHPUnit_Extensions_Database_TestCase 类的 PDO 连接代码的最佳解决方案。
您必须编写两种方法:getConnection() 和 getDataset()。您可以设置自己的连接,数据集可以是 XML 文件,带有一些静态数据(或真正的子查询)。该方法将截断选定的表,将值插入数据集中,然后将模型层连接设置为 getConnection() 以及它将在静态数据库中进行的所有操作。
然后,您可以断言表、断言数据集、断言结果数量,所有这些都可以比较您在数据库中的操作是否成功。
最后,PHPUnit 会将您的数据库恢复到原始状态。
有一个很好有趣的演示 here 说明了一些允许的方法。
【解决方案5】:
我想我理解您关于更改 PHP 代码的问题。
我的问题,为什么每次 PHP 代码发生更改时,您还要对数据库运行单元测试?
你的代码不是用 Layers (Multi-tier) 写的吗?
如果有,则将数据库替换为内存数据存储。