Visual studio 针对真实数据库对域服务进行单元测试

Visual studio 针对真实数据库对域服务进行单元测试,visual-studio,unit-testing,domain-driven-design,ddd-repositories,Visual Studio,Unit Testing,Domain Driven Design,Ddd Repositories,我想知道其他人可能有什么方法来针对数据库测试域服务?我已经有了一系列模拟存储库,可以在域服务中使用它们来测试域服务本身。构建这些模拟存储库的一部分是,它们构建样本聚合和关联实体,并根据模型中使用的相同业务规则对其进行验证。这还提供了一种简单的方法,可以在实体本身的接口发生变化时检测实体内部的潜在影响点 我在对SQL支持的存储库进行实时测试时发现的主要问题是数据库一致性。例如,一旦测试运行,“创建”方面就已经运行了。再次运行它们显然会导致失败,因为数据库不再是原始的。我正在考虑创建一个镜像数据库,

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

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

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

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

Windows 7(开发)/Windows Server 2008 R2(服务器) Visual Studio 2008团队版(C#) Microsoft SQL Server 2008标准(开发/服务器)

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

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

也许您可以使单元测试具有事务性。运行测试,回滚测试,数据库保持不变

Spring有事务性的单元测试类,使这项工作变得容易。您只需要一个事务管理器

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

也许您可以使单元测试具有事务性。运行测试,回滚测试,数据库保持不变

Spring有事务性的单元测试类,使这项工作变得容易。您只需要一个事务管理器。

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

如果你能处理好交易(如达菲莫所建议的),我会同意的。事务的痛点是嵌套事务和分布式事务—请注意代码中的事务。

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


如果你能处理好交易(如达菲莫所建议的),我会同意的。事务的难点是嵌套事务和分布式事务—请注意代码中的事务。

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

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

如果您的代码相当独立于数据库,那么使用内存中的数据库(如SQLite)进行单元测试(而不是集成测试)将为您带来速度和易用性的好处(您的测试设置初始化数据库),您没有进行单元测试。这可能是一个有用的测试,但不是单元测试。这是一个集成测试。如果您想这样做,并称之为集成测试,那么这是非常好的。但是,如果您在存储库中遵循良好的设计原则,那么您就不需要在单元测试中测试数据库

很简单,您的存储库单元测试不是基于存储库的输入测试数据库中发生的广泛影响;这是为了确认对存储库的输入会导致调用具有某个集合的协作者