2011-05-25 117 views
6

我正在尝试进入TDD领域,并且我正在测试一些用户模型的困难时间单元。我想测试我的模型的验证和业务要求如下:单元测试Dababase应用程序

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

所有要求是已经存在易于测试,除5之外,这要求数据库处于已知状态。我知道使用PHPUnit,我可以将我的数据库设置为使用XML文件的已知状态,但有没有更好的方法?

我想让我的数据库恢复到运行测试之前的状态(即在开发过程中)。我想我可以使用MySQL事务来回滚这些更改,或者我想我也可以使用两个单独的数据库,一个用于开发,一个用于测试。

我也读过某处不使用单元测试中的实际数据库连接,而是使用模拟数据。不太确定这是如何工作的。

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

感谢

编辑:

我想我会去与Ruby on Rails的做法和刚刚成立3个独立的数据库,生产,开发和测试。除非有人强烈反对。

+0

也许有点关系:http://stackoverflow.com/questions/5281418/using-mock-objects-in-php-inside-functions-that-instantiate-their-own-objects – edorian 2011-05-25 16:56:54

回答

3

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

你需要的是两个数据库。一个用于测试,一个用于开发。最佳做法是为您的单元测试设置一个公共超类,以建立数据库(可能位于新的模式中),然后在该数据库中运行所有数据库单元测试。你可以在之后清理它。

对于您提到的测试(用户名和电子邮件不能在数据库中存在),然后做这样的事情(psuedocode)。

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. 
+0

所以,你说有独立的数据库,一个用于测试,一个用于开发。还是你说要为两者使用相同的数据库?因为你提到有一个单独的测试和一个部署,但没有提到一个积极的发展。谢谢。 – BDuelz 2011-05-25 17:14:42

+0

那么通常你会在本地有两个数据库 - 一个用于私人开发,一个用于私人测试。测试人员将在每次测试中被拆除并重建。发展之一是来自活的克隆,可能每隔几天或几周刷新一次。 – monkjack 2011-05-25 20:44:42

+0

完美。谢谢。 – BDuelz 2011-05-25 21:21:35