如何为集成测试设置数据

时间:2012-07-11 08:19:14

标签: unit-testing installation integration-testing

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

我添加到数据库中的表越多,设置方法越大,难以进行概述和维护。

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

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

你发现了什么是好方法?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

  • 进行全班级设置和拆卸,您可以在其中插入经过测试的DAO类所需的所有数据(每个类运行一次)
  • 具有汇编/命名空间的设置和拆卸,您可以在其中插入所有 DAO类所需的所有数据(在程序集/命名空间中为每个类运行一次)

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