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

时间:2014-12-08 18:52:36

标签: unit-testing sql-server-data-tools

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

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

我有什么遗失的东西吗?要么有一种方法可以重复使用这些组件,要么就是为什么我没有需要重用它们?

3 个答案:

答案 0 :(得分:2)

首先,无法在多个测试中重复使用预测试,后测试或测试条件。是的,这很烦人,但我可以理解它 - 确保每个测试都是自成一体的,这对我来说是一个好主意。

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

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

这是解决“共享测试数据”问题的一种方法。我不知道一种共享测试条件的方法,除了去攻击和隐藏底层的C#代码后,但这不是我推荐的内容。

答案 1 :(得分:1)

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

本节有"测试初始化​​"和#34;测试清理"您可以在其中添加在该类中的每个测试之前和之后运行的代码。

Image showing common scripts section in drop down list

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

  1. "常用脚本>测试初始化​​" :设置通用数据(并检查任何测试初始化​​条件)。
  2. "我的测试>预测试" :进行任何测试特定数据调整(并检查任何预测试条件)。
  3. "我的测试>测试" :执行可测试代码并检查任何测试特定条件。
  4. "我的测试>测试后" :清理任何测试特定数据(并检查任何测试后的条件)。
  5. "常用脚本>测试清理" :清理任何通用数据(以及检查和清理条件)。
  6. 这是成功的一半。不幸的是,似乎没有办法为大量测试运行相同的测试条件。

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

    在测试清理部分找到核心测试可能有点误导,所以这是一个解决方法。

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

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

答案 2 :(得分:0)

类似的问题是设置/拆卸代码的重复。我喜欢每个存储过程都有一个测试类。在测试类中,我经常会有很多测试,它们会查看运行相关存储过程导致的副作用和数据更改。

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

另一方面,这篇文章表明这​​应该是事情的方式:What does “DAMP not DRY” mean when talking about unit tests?