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

时间:2012-07-30 16:53:50

标签: php phpunit

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

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

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

我目前在每个类的setUp()函数中获得一个“新鲜”的数据库。我没想到的是这个函数(与__construct()一样)将在所述类中的每个测试用例之后运行。

有没有办法可以用每个测试类刷新数据库?或者我是否错误地了解整个过程?

感谢任何提示,谢谢。

2 个答案:

答案 0 :(得分:3)

我最近也开始使用PHPUnit(大约一年前)。我做的第一件事就是为我当时正在进行的项目设置单元测试。我认为测试数据访问层也是一个好主意,并对你做了类似的事情。我花了几天时间才完成设置,最终我进行了8分钟的单元测试! 99%的时间用于设置和拆除测试数据库。真是个灾难!

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

基本上,我想用长篇大论的方式说的是你应该改变你的代码以便于测试,而不是试图强制单元测试以适应不是以测试驱动方式设计的代码。你现在投资的时间(如果可以的话)将在稍后用股息偿还!

咬紧牙关,现在重构!

答案 1 :(得分:2)

setUp和tearDown函数正如您所提到的那样,即为每个测试执行设置测试环境,然后在每个测试用例执行后进行清理。

您可能想要做的是在套件级别设置数据库数据提供程序。

Suite level fixtures

这可能不是真正做到真正的隔离单元测试的最好方法(即你可以为DB等设置模拟数据提供程序)。但是你可以做的就是满足你的直接需求。