【问题标题】:Test case writing测试用例编写
【发布时间】:2012-01-03 03:59:39
【问题描述】:

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

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

【问题讨论】:

    标签: mysql testing testcase


    【解决方案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,您还可以使用内存中的 DB 来执行 effective unit testing

    希望这会有所帮助。

    【讨论】:

    • 我正在为 Web 服务进行数据库开发任务,我的老板让我为我开发的每个查询编写测试用例。由于我是 DB 和测试用例编写的新手,所以我想了解更多细节。
    • 啊,好吧。在这种情况下,对您开发的内容进行一些单元测试还不够吗? Unitils 框架中的 DBUnit 或模块非常适合此目的。在这种情况下,你有自动化的单元测试,我猜这更相关。
    • 能否请您简要介绍一下您的 cmt,我无法正确理解,或者我无法达到您的目的
    • 我已经编辑了答案并添加了更多信息。希望这会有所帮助。
    【解决方案2】:

    不同的数据库有不同的测试套件。 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 结果)和手动检查查询结果来测试复杂查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多