- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在tSQLt中,我们可以使用AssertEqualsTable命令比较2个表。
但是,有什么方法可以断言表中的值是否已更改了一定数量?
例如:
表A:AccID |余额
表B:AccID |余额
tSQLt中有什么方法可以比较这两个表,以检查余额是否已移动一定量(例如100)?如果更改超过+/- 100并失败?
解决方法是使用通常的SQL逻辑-也就是说,我们可以在AccID上连接两个表,然后计算Balance差异,并在where子句中强制执行条件,以便仅显示差异为+/- 100的那些AccID。然后,仅当以上输出返回0条记录时,才允许测试成功。
最佳答案
tSQLt是一个单元测试框架,因此,单元测试的基本结构应为:
组装可能包括:
伪造表格,视图或函数,监视任何程序
设置任何需要预先存在的数据进行测试
定义任何预期结果集(例如,如果测试来自
视图)
并非所有测试都具有“组装”步骤
法案:
通常,这将是对存储过程或函数的调用或从视图中进行的SELECT。
如果测试表约束或触发此步骤,则可能涉及将数据插入表中
尽管不是强制性的,但大多数测试将具有“ Act”步骤,例如,“ Assemble”步骤可能伪造并填充一些驱动特定视图内容并定义预期结果的表,然后可以使用“ Assert”步骤来比较具有预期结果集的视图。
断言可能包括:
比较SELECT语句的结果,查看内容,
具有预定义结果集的函数或过程输出
检查是否引发了异常
检查是否调用了另一个存储过程(使用
tSQLt.SpyProcedure)
等等
每个测试应该(最好是准确地)有一个断言(尽管在行为之前将放置用于测试异常的代码行)。
因此,考虑到上述情况和您的要求,该数据只能根据某些操作(在过程或触发器中,或通过直接DML语句)的结果进行更改,因此您的测试必须具有“操作”步骤。我看不到如何编写tSQLt测试来断言任何数据更改都在您的容忍范围之内,而不管更改它的过程如何。您什么时候运行该测试?在哪个过程或所有过程之后?那不是单元测试,而是集成测试。实际上,可以说它实际上是应用程序/程序逻辑的一部分。
如果需要确保对值的更改永远不会超出数据库的容忍度(跨两个表),则可以尝试以下操作:
1)如果在插入或更新表A时,表A上“余额”列中的值大于或小于表B中的等效值,则使用引发异常的触发器
2)为该触发器编写第一个测试,该测试断言,如果表A中的值在您的公差范围内更改,则不会引发任何错误。该逻辑可能看起来像这样:
组装:
伪造TableA和TableB(tSQLt.Faketable
)
将触发器重新应用于伪造的TableA(tSQLt.ApplyTrigger
)
在TableA和tableB中添加一行代表您的起点
断言:
致电tSQLt.ExpectNoException
法案:
使用范围内的值更新TableA中的行
3)为该触发器编写下一个测试,该测试断言,如果表A中的值在您的容限范围之外更改,则会引发错误。
组装:
伪造TableA和TableB(tSQLt.Faketable
)
将触发器重新应用于伪造的TableA(tSQLt.ApplyTrigger
)
在TableA和tableB中添加一行代表您的起点
断言:
调用tSQLt.ExpectException
,可以选择定义预期的错误号和/或消息
法案:
使用超出您的公差级别的值更新TableA中的行。
我强烈建议您练习以测试为先的开发,因此首先编写两个测试,第一个应该通过,第二个将失败。然后,当您创建触发器时,两个测试都应该通过,并且可以证明所需的逻辑在肯定和否定情况下都是有效的。
最后,这种数据库驱动的逻辑方法的问题在于您的应用程序将不得不处理此错误。这种逻辑可能更好地放在应用程序中。数据库毕竟不是python,因此在这种情况下LBYL(请您先了解一下)比EAFP更好(更轻松地寻求许可)
关于sql-server - tSQLt-如何检查表值是否已更改某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619539/
使用 tSQLt 1.0.5873.27393,我正在尝试为存储过程编写 tSQLt 测试,该过程记录在 CATCH 中捕获的错误。在将错误重新抛出到调用 session 之前阻止到日志表。 我可以成
我最近正在调用一个程序,该程序在代码中包含一个rasierror。抬高筹码的人正处于试捕区。同样,BEGIN TRAN在加注程序之后位于同一 try catch 块中。如果事务中发生错误,则Catch
我是 tSQLt 的新手,在进行真正应该非常简单的测试时遇到了一些困难。 我在存储过程中执行的 SELECT 语句中添加了一列。 如何在 tSQLt 测试中测试该列是否包含在该存储过程的结果集中? 最
我是 tSQLt 的新手,在进行真正应该非常简单的测试时遇到了一些困难。 我在存储过程中执行的 SELECT 语句中添加了一列。 如何在 tSQLt 测试中测试该列是否包含在该存储过程的结果集中? 最
是否可以忽略tSQLt AssertEqualsTable中几乎肯定会有所不同的某些列?示例是来自两个结果表的主键,插入/更新日期戳等。 我一直在通过仅在新的临时表中选择相关列并进行比较来解决此问题,
首先,我应该指出,我对 Atlassian 的 Bamboo 和持续集成总体来说还是个新手。这是我使用其中任何一个的第一个项目。 我使用 tSQLt 框架创建了大量单元测试。我还将 Bamboo 配置
有什么办法可以找到tSQLt的版本号吗?安装在数据库上? 请注意,tSQLt 是 SQL Server 而非 T-SQL 的测试框架。 (请不要投票关闭不相关的副本。) 最佳答案 从源代码来看,似乎有
我正在使用 Red Gate SQL Developer 开发数据库工具。 SQL Test ,运行 tSQLt 测试的 SSMS 加载项缺少重命名测试类的方法。 我有一个名为 [BackendLay
这是场景: 存储过程sproc_a调用sproc_b。然后sproc_b调用sproc_c。典型的嵌套过程。 Sproc_a 执行了 SET XACT_ABORT ON;并使用命名事务。 Sproc_
我有一个曾经可以工作的安装,但现在似乎不行。想知道是否有其他人经历过这种情况。 曾经运行过的测试现在不运行了。似乎什么都没有运行。输出始终如下: +----------------------+ |测
在tSQLt中,我们可以使用AssertEqualsTable命令比较2个表。 但是,有什么方法可以断言表中的值是否已更改了一定数量? 例如: 表A:AccID |余额 表B:AccID |余额 tS
我有一个 tSQLt 测试,我预计它会失败,但它运行成功。当我在过程外运行代码时,它按预期失败了,但是当使用 Run 执行测试时,没有发生错误。 我已阅读问题 tSQLt Testing SQL Se
我最近一直在对调用包含(持久)计算列的表的过程编写一些 tSQLt 数据库单元测试(通过 Red Gate SQL Test),请注意,如果我使用 FakeTable SP,我发现计算列是未填充(它们
用于 SQL 单元测试的 Redgate 工具 SQLTest 现在能够从 SQLCop 添加测试。然而 Redgate 工具只附带了很少的预构建测试。 由于测试只是存储过程,我确信有人已经实现了更多
每当我使用 ExpectException 时,我都会收到以下错误:(还有一个 ROLLBACK 错误 --> 当前事务无法提交且无法回滚到保存点。回滚整个事务。{Private_RunTest,14
我对 tSQLt 数据库单元测试框架还很陌生。我有一个使用 3 个表的存储过程。每个表需要 15 行数据。我还需要另一个假表来验证结果。但是使用 INSERT 准备假表容易出错且难以维护。 为 tSQ
我刚开始使用tsqlt在redgate的sql测试里面。我必须处理遗留数据库中相当大的表(大量列)。将一些假数据插入此类表的最佳做法是什么(“脚本作为”插入语句非常大) - 因此它们会使我的单元测试的
我正在使用 tSQLt 对 t-sql 代码进行单元测试。 很多时候,测试的安排部分非常广泛,我试图将其中的大部分内容推送到设置过程中,以便在类内的测试中重用。 如果设置和测试程序可以“知道”相同的信
exec tSQLt.SetFakeViewOn 'dbo.viewWithIssues'; GO CREATE PROCEDURE TestChanges.[Test Data] AS BEG
当尝试在存储过程中验证用户提供的 GUID 时,使用了一种简单的方法;将用户输入作为 CHAR(36),然后在 TRY CATCH 中将其显式转换为 UNIQUEIDENTIFIER。然后,CATCH
我是一名优秀的程序员,十分优秀!