测试用例写作

时间:2012-01-03 03:59:39

标签: mysql testing testcase

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

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

2 个答案:

答案 0 :(得分:1)

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

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

然而,考虑到你有一个我不知道的不同意见,以下是我的想法。

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

编辑:如果您愿意编写单元测试,请查看DBUnit哪些可以帮助您

  1. 从单元测试用例轻松创建与DB的连接
  2. 以XML格式创建示例数据并将其加载到表格
  3. 在执行某些数据库事务或单步执行数据后验证数据
  4. 例如,请考虑以下方案。你有一所学校的DB。您现在已经编写了一个复杂的查询来检索学生列表。您必须检查此查询是否正常工作。然后,您可以使用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,您也可以使用内存数据库执行effective unit testing

    希望这有帮助。

答案 1 :(得分: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结果进行比较)和手动检查查询结果来测试复杂查询。