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

使用PHPUnit和半持久数据库进行单元测试,php,phpunit,Php,Phpunit,我是单元测试的新手,我正试图在现有的项目上开始使用PHPUnit 我面临的问题是,我有很多单元测试需要一个足够公平的数据库。我已经建立了一个SQLite数据库,其唯一目的是进行单元测试。有时我想删除并重新创建新测试的数据库(我指的是每个单独的类),以防止不必要的数据冲突 然而,如果我在同一个类中有相互依赖的单元测试,有时我不希望发生这种情况;这些可能需要访问以前测试中保存的数据 我目前在每个类的setUp()函数中获得一个“新鲜”数据库。我没有预料到的是,这个函数(与_construct()一样

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

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

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

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

有没有一种方法可以用每个测试类刷新数据库?还是整个过程我做得不对


非常感谢您提供的任何提示。

设置和拆卸功能完全按照您提到的那样执行,即为每次测试执行设置测试环境,然后在每次测试用例执行后进行清理

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


这可能不是获得真正独立单元测试的最佳方法(即,您可以为DB等设置模拟数据提供程序)。但是,这是您可以做的事情,应该可以满足您当前的需要。

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

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

基本上,我想用冗长的方式说的是,您应该将代码更改为易于测试,而不是试图强迫单元测试适合不是以测试驱动方式设计的代码。你现在投资的时间(如果可以的话)将在以后以股息回报


咬紧牙关,现在就重构

我在PHPUnit的自学中还没有走那么远,但我觉得你可能想看看@Dependes注释。我相信这可以让你指出一个测试取决于其他测试的结果,尽管我不确定它是否能保持从一个测试到下一个测试的状态。另外,请注意架构。直接与DB通信的对象集应该相当小,更高级别的对象使用DB对象进行间接通信。然后,在进行测试时,您可以模拟DB对象,让其他对象进行对话to@PeeHaa我读这篇文章是因为他使用sqlite数据库纯粹是为了测试。@PeeHaa我使用内存中的数据库进行测试