我们遇到了(并解决了)仅由PostgreSQL的JDBC驱动程序报告的问题。内存中的H2数据库通过了测试,但是当我们在DataSource.groovy
中更改我们的测试数据库以匹配生产时,它失败了。
// this data source allows a bug discovered in production to be hidden,
// but can be run without additional setup
inMemoryTest {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
// this data source reproduces the bug in production, but requires
// additional setup
cloneOfProductionTest {
dataSource {
dbCreate = "create-drop"
driverClassName = "org.postgresql.Driver"
username = "postgres"
password = "****"
url = "jdbc:postgresql://localhost/IntegrationTestDB"
}
}
对于记录,错误是我们没有在一对多关联上映射'belongsTo'字段,并且删除没有正确级联。 H2允许删除所有者,而PostgreSQL以org.postgresql.util.PSQLException
失败。我们通过正确地对依赖类进行建模来修复它,现在删除级联就好了。
显然我喜欢尽早发现错误,目前我们的测试数据源是生产错误的克隆。看起来似乎是一种解决方法,如果运行测试的开发人员没有任何事先设置(即安装PostgreSQL并设置测试数据库),那么测试可靠是不错的。有什么建议吗?
答案 0 :(得分:0)
“我明白你的意思。默认情况下,在grails中,测试环境用于单元测试和集成测试。你的建议是单独的环境用于单元测试和集成测试吗?单元测试运行似乎是一种常见的做法在嵌入式数据库上,这就是我问的原因。“
不,我在想更高的水平。我的建议是你的生产之路是一致的。你不能在dev和prod之间混合技术和版本,并期望拥有一个完善的系统。如果您正在努力将代码行移动到新版本或技术,那么开发环境唯一可以切换出一个版本或技术,以便您可以在某个时刻将其推向生产。在这种情况下,您通常仍会拥有一个与生产相匹配的开发环境,以防您在下一个版本(代码分支)工作时出现生产缺陷。我始终保持环境与prod和下一个版本的另一个环境同步。在一个完美的世界中,你甚至可以匹配硬件和数据,但这通常是不可行的,除非你是一个需要的起搏器类型的业务。
我会说,如果通常的做法是将单元测试与嵌入式数据库进行对比,那么生产就会出现在其他错误做法的事情上,以及谁在推动它是错误的。