【问题标题】:How to seed database data for integration testing in C#?如何在 C# 中为集成测试播种数据库数据?
【发布时间】:2013-03-19 14:10:06
【问题描述】:

我最近一直在针对 ASP.Net MVC 控制器操作编写一些集成测试,并且对设置运行测试所需的测试数据的困难感到沮丧。

例如,我想测试控制器的“添加”、“编辑”和“删除”操作。我可以很好地编写“添加”测试,但后来发现要编写“编辑”测试我要么必须调用“添加”测试的代码来创建记录,以便我可以编辑它,或者在测试类中做了很多设置,都不是特别吸引人。

理想情况下,我想使用或开发一个集成测试框架,以便更轻松地以可重用的方式为集成测试添加种子数据,以便安排/动作/断言测试的安排方面可以专注于安排我特别需要的内容安排我的测试,而不是安排大量与被测代码间接相关的参考数据。

我碰巧在使用 NHibernate,但我相信任何数据播种功能都应该忽略这一点,并且能够直接操作数据库; ORM 可能会改变,但我将始终使用 SQL 数据库。

我正在使用 NUnit,因此设想挂钩到测试/测试夹具设置/拆卸(但我认为一个好的解决方案可能会转移到其他测试框架)。

我在我的主要项目中使用FluentMigrator 来管理参考数据的架构和种子设定,因此能够使用 FluentMigrator 框架在整个解决方案中实现一致的方法会很好,但不是必需的。

所以我的问题是,“如何为 C# 中的集成测试播种数据库数据?”你直接执行SQL吗?你使用框架吗?

【问题讨论】:

    标签: c# asp.net-mvc nunit integration-testing fluent-migrator


    【解决方案1】:

    您可以在 Sql Server Compact 上进行集成测试,您将拥有一个 .sdf 文件,您可以将文件路径作为连接字符串连接到该文件。这样设置和使用起来会更快、更容易。

    您的集成测试可能不需要数百万行数据。您可以将测试数据插入数据库并将其保存为TestDbOriginal.sdf

    当您运行测试时,只需制作此“TestDbOriginal.sdf”的副本并处理该副本,该副本已经植入了数据。如果你想测试一个特定的场景,你需要通过调用一些方法来准备你的数据,比如添加、删除、编辑。

    当您进行生产或性能测试时,切换回您的原始服务器版本,无论是 Sql Server 2008 还是其他版本。

    【讨论】:

    • 您确定这是个好主意吗?您是否建议 OP 仅出于测试目的而切换 DB 平台?
    • 您可以在许多流行的开源项目中看到这种方法。我也在我的一些项目中使用了这种方法。你的缺点是什么?顺便说一句,“只是为了测试”听起来很奇怪。
    • 使用它打算用于并将发布的数据库平台来测试您的应用程序不是一个更好的主意吗?将数据库迁移到 CE 并在那里进行测试有什么意义?对我来说似乎是在浪费时间。
    • 顾名思义,它很紧凑。它速度更快,易于处理、设置和连接。只需提供文件名即可连接。您无需花费任何额外时间,只需提供 .sdf 文件的路径而不是 sql server 的连接字符串,就可以了。结帐differentpla.net/content/2009/03/…
    • 谢谢@Mert。这当然是一种有效的方法,并且我以前使用过。我遇到的缺点是; 1) 因为测试数据被持久化在数据库中,所以它实际上变成了共享的测试数据。在多开发人员环境中,其他开发人员很容易为自己的目的劫持我的测试特定的测试数据。 2) 在运行大量集成测试时,如果必须在测试或测试夹具之间恢复数据库,则会对性能造成很大影响。
    【解决方案2】:

    我不知道这是否一定是“正确”的做法,但我一直使用我的添加/创建方法进行播种。

    【讨论】:

    • 谢谢@mattyB,这与我的问题直接相关;如果添加操作的逻辑被破坏,这也应该破坏我的编辑测试吗?我认为应该尽可能隔离测试。如果添加操作被破坏(我应该有一个单独的测试)这是否会导致编辑操作失败?编辑测试不应与添加测试耦合。
    • @Tristan,如果您从 SetUp 方法中填充您的测试数据库,那么如果 Create 操作不起作用,您的测试可能会失败。这就是为什么我总是首先实现我的 Create 方法(加上测试),确保它们正常工作,然后使用它们填充数据库进行测试。然后我可以在我的 DAO 安全中编写测试和实现方法,因为我知道我的 Create 方法是好的,并且任何失败都是由被测方法引起的。
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2010-09-08
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多