0

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

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

尽管在功能初步验证后,这对开发人员机器来说并不重要,但我更多地关注在夜间构建中运行这些测试的重要性;以便在测试失败的情况下,构建可以被阻止以免污染目标部署环境(具体而言,在这种情况下,测试团队将使用环境)。

我并不认为,平台的问题,但如果任何人有实施的具体问题,我的环境如下所示:

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

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

回答

2

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

也许你可以让你的单元测试交易。运行你的测试,将它们回滚,并且数据库不变。

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

+0

这是一个好主意。我的存储库已经有一个“工作单元”模式实现,我正在使用它自动创建一个TransactionScope()。我没有想过要添加一个Rollback()方法来处理我的Commit(),但这可能只是这种情况下最简单的方法。 – 2009-09-12 22:41:36

+0

这工作得很好。再次感谢!比我考虑的其他方法要容易得多! – 2009-09-13 01:57:41

1

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

This is a huge pain.如果你可以通过交易(如duffymo建议),我会去那。交易的难点在于嵌套交易和分布式交易 - 注意代码中的交易。

+0

你是对的,它绝对看起来很痛苦!正如我在duffymo的回答中所提到的,我已通过工作单元实现在我的存储库中自动生成TransactionScope()。我可能会尝试使用事务方法,因为我真的只是想看看实现中是否存在潜在的失败,而不是将测试链接在一起(即不会创建“A”,更新“A”,然后删除“ A“作为单独测试。) – 2009-09-12 22:44:27

1

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

0

如果你的代码与数据库无关,使用SQLite等内存数据库进行单元测试(不是集成测试)会给你速度和易用性的好处(你的测试设置初始化数据库)。

1

如果您实际上正在为您的存储库执行单元测试,而这些单元测试正在击中数据库,那么您并未进行单元测试。这可能是一个有用的测试,但它不是一个单元测试。这是一个综合测试。如果你想这样做,并将其称为集成测试,那就完全没问题。但是,如果您在存储库中遵循了良好的设计原则,则不需要在单元测试中测试数据库EVER。

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

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

这样可以帮助你在未来的测试和设计中犯错误。

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