tSQLt - 如何检查表值是否已更改某个值

时间:2018-05-31 08:04:03

标签: sql-server tsql tsqlt

在tSQLt中,我们可以使用AssertEqualsTable命令比较2个表。

但是,有什么方法可以断言表中的值是否已经改变了一定数量?

例如:

表A:AccID | Balance

表B:AccID |余额

在tSQLt中有没有办法比较这两个表来检查天平是否已经移动了一定数量(比如100)?如果变化超过+/- 100,则会失败

解决方法是使用通常的SQL逻辑 - 也就是说 - 我们可以在AccID上连接两个表,然后计算余额差异,并在where子句中强制执行标准,使得只有那些具有+/- 100差异的AccID得到显示。然后只有在上述输出返回0记录时才允许测试成功。

1 个答案:

答案 0 :(得分:1)

tSQLt是一个单元测试框架,因此单元测试的基本结构应该是:

汇编,其中可能包括:

  • 假表,视图或功能,监视任何程序
  • 设置任何需要为测试预先存在的数据
  • 定义任何预期的结果集(例如,如果测试a的输出) 视图)

并非所有测试都会有汇编步骤

<强>法: 通常,这将是对视图的存储过程或函数或SELECT的调用。 如果测试表约束或触发器,则此步骤可能涉及将数据插入表中 大多数测试都会有一个 Act 步骤,虽然这不是强制性的 - 例如汇编步骤可能伪造并填充一些驱动特定视图内容并定义预期的表结果然后断言步骤可用于将视图的整个内容与预期的结果集进行比较。

断言,其中包括:

  • 比较SELECT语句的结果,查看内容, 具有预定义结果集的函数或过程输出
  • 检查是否抛出了异常
  • 检查是否已调用另一个存储过程(使用 tSQLt.SpyProcedure)

每个测试都应该(最好是确切地说)一个断言(尽管用于测试异常的代码行将位于行为之前)。

因此,考虑到上述和您的要求,该数据只能作为某些操作(在过程或触发器中,或通过直接DML语句)的结果而更改,因此您的测试必须具有 Act 一步。我无法看到你如何编写一个tSQLt测试来声明任何数据更改都在你的容忍级别内,而不管改变它的过程如何。你什么时候开始测试?在哪个过程或所有过程之后?这不是单元测试,而是集成测试。事实上,它实际上是应用程序/程序逻辑的一部分。

如果您需要确保对数值的更改永远不会超出数据库中的容差级别(跨两个表),您可以尝试这样的操作:

1)如果在插入或更新表A时,表A中“平衡”列中的值大于或小于表B中的等效值,则使用引发异常的触发器< / p>

2)编写该触发器的第一个测试,该测试断言如果表A中的值在您的容差级别内更改,则不会引发任何错误。这个逻辑看起来像这样:

汇编: 假表A和表B(tSQLt.Faketable) 将触发器重新应用于假的TableA(tSQLt.ApplyTrigger) 向表示起点的TableA和tableB添加一行

断言: 致电tSQLt.ExpectNoException

: 使用值在范围内的值

更新TableA中的行

3)编写该触发器的下一个测试,该测试断言如果表A中的值更改超出容差级别,则会抛出错误。

汇编: 假表A和表B(tSQLt.Faketable) 将触发器重新应用于假的TableA(tSQLt.ApplyTrigger) 向表示起点的TableA和tableB添加一行

断言: 致电tSQLt.ExpectException,可选择定义预期错误编号和/或消息

: 使用超出容差级别的值更新TableA中的行。

我强烈建议你练习测试优先开发,所以从编写两个测试开始,第一个应该通过,第二个将失败。然后,当您创建触发器时,两个测试都应该通过,您可以证明正面和负面情况下所需的逻辑是有效的。

最后,这种数据库驱动的逻辑方法的问题是您的应用程序必须处理此错误。这种逻辑可能更好地放在应用程序中。数据库毕竟不是python所以在这种情况下LBYL(Look Before You Leap)比EAFP更好(更容易要求宽恕权限)