我刚开始测试rails并且我不明白为什么或何时应该使用fixtures(或工厂)而不是仅仅为了测试数据库并查询它来运行测试?
在许多情况下,在开发和测试环境中使用相同的数据应该更快更容易。
例如,如果我想测试索引页面,我应该通过工厂创建100条记录,还是应该为数据库播种100条记录?
我有人可以澄清一下,这会很棒。
谢谢!
答案 0 :(得分:4)
这实际上是一个关于如何有效测试的更深层次的问题,你会发现很多不同的意见。
在单元测试中避免数据库的原因仅仅是速度。数据库操作很慢。一次测试看起来似乎并不慢,但是如果你有持续的集成(你应该),或者你做了一个快速的改变,只是想看看会发生什么,那些延迟就会增加。所以更喜欢模拟真正单元测试代码。
然后你自己的集成测试应该打到一个内存数据库,而不是真正的数据库 - 出于同样的原因,速度。这些将比您的模拟测试慢,但仍然比击中真实数据库更快。在开发时,构建测试部署周期需要尽可能快。请注意,有些人也称这些单元测试。我不会,但我想这只是语义。
开发人员为开发人员提供了前两种测试。
然后测试人员将访问真实数据库,该数据库将填充测试人员和主题专家定义的测试数据。有很多聪明的方法可以加快速度,但这将是他们测试代码与类似生产的数据库集成的地方。如果所有的内存数据库测试都通过了,并且出现了问题,那么您就知道它与数据库配置,特定于供应商的SQL等有关,而不是从根本上说是坏事。您也将第一次体验到性能如何。
请注意,我在这里所说的一切都是一个有争议的问题。但希望它澄清了你应该考虑什么时候做某些事情以及为什么。