我使用的很多web应用程序都是由后端复杂程度不同的数据库驱动的.通常,有一个ORM层与业务和表示逻辑分开.这使得业务逻辑的单元测试相当简单;事情可以在离散的模块中实现,测试所需的任何数据都可以通过对象模拟来伪造.
但是测试ORM和数据库本身总是充满问题和妥协.
这些年来,我try 了一些策略,但没有一个能让我完全满意.
使用已知数据加载测试数据库.针对ORM运行测试,并确认返回的数据正确.这里的缺点是您的测试数据库必须跟上应用程序数据库中的任何模式更改,并且可能不同步.它还依赖于人工数据,并且可能不会expose 由于愚蠢的用户输入而发生的错误.最后,如果测试数据库很小,它不会揭示诸如缺少索引之类的低效问题.(好的,最后一个并不是单元测试应该用来做的,但也没什么坏处.)
加载生产数据库的副本并对其进行测试.这里的问题是,您可能在任何给定时间都不知道生产数据库中有什么;如果数据随着时间的推移发生变化,您的测试可能需要重写.
有人指出,这两种策略都依赖于特定的数据,单元测试应该只测试功能.为此,我看到了一些建议:
- 使用模拟数据库服务器,并且只判断ORM是否发送了正确的查询来响应给定的方法调用.
您使用了什么策略来测试数据库驱动的应用程序(如果有的话)?什么对你来说效果最好?