如何设置集成测试的数据



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

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

有时我认为我应该为每个测试方法制作一个专用的设置方法,这样每个测试方法的插入数据就会更少,但通常情况下,它会比以前的设置方法插入更多的sql。

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

你发现了什么是好方法?

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

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

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

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

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

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

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

当然,您必须检查您的框架是否支持这样的方法(例如,NUnit使用[TestFixtureSetup](类范围)[SetUpFixture](汇编/命名空间范围)属性)。

最新更新