单元测试Dababase应用程序

BDu*_*elz 6 tdd phpunit unit-testing

我正试图进入TDD领域,而且我很难对我拥有的一些用户模型进行单元测试.我正在尝试测试我的模型的验证,业务要求如下:

  1. > = = 6个字符的用户名
  2. > = 5个字符的密码,至少包含1个字母和数字
  3. 需要有效的电邮格式
  4. ... 等等等等等等
  5. 用户名和电子邮件不能存在于数据库中

所有要求都很容易测试,除了5,这要求数据库处于已知状态.我知道使用PHPUnit我可以使用XML文件将我的数据库设置为已知状态,但是有更好的方法吗?

我想要的是让我的数据库恢复到运行测试之前的状态(即在开发期间).我想我可以使用MySQL事务来回滚更改,或者我想我也可以使用两个独立的数据库,一个用于开发,一个用于测试.

我还读到了在单元测试中不使用实际DB连接的地方,而是使用模拟数据.不太确定它是如何工作的.

有人可以向我解释我有不同的选择,哪些是最好的路线?

谢谢

编辑:

我想我将采用Ruby on Rails方法,只需设置3个独立的数据库,即生产,开发和测试.除非有人强烈反对.

mon*_*ack 3

有些人说不要在数据库上进行测试,而像我这样的其他人则说这是你知道 DAO 代码是否良好的唯一方法。

你需要的是两个数据库。一份用于测试,一份用于开发。最佳实践是为您的单元测试提供一个公共超类,用于设置数据库(可能初始化一个新模式),然后所有数据库单元测试都在该数据库中运行。之后就可以清理掉了。

对于您提到的测试(用户名和电子邮件不能已存在于数据库中),然后执行类似的操作(伪代码)。

Create user with username that you know doesn't exist (say username-largerandomuuid)
Insert user.
Assert user was created

Insert same user(name)
Assert error is thrown.
Run Code Online (Sandbox Code Playgroud)