使用TSQLUNIT进行SQL单元测试:don';您不需要复制SQL代码吗?

使用TSQLUNIT进行SQL单元测试:don';您不需要复制SQL代码吗?,sql,sql-server,unit-testing,tsql,Sql,Sql Server,Unit Testing,Tsql,我正在考虑为我的Tsql存储过程编写一些单元测试,我有两个顾虑: 我将不得不编写大量SQL来创建测试装置(在设置过程中准备的测试数据) 我必须在测试过程中“重写”我的查询,以获得与我正在测试的存储过程的结果进行比较的结果 考虑到我的数据库有数百个表和非常复杂的存储过程。。。我不知道这怎么能节省我的时间??有什么想法吗?我错过什么了吗?还有其他方法吗?理论上,单元测试(通常)意味着有更多的时间提前编写测试,但应该会让您以后的工作更轻松。例如,当您能够非常容易地发现回归错误时,投入的时间会在以后产生

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

  • 我将不得不编写大量SQL来创建测试装置(在设置过程中准备的测试数据)

  • 我必须在测试过程中“重写”我的查询,以获得与我正在测试的存储过程的结果进行比较的结果

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

    理论上,单元测试(通常)意味着有更多的时间提前编写测试,但应该会让您以后的工作更轻松。例如,当您能够非常容易地发现回归错误时,投入的时间会在以后产生回报。上的wikipedia条目很好地概述了一般好处

    这在实践中是否对你有益是一个很难回答的问题——取决于项目

    至于“必须重新编写查询以测试查询结果”,显然这并不能证明什么。我想您需要做的是设置测试数据,在运行查询(或其他)时返回可预测的结果,然后测试特定的结果。这样,您就可以根据您的心智模型来测试查询,而不是根据查询本身的副本来测试查询


    但是,是的,听起来这将花费大量的设置时间-我可以想象,准备SQL存储过程测试将需要比一般的.Net对象测试进行更多的设置。

    我想知道的是,为什么要考虑编写单元测试?数据库是否存在操作问题?实施变革难吗?管理层是否让你的加薪依赖于单元测试

    如果没有明确的原因,我不会从“为了好玩”的单元测试开始。当有一个完善的变更系统时,单元测试增加了开销,但没有任何价值

    单元测试也存在严重风险:

  • 人们开始将单元测试视为“质量保证”。只要继续进行黑客攻击,直到单元测试发出绿灯,然后就可以进行生产了
  • 曾经是“快速修复”的小更改将变得更大,因为它们需要(更改)单元测试。这样,单元测试会降低灵活性
  • 单元测试通常检查许多对使用生产系统的任何人都不重要的事情。因此,单元测试迫使您在只有单元测试关心的东西上浪费资源

  • 很抱歉这样的咆哮(我在单元测试方面的经验不好。)

    自动化单元测试经常被搁置一旁,因为经理们推动快速发布,而不是增加项目范围和预算以强调稳定性。事实上,单元测试需要时间。根据我的经验,好处远远大于缺点。在外部系统调用存储过程的情况下,单元测试在消除不可预见的问题和保证集成测试之前的稳定性方面是非常宝贵的

    关于你的关切:

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

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

  • 您不需要重新编写查询来比较结果。标准场景可能如下所示:

  • 加载测试数据并准备环境
  • 开始交易
  • 使用测试数据运行存储过程
  • 使用Assert语句将实际输出与预期输出进行比较
  • 若实际输出和预期输出不匹配,则测试失败
  • 如果实际输出和预期输出匹配,则测试通过
  • 回滚事务
    /…
    对任何附加测试重复步骤2至7
    …/
  • 清理测试环境
  • 请记住,您正在测试一组特定的条件以查找通过/失败,因此可以在测试例程中硬编码期望值

    希望这有帮助


    Bill

    TSQLUnit执行自动隐式事务启动和回滚,这样您就不必每次都清理您的混乱。供参考