是否可以在 SSDT 数据库单元测试中重用测试条件或测试步骤?

Is it possible to reuse test conditions or test steps in an SSDT Database Unit Test?

提问人:John Saunders 提问时间:12/9/2014 更新时间:9/9/2016 访问量:418

问:

我最近开始使用 SSDT 数据库单元测试。我发现我有许多相同的测试条件,但我找不到重用它们的方法。我需要说多少次,“只能返回一行”?

同样,我已经开始发现多个需要相同数据的单元测试。这似乎意味着我应该使用相同的预测试步骤。但我也找不到重用预测试步骤的方法。

我错过了什么吗?要么是有办法重用这些组件,要么是我真的不需要重用它们的原因?

sql-server-data-tools 进行单元测试

评论


答:

2赞 jamiet 12/15/2014 #1

首先,没有办法在多个测试中重用前测试、后测试或测试条件。是的,这很烦人,但是我能理解它 - 确保每个测试都是独立的,我觉得这是一个好主意。

过去,我解决无法重用测试数据问题的一种方法是编写创建该测试数据的存储过程,并将这些存储过程包含在我正在测试的 SSDT 项目中,然后我只需从预测试中调用存储过程。

这种方法的缺点是,这些存储过程最终会成为已部署数据库的一部分 - 这不是一件好事,因为你不希望存储过程仅用于在生产数据库中创建测试数据。解决此问题的方法是将这些“测试数据”存储过程放入专用的 SSDT 项目中,并创建从该项目到包含要测试的所有代码的 SSDT 项目的“相同数据库”数据库引用。部署第二个项目也将部署第一个项目。这种技术更广为人知的是复合项目

因此,这是解决“共享测试数据”问题的一种方法。我不知道除了去破解底层 C# 代码隐藏之外共享测试条件的方法,但这不是我愿意推荐的。

评论

0赞 John Saunders 12/16/2014
谢谢,杰米。这就是我所害怕的。主要是因为阅读了你的博客,却没有看到任何关于它的信息;-)我想知道人们如何组织大规模的 SSDT 单元测试来减轻痛苦?或者,也许,痛苦太大而无法进行大规模的 SSDT 单元测试。
0赞 Edward Comeau 9/9/2016
@jamiet 对不起,我认为您的陈述不正确,(通用脚本)部分可以用作可重用数据初始化所需的原始海报。请看我的回答,看看你是否同意。
0赞 John Mc 4/1/2016 #2

类似的问题是设置/拆卸代码的重复。我喜欢每个存储过程都有一个测试类。在测试类中,我经常有许多测试,这些测试着眼于运行关联的存储过程导致的副作用和数据更改。

我不喜欢每个类都有 >80% 相同的设置和拆卸代码。这意味着如果我的设置或拆卸发生变化,我有几十个类需要更改。

另一方面,这篇文章表明事情应该是这样:在谈论单元测试时,“DAMP not DRY”是什么意思?

1赞 Edward Comeau 9/9/2016 #3

在单元测试类中,在与您添加的单个测试相同的下拉列表中可以找到“(通用脚本)”部分。

此部分包含“测试初始化”和“测试清理”,您可以在其中添加在该类中每个测试之前和之后运行的代码。

Image showing common scripts section in drop down list

您的一般测试结构如下所示;

  1. “Common scripts > Test initialize” : 设置通用数据(并检查任何测试初始化条件)。
  2. “我的测试>预测试”:进行任何测试特定的数据调整(并检查任何测试前条件)。
  3. “我的测试>测试” :执行可测试代码并检查任何测试特定条件。
  4. “我的测试>后测试”:清理任何测试特定数据(并检查任何测试后条件)。
  5. “测试清理>通用脚本”:清理所有通用数据(以及检查和清理条件)。

这是成功的一半。不幸的是,似乎没有办法为许多测试运行相同的测试条件。

然而!测试初始化和测试清理可以有自己的测试条件,因此,如果特定存储过程的每个单元测试都应产生相同的输出,例如,表中始终有一行(如审核条目),则可以将此测试条件添加到测试清理中;同时将特定的测试条件保留在它们所属的测试中。

在“测试清理”部分找到核心测试可能会有点误导,因此这是一个解决方法。

您必须确保“测试清理”部分不会删除要在常规测试条件中检查的任何数据,因为它将首先执行。我通过在设置数据之前在初始化部分进行清理来解决这个问题,实际上,无论之前运行了什么测试,清理总是将数据库置于已知状态。

对于审核示例,请执行步骤 5。可能会确认 [dbo].[审核] 在步骤 1 时有一条记录。将从 [dbo] 中删除。[Audit] 将行计数返回为 0。