unit-testing - 您如何为集成测试设置数据

我有一个包含许多 sql 插入的设置方法。在每个测试方法之前调用此方法。

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

有时我认为我应该为每个测试方法创建一个私有(private)设置方法,这样每个测试方法的插入数据会更少,但通常它会比以前的设置方法更多的 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 包装此类构造并确保其他类型的revert-to-starting point 安全机制。然而,这将对测试执行时间产生相当大的影响。您可以考虑两个额外的选择:

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

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

https://stackoverflow.com/questions/11428392/

相关文章:

asp.net-mvc-3 - 如何修复来自 Shibboleth 的 SAML SSO 后的浏览器

php - 递归菜单树函数

wordpress - 更改站点 URL 后无法访问 Wordpress wp-admin

c# - 如何使用 IKVM 静态注册加密提供商?

sql-server-2005 - 如何在 SQL Server Reports RDL 中合并具有

ios - 我的 iOS 开发者证书或私钥在 git 中吗?

asp.net - 转移到服务器场中的不同服务器时,IsPostBack 为假?

ruby-on-rails-3.1 - Rack 中间件如何重定向到我的 Rails 应用程序中的

asp.net - 为什么 GetServerVariable ("HTTP_URL") 根据管道模

ajax - 为什么 GIF 动画在执行 AJAX 调用时停止工作?