0

我想知道其他人可能有什么方法可以针对数据库测试域服务?我已经有一系列模拟存储库,我可以在域服务中使用它们来测试域服务本身。这些模拟存储库的部分构造是它们构建示例聚合和关联实体,并根据模型中使用的相同业务规则验证它们。这也提供了一种很好且简单的方法来检测实体本身内的潜在影响点,以防它们的界面发生变化。

我在对我的 SQL 支持的存储库进行实时测试时看到的主要问题是数据库一致性。例如,一旦运行测试,“创建”方面已经运行。再次运行它们显然会导致失败,因为数据库不再是原始的。我正在考虑创建一个仅用于此类测试的镜像数据库。它将是最小的,包含结构、可编程性、约束等。我还将为某些已建立的测试提供最小的数据集。我的思路是,我可以有一个存储过程,我可以调用它来在测试运行开始之前使用基本数据将数据库重置为“原始”状态。

虽然在最初验证功能后,这在开发人员机器上并不那么重要,但我正在更多地研究将这些测试作为夜间构建的一部分运行的重要性;以便在测试失败的情况下,可以阻止构建以不破坏目标部署环境(特别是在这种情况下,它将是测试团队使用的环境)。

我不一定认为平台很重要,但如果有人有实现特定的问题,我的环境如下所示:

Windows 7(开发)/Windows Server 2008 R2(服务器)Visual Studio 2008 Team Edition(C#)Microsoft SQL Server 2008 Standard(开发/服务器)

我正在使用 Team Build 来运行我的构建,但这很可能不是问题范围内的一个因素。

4

5 回答 5

2

例如,一旦运行测试,“创建”方面已经运行。再次运行它们显然会导致失败,因为数据库不再是原始的。

也许您可以使您的单元测试具有事务性。运行你的测试,回滚它们,数据库没有改变。

Spring 的事务性单元测试类使这很容易做到。你只需要一个事务管理器。

于 2009-09-12T22:23:55.167 回答
1

您可以使用SQL Server Express(我在 2005 上做过,但在 2008 上没有尝试过)来设置存储为文件的“测试平台”数据库。这些可以签入源代码控制,然后测试助手类可以(a)将它们复制到临时文件夹,(b)写启用它们,以及(c)连接到它们。要恢复原始状态,请删除临时副本并重复 ac。

这是一个巨大的痛苦。如果您可以通过交易(如 duffymo 建议的那样)过得去,我会同意的。事务的痛点是嵌套事务和分布式事务 - 注意代码中的那些。

于 2009-09-12T22:35:31.883 回答
1

您可以在测试代码中创建一堆数据工厂,这些数据工厂最初在您的测试运行启动时运行。然后使用事务回滚方法使其保持原始状态。为了更容易,将所有测试类子类化并将事务访问器和回滚代码放在那里。回滚代码可以设置为在每个测试方法完成时自动运行。

于 2009-09-12T22:59:23.127 回答
1

如果您实际上正在为正在访问数据库的存储库执行单元测试,那么您没有进行单元测试。这可能是一个有用的测试,但它不是一个单元测试。那是一个集成测试。如果您想这样做并将其称为集成测试,那很好。但是,如果您在存储库中遵循良好的设计原则,那么您不需要在单元测试中测试数据库,永远。

很简单,您的存储库单元测试不是根据对存储库的输入来测试数据库中发生的广泛影响;这是为了确认对存储库的输入导致调用具有这样和这样一组值的协作者。

您会看到,存储库与您的其他代码一样,应该遵循单一可存储性原则。基本上,您的存储库具有一个且只有一个可存储性,即调解域模型 API 对底层数据访问技术层的关注(通常是 ADO.Net,但可能是实体框架或 L2S 或其他)。以 ADO.Net 调用为例,您的存储库不应承担成为数据层工厂的责任,而应依赖 ADO.Net 数据接口(特别是 IDbConnection/IDbCommand/IDbParameter)中的协作者ETC)。只需将 IDbConnection 作为构造函数参数并调用它一天。这意味着您可以针对接口编写存储库单元测试并提供模拟(或假货或存根或任何您需要的东西)并确认所需的方法,按顺序进行预期的输入。去看看我关于这个确切主题的 MS 博客 ->http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

希望这可以帮助您在将来的测试和设计中犯错误。

顺便说一句:如果你想对数据库进行单元测试,你可以。只需使用 Visual Studio 数据库测试。它内置的 INTO vs 并且自 VS2005 以来一直存在。这不是什么新鲜事。但我需要提醒你,它们需要完全独立的单元测试。

于 2010-07-22T19:31:10.900 回答
0

如果您的代码完全独立于数据库,则使用 SQLite 等内存数据库进行单元测试(不是集成测试)将为您带来速度和易用性的好处(您的测试设置会初始化数据库)。

于 2009-09-15T21:02:56.413 回答