php - 使用 PHPUnit 和半持久数据库进行单元测试

标签 php phpunit

我是单元测试的新手,我正尝试在我正在处理的现有项目中开始使用 PHPUnit。

我面临的问题是我有很多单元测试需要足够公平的数据库。我已经为单元测试的唯一目的设置了一个 SQLite 数据库。有时我想为新测试删除并重新创建数据库(我指的是每个单独的类),以防止不必要的数据冲突。

但是,如果我在同一个类中有相互依赖的单元测试,有时我不希望这种情况发生;这些可能需要访问在先前测试中保存的数据。

我目前正在每个类的 setUp() 函数中获取一个"new"数据库。我没有预料到的是这个函数(与 __construct() 一样)会在所述类中的每个测试用例之后运行。

有没有一种方法可以让每个测试类都刷新数据库?还是我错误地处理了整个过程?

感谢任何提示,谢谢。

最佳答案

我最近(大约一年前)也开始使用 PHPUnit。我做的第一件事是为我当时从事的项目设置单元测试。我决定也测试数据访问层是个好主意,并为您做了类似的事情。我花了几天时间来设置,最后我完成了需要 8 分钟才能运行的单元测试!其中 99% 的时间都花在了设置和拆除测试数据库上。真是一场灾难!

我所做的是重构项目,以便实际上只有一个类需要与数据库对话并为此进行集成测试,但没有单元测试。这意味着我的项目现在必须使用依赖注入(inject)来促进测试。我最终得到了一套在大约 2-3 秒内运行的测试和一个实际上是自己编写的项目。维护和更改/添加是一个梦想,我希望我的所有代码都是这样编写的。

基本上,我想用冗长的方式说的是,您应该更改代码以使其易于测试,而不是尝试强制单元测试以适应并非以测试驱动方式设计的代码。您现在(如果可以的话)投资于此的时间将在以后以股息返回!

现在咬紧牙关重构!

关于php - 使用 PHPUnit 和半持久数据库进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11726045/

相关文章:

php - 将来自 PHP 的文件包含在 jQuery 的对话框中会误导 javascript

testing - PHPUnit/DBUnit 句柄时间戳列

PHPUnit、接口(interface)和命名空间 (Symfony2)

PHPUnit 无法打开输入文件

php - 在没有额外标记的情况下,在 SQL 中保留回车以供 HTML 显示?

XAMPP Windows 上的 Php Cron 作业

php - WordPress插件国际化: variables not translated?

php - 多次运行 PHPUnit 测试用例

unit-testing - 在 Laravel 中单元测试 Controller 而不测试路由的最佳方法是什么

php - 根据常见日期循环遍历 MySQL 数据