问题标签 [tsqlt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
270 浏览

redgate - tSQLt 对象组织

我们将 RedGate 与 SQL 测试 (tSQLt) 结合使用。为了进行单元测试,我们在每个数据库上安装了框架。

有没有一种方法可以使用 tSQLt 框架,使您的单元测试和框架对象可以驻留在一个中央位置,然后可以由多个数据库使用?

我们还使用 RedGate 的 SQL Source Control 和 TFS 作为我们的存储库来跟踪架构更改。这些更改按以下环境顺序进行升级:开发 --> 测试 --> 生产。

不用说,框架的添加结合测试本身代表了我们数据库中现在大量的新 SQL 对象(表、存储过程等)。理想情况下,我们希望这些对象仅驻留在 Development 和 Test 中,并避免弄乱我们的生产数据库。我们可以跳过将 tSQLt 更改合并到生产环境中,但是在测试环境的源代码控制中直到时间结束,我们都会保留未合并的更改。

关于解决这个问题的任何想法?

0 投票
0 回答
168 浏览

sql - 在 tSQLt 中运行 SSIS 包

我正在尝试使用 tSQLt 编写 SSIS 集成测试。我已经设置了我的表并AssertEqualsTable在测试结束时使用了我的表,但我调用的包似乎没有运行。我在我的 tSQLt 测试中使用以下内容:

0 投票
0 回答
188 浏览

tsql - 使用 tSQLt Run 命令时不触发 SSIS 包

我正在尝试为 SSIS 包编写集成测试。SSIS 包已部署到 SSIS 目录 (SSISDB)。我正在使用带有 Winders Server 2012 操作系统的服务器,并且正在使用 SQL Server 2012

我的代码如下

我遇到的问题是,当我在 SSMS 中执行以下命令时

SSIS 包不会触发。

到目前为止我尝试过的事情:

在堆栈上阅读这篇文章 - 从我所见,我已经按照此处所述创建了我的测试。

运行应该在 SSMS 中单独执行 SSIS 包的代码。这按预期工作。我的意思是包执行并且目标表中的数据是我所期望的。

WAITFOR DELAY在命令之后添加[start_execution]命令以确保 SSIS 包有时间完成,但这似乎不是问题。

卸载 tSQLt 并重新安装它。

0 投票
1 回答
499 浏览

sql-server - SQL 数据验证框架?

我收到了各种平面文件,在将它们加载到 SQL Server 数据库之前,这些文件需要在 ETL 过程的几个阶段进行转换和聚合。

在每个阶段之后,我想以多种方式验证数据,并且我正在研究可以提供帮助的现有技术。

接收到数据后,需要对截断数据、日期格式等内容进行验证,并通常确保数据已准备好进行转换。

数据这样清洗干净后,我想对数据进行校验。这将包括将诸如行计数、空值百分比、平均值等值与先前的负载或预定义值进行比较。如果验证失败,则应提醒开发人员。

tSQLt,数据库单元测试框架,有几个断言可以用来做我想做的事。它很容易设置并且有不错的文档。这是我能看到的最近的工具,但距离它的设计目的还有很长的路要走。

另一种方法是创建我自己的工具,但我想知道 - 这样的东西是否已经存在?

0 投票
1 回答
1073 浏览

sql - tSQLt ExpectException 对我不起作用

我有一个调用存储过程的测试。我希望存储过程拒绝提供的输入,并带有 raiserror。我的 tSQLt 测试的相关部分是:

EXEC tSQLt.ExpectException @ExpectedMessagePattern = '%more than one subcategory%';
EXEC usp_add_rfx_rfx 很多,的,参数,在这里

tSQLt 的测试结果取决于 usp_add_rfx_rfx sp 中 raiserror 的严重性。

如果严重性为 12 或更高,则测试失败并显示以下消息:

[test_RFX_configuration].[test_multiple_categories_and_lots] 失败:(错误)EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 0.[16,2]{test_multiple_categories_and_lots,0}(还有一个 ROLLBACK ERROR --> ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION.{Private_RunTest,149})

如果严重性较小,则测试失败,如下所示:

[test_RFX_configuration].[test_multiple_categories_and_lots] 失败:(失败)预期会引发错误。

我已经用谷歌搜索了这个问题并尝试了一些我发现的东西 - 使用 TRY-CATCH 等,但没有任何乐趣。有任何想法吗?

0 投票
1 回答
659 浏览

sql-server - tSQLt 的代码覆盖率工具

我正在尝试测试 tSQLt 的代码覆盖率。

我在“DLM 自动化套件”站点上找到了一个工具 SQL Cover。数据库中有一些程序是加密的,所以会抛出异常。这是该工具的限制,还是有替代方法来测试 tSQLt 测试用例的代码覆盖率?

0 投票
3 回答
361 浏览

tsqlt - 有没有办法在调用 tSQLt.ExpectException 后测试测试中的其他断言?

使用 tSQLt 1.0.5873.27393,我正在尝试为存储过程编写 tSQLt 测试,该存储过程将捕获在CATCH块中的错误记录到日志表中,然后再将错误重新抛出到调用会话。

我可以使用 成功测试错误消息是否被重新抛出tSQLt.ExpectException,但副作用似乎是在调用后无法测试任何其他断言tSQLt.ExpectException- 所以我无法测试错误是否已写入日志表。

我能想出的最简单的测试可以证明问题是:

执行时会产生以下(意外)输出:

使用分析器跟踪,我可以看到断言AssertEquals从未执行,因为错误被.CATCHtSQLt.Private_RunTest

因为 tSQLt 用于CATCH捕获错误,所以我怀疑如果不对 tSQLt 进行重大重写,就无法解决这个问题 - 但我在这里询问以防万一其他人找到解决问题的方法。

0 投票
1 回答
96 浏览

redgate - 为什么 TSQLT 在 SQLTest 中出错并且在手动运行时不运行?

我有一组测试在运行 Redgate SQLTest 时有时会运行,有时它们会给我屏幕截图中的第一个错误。手动运行我的测试代码时,执行大约需要 22 秒。

此外,当我使用下面的命令手动运行时,它说执行了 0 个测试并在 < 1 秒内运行。我不知道为什么我的测试无法运行。

错误

0 投票
1 回答
782 浏览

sql - 您可以在 VSTS 的构建过程中运行 SQL 单元测试 (TSQLT) 吗?

是否可以在 VSTS 的构建过程中运行 SQL 单元测试(如果任何测试失败,理想情况下会导致构建失败)?或者,我只能在放置服务器的 SQL Server 上构建/部署后运行测试吗?

谢谢!

0 投票
1 回答
1973 浏览

sql-server - 在 SQL Server 中同时使用 XACT_ABORT 和 TRY CATCH 中断 tSQLt 回滚

我开始在我的生产代码中使用 SQL Server 的 tSQLt 单元测试。目前,我使用Erland Sommarskog 的SQL Server 错误处理模式。

Erland Sommarskog 建议我们始终SET XACT_ABORT ON,因为只有这样 SQL Server 才会以(大部分)一致的方式处理错误。

但是,这在使用 tSQLt 时会产生问题。tSQLt 在显式事务中执行所有测试。当测试完成时,整个事务回滚。这使得清理测试工件完全无痛。然而,在 XACT_ABORT ON 的情况下,任何在 TRY 块内抛出的错误都会立即导致该事务的失败。事务必须完全回滚。它不能提交,也不能回滚到保存点。事实上,在事务回滚之前,没有任何内容可以写入该会话内的事务日志。但是,tSQLt 无法正确跟踪测试结果,除非在测试结束时事务处于打开状态。tSQLt 停止执行并抛出 ROLLBACK ERROR for doomed交易。失败的测试显示错误状态(而不是成功或失败),后续测试不会运行。

tSQLt 的创建者 Sebastian Meine 推荐了一种不同的错误处理模式

他声明错误变量,开始事务,设置保存点,然后在 TRY 块内执行过程代码。如果 TRY 块抛出错误,则执行传递到 CATCH 块,该块填充错误变量。然后执行超出 TRY CATCH 块。出错时,事务将回滚到过程开始时设置的保存点。然后事务提交。由于 SQL Server 处理嵌套事务的方式,当在另一个事务中执行时,此 COMMIT 只是从事务计数器中减去一个。(嵌套事务在 SQL Server 中确实不存在。)

塞巴斯蒂安创造了一个非常整洁的图案。执行链中的每个过程都会清理自己的事务。不幸的是,这种模式有一个大问题: 注定的交易。注定的事务打破了这种模式,因为它们无法回滚到保存点或提交。他们只能完全回滚。当然,这意味着您不能在使用 TRY-CATCH 块时将 XACT_ABORT 设置为 ON(并且您应该始终使用 TRY-CATCH 块。)即使 XACT_ABORT 为 OFF,许多错误(例如编译错误)无论如何都会导致事务失败. 此外,保存点不适用于分布式事务。

我该如何解决这个问题?我需要一个可以在 tSQLt 测试框架中工作的错误处理模式,并且还可以在生产环境中提供一致、正确的错误处理。我可以在运行时检查环境并相应地调整行为。(请参见下面的示例。)但是,我不喜欢这样。这对我来说就像一个黑客。它要求开发环境配置一致。更糟糕的是,我不测试我的实际生产代码。有没有人有一个绝妙的解决方案?

编辑:经过进一步测试,我发现我修改后的回滚也不起作用。当过程抛出错误时,它退出而不回滚或提交。tSQLt 引发错误,因为过程退出时的@@TRANCOUNT 与过程启动时的计数不匹配。经过反复试验,我找到了一种适用于我的测试的解决方法。它结合了两种错误处理方法 - 使错误处理更加复杂,并且某些代码路径无法测试。我很想找到更好的解决方案。