使用TSQLUNIT进行SQL单元测试:您是否需要复制SQL代码?

uin*_*inc 2 sql t-sql sql-server unit-testing

我正在考虑为我的Tsql存储过程编写一些单元测试,我有两个问题:

  1. 我将不得不编写大量的SQL来创建测试夹具(在_setup程序中准备的测试数据)

  2. 我将不得不在测试过程中"重写"我的查询以获得结果以与我正在测试的存储过程的结果进行比较.

考虑到我的数据库有数百个表和非常复杂的存储过程...我不知道这将如何节省我的时间?有什么想法吗?我错过了什么吗?还有其他方法吗?

小智 6

当管理人员推动快速发布而不是增加项目范围和预算以强调稳定性时,自动化单元测试通常会被搁置.事实是,单元测试需要时间.根据我的经验,其好处远远超过任何缺点.在外部系统调用存储过程的情况下,单元测试对于消除无法预料的问题并在集成测试之前保证稳定性非常宝贵.

关于你的担忧:

  1. 如果将运行单元测试之前可以读取的XML文件中的存储过程进行单元测试所需的任何数据,则可以使用标准API例程读取数据以读取XML数据并可能重新读取数据.将数据用于多个测试.在事务上下文中运行每个测试,该事务在测试结束时回滚,以允许在测试运行开始时配置一次整体环境,而不必为每个单独的测试执行大量步骤.单元测试可以与自动夜间构建过程捆绑在一起,以进一步防范代码.

    最初会有一些开销,但随着您和您的团队更熟悉单元测试概念以及如何利用可重用性,这将随着时间的推移而减少.

  2. 您不需要重新编写查询来比较结果.标准方案可能如下所示:

    1. 加载测试数据并准备环境
    2. 开始交易
    3. 使用测试数据运行存储过程
    4. 使用Assert语句将实际输出与预期输出进行比较
    5. 如果实际和预期输出不匹配,则测试失败
    6. 如果实际和预期输出匹配,则测试通过
    7. 回滚事务
      / ...
      重复步骤2到7进行任何其他测试
      ...... /
    8. 清理测试环境

    请记住,您正在测试一组寻找通过/失败的特定条件,因此可以在测试例程中对预期值进行硬编码.

希望这可以帮助,

法案