针对特定供应商数据库测试我们的自定义 SQL 非常重要
因此,您应该为每个供应商数据库创建一套测试
@RunWith(Suite.class)
@Suite.SuiteClasses({})
public class SQLServerTestSuite {
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
// clean database
}
}
是否应该将单个数据库专用于所有正在运行的测试,但没有提交?
建议您执行 SQL 命令但使用回滚命令,因为如果使用提交,您可以更改当前测试的状态以及更改其他测试的状态。否则,您可以处理意外行为。
对于每个开发人员,建议使用database sandbox。这允许每个用户以他们认为合适的任何方式修改数据库并使用测试来运行应用程序而不必担心他们的测试与其他用户的测试之间的任何交互
人们如何处理设置和拆卸?
public class PersonTest {
@Before
public void setUp() {
// set up state to run the test
}
@After
public void teardown() {
// Transaction rollback
}
}
Transaction rollback pattern 的好处在于 它使数据库保持与我们开始测试时完全相同的状态无论我们对数据库内容进行了哪些更改
DBUnit 还在流行吗?
DBUnit 用于将数据库表与包含以下内容的 XML 文件进行比较
预期值。您应该记住 DBUnit 处理手动编码的设置。然而,尽管这种方法更彻底开发和维护这类测试非常繁琐。此外,测试不会检测到新添加的字段或属性的缺失映射。
Spring 有什么帮助?
Spring 内置了对事务回滚模式的支持,并支持命名参数 (SqlParameterSource),例如,它允许您将纯 jdbc 查询外部化为每个供应商数据库的多行可读 xml 文件
<?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";
}
对于动态查询,检测查询逻辑中的错误通常很重要,例如使用 。为了捕捉这些类型的错误,我们需要编写用测试数据填充数据库的测试,执行查询,并验证它是否返回了预期的对象。不幸的是,这类测试的编写和执行都很耗时。