【问题标题】:How do you setup the data for your integration tests如何为集成测试设置数据
【发布时间】:2012-07-10 19:40:07
【问题描述】:

我有一个带有许多 sql 插入的 Setup 方法。此方法在每个 Test 方法之前调用。

我添加到数据库中的表越多,Setup 方法就越大,而且它难以概览和维护。

有时我认为我应该为每个测试方法创建一个私有设置方法,这样每个测试方法的插入数据会更少,但通常它会比以前的设置方法更多的 sql 插入。

通常我也不需要在 setup 方法中插入一些 sql 来进行特定的测试。因此,我不能轻易说出哪种设置数据适用于哪种测试方法。

你发现什么是好方法?

【问题讨论】:

标签: unit-testing installation integration-testing


【解决方案1】:

考虑使用文件资源(准确地说是 sql 脚本)。将 SQL 存储为类中的字符串通常最终会成为可维护性的噩梦。

在我的 C# 项目中,我通常做的是:

  • 创建插入给定测试(设置)所需数据的脚本
  • 创建脚本,将数据库恢复到插入前的状态(拆卸)
  • 将这些脚本添加到项目资源中(以便它们可以存储在 .sql/text 文件中,并在需要时轻松在数据库上运行,并且不会弄乱类代码)

并在测试开始之前/之后运行它们(测试方法体中)。例如(伪代码):

public void DeleteClient_DeletesClientAndOrderHistory()
{
    ExecuteSql(Resources.Scripts.DeleteClientTest_SetupScript);
    // perform test 
    ExecuteSql(Resources.Scripts.DeleteClientTest_TeardownScript);
}

当然,您可以使用catch-finally 包装此类构造,并确保其他类型的revert-to-starting point 安全机制。然而,这将对测试执行时间产生相当大的影响。您可以考虑两个额外的选择:

  • 具有类范围的设置和拆卸,您可以在其中插入测试 DAO 类所需的所有数据(每个类运行一次)
  • 具有程序集/命名空间范围的设置和拆卸,您可以在其中插入 所有 DAO 类所需的所有数据(每个程序集/命名空间中的所有类运行一次)

当然,您必须检查您的框架是否支持此类方法(例如,NUnit 支持 [TestFixtureSetup] (class-wide) [SetUpFixture] (assembly/namespace-宽) 属性)。

【讨论】:

  • 实际上我说的是针对所有测试的特定于测试的设置数据与一般/类范围的设置数据。
  • @Pascal:是的,我意识到 - 我们按照我的描述行事;在每次测试之前和之后执行test-targeted SQL。这实际上添加了 2 行代码来测试(如我的伪代码示例中所示),但非常易于维护。然而,SQL 仍然有点晦涩。不过,使用DbUnit 之类的工具可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2016-03-26
  • 2013-06-24
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多