由于测试污染导致集成测试失败(测试通过或失败,具体取决于它们运行的顺序)。
令我感到困惑的是,似乎我用mockDomain(Media.class,[new Movie(...)])
模拟了一些数据的单元测试仍然存在并且可用于其他测试,甚至是集成测试。
这是预期的行为吗?为什么测试框架不会在每次测试后自行清理?
修改
非常奇怪,文档说明:
集成测试与单元测试的不同之处在于您可以完全访问测试中的Grails环境。 Grails将使用内存中的HSQLDB数据库进行集成测试,并在每次测试之间清除数据库中的所有数据。
然而,在我的集成测试中,我有以下代码
protected void setUp() {
super.setUp()
assertEquals("TEST POLLUTION!",0,Movie.count())
...
}
这给了我输出:
TEST POLLUTION! expected:<0> but was:<1>
意味着在不存在数据时存在数据!
查看Movie.list()中存在的数据,我发现数据对应于先前测试中的数据集(单元测试)
protected void setUp() {
super.setUp()
//mock the superclass and subclasses as instances
mockDomain(Media.class,[
new Movie(id:1,name:'testMovie')
])
...
}
为什么我会遇到这些问题?
答案 0 :(得分:1)
污染也可能存在于测试数据库中。检查DataSources.groovy
以查看测试环境的用途。如果你将它设置为使用数据库在哪里
dbCreate
设置为"create-drop"
之外的其他内容,数据库的任何先前内容也可能会显示。
如果是这种情况,污染来自完全不同的来源。它实际上来自数据库,而不是来自单元测试,但是当切换到运行集成测试时,您将连接到包含其包含的所有数据的真实数据库。
我们遇到了这个问题,因为我们的测试环境设置为dbCreate
为"update"
。这个为集成测试设置的原因让我很困惑,所以我转而使用dbCreate
作为"create-drop"
,并确保在运行测试套件时我们开始使用干净的数据库。