我们刚刚遇到(并解决了)一个问题,这个问题只由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。我们通过正确地对依赖类进行建模来修复它,现在删除操作可以很好地级联。
显然,我喜欢及早发现bug,目前我们的测试数据源是生产数据源的克隆。不过,这看起来像是一种变通办法,如果不需要运行测试的开发人员预先进行任何设置(例如,安装PostgreSQL和设置测试数据库),就能让测试变得可靠,那就更好了。有什么建议吗?
发布于 2014-07-16 04:47:04
“我明白你的意思。在grails中,默认情况下,单元测试和集成测试都使用测试环境。您的建议是将单元测试和集成测试分开的环境吗?让单元测试在嵌入式数据库上运行似乎是一种常见的做法,这就是我问的原因。”
不,我想的是更高的层次。我的建议是,你的prod之路是一致的。你不能在dev和prod之间混用技术和版本,并期望拥有一个完善的工程系统。只有当您正在将代码行移动到新版本或新技术以便在某个时刻将其推向生产时,开发环境才会切换到某个版本或技术。在这种情况下,你通常仍然会有一个与生产相匹配的开发环境,以防在你工作于下一个版本(代码分支)时出现生产缺陷。我始终保持一个环境与prod同步,另一个环境用于下一个版本。在一个完美的世界里,你甚至可以匹配硬件和数据,但这通常是不可行的,除非你在pace maker类型的业务中,这是一种需求。
我要说的是,如果单元测试是针对嵌入式数据库的常见做法,但生产是在实践错误的其他东西上进行的,那么谁推动它就是错误的。
https://stackoverflow.com/questions/24766389
复制相似问题