Grails "production" 数据源报告"test"数据源中未发生的问题



我们刚刚遇到(并解决了)一个仅由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并设置测试数据库),那就太好了。有什么建议吗?

我明白你的意思。在grails中,默认情况下测试环境用于单元测试和集成测试。您是否建议为单元测试和集成测试提供单独的环境?让单元测试在嵌入式数据库上运行似乎是一种常见的做法,这就是我问这个问题的原因。"

不,我想的是更高的层次。我的建议是你的刺激之路要始终如一。你不可能在开发和产品之间混合技术和版本,并期望拥有一个完善的工程系统。开发环境切换版本或技术的唯一情况是,如果您正在将代码行移动到新版本或技术上,以便在某个时候将其推向生产环境。在这种情况下,您通常仍然拥有一个与产品相匹配的开发环境,以防您在下一个版本(代码分支)上工作时出现产品缺陷。我总是让一个环境与prod保持同步,另一个环境将用于下一个版本。在一个完美的世界里,你甚至可以匹配硬件和数据,但这通常是不可行的,除非你是在一个需要的行业中。

我要说的是,如果对嵌入式数据库进行单元测试是一种常见的做法,但是生产环境中的其他东西是错误的,并且谁推动它是错误的

最新更新