gpt4 book ai didi

java - Java 敏捷集成测试 DAO -> 数据库的最佳实践是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:35:09 25 4
gpt4 key购买 nike

针对 Java 环境中的真实数据库模式对 DAO 进行敏捷集成测试的当前良好实践是什么?

(我所说的“敏捷”是指对这个问题最精简、最自动化和最简单的解决方案)。

我希望实现测试自动化,证明数据访问层与数据库的实际运行实例无缝集成。我们针对特定供应商数据库测试自定义 SQL 非常重要。 IE。如果我们编写 T-SQL,我们希望针对 SQL Server 进行测试。

是否应该将一个数据库专用于所有正在运行的测试,但不进行提交?或者每个测试环境都应该有一个专用的数据库吗?

人们如何处理设置和拆卸? DBUnit 还在流行吗? Spring 有何帮助?

最佳答案

It is important that we test our custom SQL against specific vendor DBs

所以你应该为每个供应商数据库创建一套测试

@RunWith(Suite.class)
@Suite.SuiteClasses({})
public class SQLServerTestSuite {

@BeforeClass
public static void setUpClass() throws Exception {

}

@AfterClass
public static void tearDownClass() throws Exception {
// clean database
}

}

Should a single database be dedicated to all running tests, but with no commits ?

建议您执行 SQL 命令但使用回滚命令,因为如果使用提交,您可以更改当前测试的状态以及更改其他测试的状态。否则,您可以处理意外行为。

对于每个开发者,推荐一个 database sandbox .这允许每个用户以他们认为合适的任何方式修改数据库并使用测试来运行应用程序,而不用担心他们的测试与其他用户的测试之间的任何交互

How do people deal with setup and teardown ?

public class PersonTest {

@Before
public void setUp() {
// set up state to run the test
}

@After
public void teardown() {
// Transaction rollback
}

}

关于 Transaction rollback pattern 的好处是它让数据库处于与我们开始测试时完全相同的状态,不管我们对数据库内容做了什么更改

Is DBUnit still in popular use ?

DBUnit 用于将数据库表与包含以下内容的 XML 文件进行比较预期值。您应该牢记 DBUnit 处理手工编码的设置。然而,尽管这种方法更彻底,开发和维护这些类型的测试非常繁琐。此外,测试不会检测新添加的字段或属性的缺失映射。

How could Spring help ?

Spring 内置了对事务回滚模式的支持,并支持命名参数(SqlParameterSource),这允许您在多行和可读的 xml 文件中为每个供应商数据库外部化普通的 jdbc 查询,例如

<?xml version="1.0" encoding="UTF-8"?>
<queries>
<query name="PERSON_BY_ID">
<![CDATA[
select
*
from
PERSON
where
PERSON.ID = :integerId
]]>
</query>
</queries>

注意查询参数。它遵循 JavaScript 代码风格,您将参数的种类声明为前缀。现在您可以创建一个类,在其中定义命名查询集

public class SQLServerQuery {

public static final String PERSON_BY_ID = "PERSON_BY_ID";

}

对于动态查询,检测查询逻辑中的错误通常很重要,例如使用 < 而不是 <=。为了捕捉这些类型的错误,我们需要编写测试,用测试数据填充数据库,执行查询,并验证它是否返回预期的对象。不幸的是,这类测试的编写和执行都很耗时。

关于java - Java 敏捷集成测试 DAO -> 数据库的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3775287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com