Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 是否可以在SSDT数据库单元测试中重用测试条件或测试步骤?_Unit Testing_Sql Server Data Tools - Fatal编程技术网

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

Unit testing 是否可以在SSDT数据库单元测试中重用测试条件或测试步骤?,unit-testing,sql-server-data-tools,Unit Testing,Sql Server Data Tools,我最近开始使用SSDT数据库单元测试。我发现我有许多相同的测试条件,但我找不到一种方法来重用它们。我需要说多少次“并且只能返回一行” 类似地,我已经开始发现需要相同数据的多个单元测试。这似乎意味着我应该使用相同的预测试步骤。但是我也找不到一种重用预测试步骤的方法 有什么我遗漏的吗?或者是有一种方法可以重用这些组件,或者是有某种原因使我不需要重用它们?首先,最重要的是,无法在多个测试中重用测试前、测试后或测试条件。是的,这很烦人,但我可以理解——确保每个测试都是独立的,这让我觉得是个好主意 我过去

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

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


有什么我遗漏的吗?或者是有一种方法可以重用这些组件,或者是有某种原因使我不需要重用它们?

首先,最重要的是,无法在多个测试中重用测试前、测试后或测试条件。是的,这很烦人,但我可以理解——确保每个测试都是独立的,这让我觉得是个好主意

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

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


所以这是解决“共享测试数据”问题的一种方法。我不知道有什么方法可以共享测试条件,除了去破解底层的C#代码,但我不愿意推荐这种方法。

类似的问题是安装/拆卸代码的重复。我喜欢每个存储过程都有一个测试类。在一个测试类中,我经常有许多测试,这些测试关注运行相关存储过程引起的副作用和数据更改

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


另一方面,这篇文章建议事情应该是这样的:

在一个单元测试类中,在您添加的单个测试的同一下拉列表中有一个(通用脚本)部分

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

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

  • “通用脚本>测试初始化”:设置通用数据(并检查所有测试初始化条件)
  • “我的测试>预测试”:进行任何特定于测试的数据调整(并检查任何预测试条件)
  • “我的测试>测试”:执行可测试代码并检查任何特定于测试的条件
  • “我的测试>测试后”:清理所有测试特定数据(并检查所有测试后条件)
  • “通用脚本>测试清理”:清理所有通用数据(以及检查和清理条件)
  • 这是成功的一半。不幸的是,似乎没有一种方法可以为许多测试运行相同的测试条件

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

    在测试清理部分可以找到一个核心测试,这可能有点误导,所以这是一个小问题

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


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

    谢谢,Jamie。这就是我害怕的。主要是因为读了你的博客,却什么也没看到;-)我想知道人们是如何组织大规模的SSDT单元测试来减轻痛苦的?或者,可能是痛苦太大,无法进行大规模SSDT单元测试。@jamiet抱歉,我认为您的说法不正确,(通用脚本)部分可以用作可重用数据初始化所需的原始海报。请看我的答案,看你是否同意。