我想为我的所有CRUD创建测试。但是如何为它们设置单独的数据库?这是最好的方式吗?
这是另一个问题,但它是相关的:我是否应该在生产服务器中运行测试?有时在不同的环境中事情会出错,所以我想我应该这样做。但后来我需要提到的单独的数据库,对吗?
有什么建议吗?
答案 0 :(得分:10)
在生产服务器上运行任何类型的测试通常都是一个坏主意(除非它只是尚未进行调试的生产硬件)。
单元测试未命中数据库(或任何其他外部系统)。因此,为了创建单元测试,您需要删除对数据库的依赖。
你所谓的'单元测试'可能是一个集成测试。任何利用外部系统(例如数据库,文件系统等)的测试都是集成测试。
您的问题的两个常见解决方案是:
在测试开始时,恢复包含的数据库备份 已知数据到单独的测试数据库,然后执行测试 反对它。
在每次测试开始时使用“已修复”的已知测试数据库 一个事务,执行测试,然后回滚事务 让数据库处于相同的已知状态。
(通常优选1号,因为(2)中的数据库可能变为“污染”)。
答案 1 :(得分:3)
我同意米奇的观点。我想补充一点,你应该决定你是要进行集成测试还是单元测试(或两者兼而有之,但不是在同一个测试中)。事实上,如果您确实想要进行单元测试,请实现:
单元测试不只是测试您的代码。这实际上很容易。更难的部分是使你的代码可以测试。
我建议前往http://artofunittesting.com/并观看右侧“单元测试视频”标题下的免费视频。忘记他在.NET工作的事实,因为它是重要的原则。
然后观看Misko Hevery的GoogleTechTalks,他解释了为什么要进行依赖注入。
Design Tech Talk Series Presents: OO Design for Testability
The Clean Code Talks -- Unit Testing
(他也有更多。有一个series of six GoogleTechTalks。)
答案 2 :(得分:3)
我今天遇到了类似的问题,我认为我找到了一个很好的解决方案。
我的测试配置示例(可能会有所不同,具体取决于您是否有多个db-s等)
doctrine:
dbal:
dbname: test_db
php app/console doctrine:schema:update --force --env=test
更新数据库以反映应用程序中的实体(如果您刚刚创建新数据库以及每次更改应用程序模型时都需要)。您的应用程序现在应该在单元测试期间使用测试数据库。 NB!在搞乱实时数据库之前,请务必备份数据库。
然而,如前所述,这些不再是单元测试,而是集成测试。