有一些问题的建议解决方案"如何在应用程序中测试SQL语句" -
第三个是可行的,我调查了Test Containers,这实际上是一个美丽的解决方案,但是相对较新的解决方案。因此,我们公司对采用它持怀疑态度。
我们使用Mybatis
来访问PostgreSQL
。
另一种方法是在测试之前重新创建整个模式并填充所需的表。这是问题,我可以创建和删除具有相同名称的表的模式。为了避免名称冲突,我必须更改模式的名称,因此,甚至应该重命名查询,这些查询根本不是首选。有没有办法在不更改查询的情况下执行此操作,而是将它们指向虚拟架构。
答案 0 :(得分:1)
您可以定义用于测试目的的数据库配置,并连接到您的真实数据库基础以进行执行测试。您应该访问测试类中的测试数据库配置。
例如,如果使用spring和hibernate连接数据库,则可以定义测试hibernate配置xml文件,并将其连接到测试数据库。然后在测试类中,使用以下配置文件:@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguratiion({testHibernate.xml, testSpring.xml , .... })
@TestExecutionListeners({...})
public class TestClass {
....
@Test
public void test1(){
...
}
}
因此,您可以访问测试hibernate会话工厂来执行查询。
答案 1 :(得分:1)
您不应该更改您的查询。在测试中,您应该只更改应用程序将使用的连接URL。问题是,如何让网址正常工作。
要获得完整的测试覆盖率,您需要相同的数据库(如您所见,h2和其他内存数据库不兼容)。 postgres没有内存模式,因此您必须自己管理生命周期。你必须做出一些决定。其中一些:
您将从哪里获取数据库:要求所有开发人员提供postgres(安装/ docker / vagrant)或自动设置?
如何为测试准备db:手动架构设置和清理?
如何在测试之间重置db:restart?总是回滚?预定义和单独定义的内容?某种逆向操作?
是否以及如何快速进行这些测试?
有一些工具可以帮助您解决一些问题:
testcontainers会帮助您提供 分贝。
dbunit - 将帮助您准备测试数据。
缺点:testegration - 旨在为您提供完整,随时可用且可扩展的生命周期(披露:我是创作者)。
缺点:你也可以自己填补空白。一如既往,它是一种交易:时间与金钱