1

如何为 SQL 查询编写测试用例?

  • 是否有任何程序或格式可以遵循。
  • 例如,我有一个带有复杂连接的插入查询,以及如何为此开发测试用例。
4

2 回答 2

1

这似乎很有趣,因为我不确定您的要求。

恕我直言,测试用例很适合为功能或系统测试(或一般的黑盒测试)编写。测试用例是需求规范或用户故事的翻译。在测试查询的情况下,我不确定我们是否需要编写测试用例(这变成了白盒测试)。在这种情况下,为他们编写单元测试比创建手动测试用例更好。可能是我在这里遗漏了一些东西。

但是考虑到您有我不知道的不同意见,以下是我的想法。

如果您的用户故事或需求规范明确讨论了连接的数量和类型、要使用的表等,那么您可以单独编写测试用例以检查是否存在任何偏差。例如。一个测试用例可以检查类型连接以检查它们是否符合要求,另一个测试用例可以验证所使用的表,以检查开发人员是否只使用了预期的表而不使用其他表。

编辑:如果您愿意编写单元测试,请查看对您有帮助的DBUnit

  1. 从单元测试用例轻松创建到数据库的连接
  2. 在 XML 中创建示例数据并将它们加载到您的表中
  3. 在执行一些数据库事务或在一个步骤中断言数据后验证数据

例如,考虑以下场景。你有一个学校的数据库。您现在已经编写了一个复杂的查询来检索学生列表。您必须检查此查询是否正常工作。然后,您可以使用 DBUnit 或Unitils创建一个单元测试用例,它将动态创建您的表并加载您的示例数据,执行您的查询,然后将结果集与您期望的数据进行比较。所有这些都在一个自动化的单元测试中。

这是 Unitils 的一个例子,

公共类 UserDAOTest 扩展 UnitilsJUnit4 {

@Test
@DataSet("UserDAOTest.testFindByMinimalAge.xml")
public void testFindByMinimalAge() {
    List<User> result = userDao.findByMinimalAge(18);        
    assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result);
}

}

在执行此测试之前,其中的示例数据"UserDAOTest.testFindByMinimalAge.xml"将被加载到您配置的表中,稍后将执行测试和其中的查询。同样,如果你使用注解@ExpectedDataSet而不是@DataSet这个xml中的数据,将用于测试执行后的结果集的比较。

如果您使用的是 JPA-Hibernate,您还可以使用内存数据库进行有效的单元测试

希望这可以帮助。

于 2012-01-07T11:12:33.680 回答
0

不同的数据库有不同的测试套件。MySQL / Percona Server / MariaDB 都使用 mysql-test-run 的变体:

http://dev.mysql.com/doc/mysqltest/2.0/en/mysql-test-run-pl.html

Drizzle 也使用了这个的变体:http: //docs.drizzle.org/testing/test-run.html

这些是简单的基于差异的测试。您编写您希望看到的查询,让运行程序执行它们,然后验证结果。您将预期的输出保存在 .result 文件中,并确保后续运行表现出相同的行为/结果。

您可能希望使用其他工具,例如随机查询生成器:

http://forge.mysql.com/wiki/RandomQueryGenerator

该工具的优势在于能够针对 Postgres 和 Javadb 系统以及基于 MySQL 的系统运行。

它还允许对 2 个服务器执行相同的查询。这允许人们通过针对被测服务器和受信任的实现(例如比较 Drizzle 与相同查询的股票 MySQL 结果)运行复杂查询来测试复杂查询,而不是手动检查查询结果。

于 2012-03-28T15:50:59.590 回答