我想知道其他人可能对数据库测试域服务有什么方法?我已经有一系列的模拟存储库,我可以在域服务中使用它来测试域服务本身。构建这些模拟存储库的部分原因是它们构建了样本聚合和关联实体,并根据模型中使用的相同业务规则对其进行验证。如果它们的接口发生变化,这也提供了一种很好而简单的方法来检测实体本身内的潜在影响点。
我在SQL支持的存储库的实时测试中看到的主要问题是数据库一致性。例如,一旦运行测试,就已经运行了“创建”方面。再次运行它们显然会导致失败,因为数据库不再是原始的。我正在考虑创建一个仅用于此类测试的镜像数据库。它将是最小的,包含结构,可编程性,约束等。我还将为某些已建立的测试提供最小的数据集。我的想法是,在测试运行开始之前,我可以调用一个存储过程来将数据库重置为具有基本数据的“原始”状态。
虽然在最初验证功能后这对开发人员机器来说并不重要,但我更关注在每晚构建中运行这些测试的重要性;因此,如果测试失败,构建可能会被阻止,以免污染目标部署环境(特别是在这种情况下,它将是测试团队使用的环境)。
我不一定认为该平台很重要,但如果有人有实施特定问题,我的环境如下:
Windows 7(开发)/ Windows Server 2008 R2(服务器) Visual Studio 2008团队版(C#) Microsoft SQL Server 2008 Standard(开发/服务器)
我正在使用Team Build来运行我的构建,但这很可能不是问题范围的一个因素。
答案 0 :(得分:2)
例如,一旦运行测试,就已经运行了“创建”方面。再次运行它们显然会导致失败,因为数据库不再是原始的。
也许你可以让你的单元测试交易。运行测试,回滚测试,数据库不变。
Spring具有事务性单元测试类,使这很容易。你只需要一个交易经理。
答案 1 :(得分:1)
您可以使用SQL Server Express(我已经使用2005年,但未尝试使用2008)来设置存储为文件的“测试卡”数据库。这些可以检入源代码控制,然后测试帮助程序类可以(a)将它们复制到临时文件夹,(b)写入它们,以及(c)连接它们。要恢复原始状态,请删除临时副本并重复a-c。
This is a huge pain.如果你可以通过交易(如duffymo建议的那样),我会选择。事务的痛点是嵌套事务和分布式事务 - 请注意代码中的事务。
答案 2 :(得分:1)
您可以在测试代码中创建一堆数据工厂,这些代码最初在您的测试运行启动时运行。然后使用事务回滚方法使其保持原始状态。 为了更容易,将所有测试类子类化,并将事务访问器和回滚代码放在那里。回滚代码可以设置为在每个测试方法完成时自动运行。
答案 3 :(得分:1)
如果您实际执行的是正在执行数据库的存储库的单元测试,那么您不会进行单元测试。这可能是一个有用的测试,但它不是一个单元测试。这是一个集成测试。如果你想这样做并称之为集成测试,那就完全没问题了。但是,如果您在存储库中遵循良好的设计原则,那么您不需要在单元测试中测试数据库。
很简单,您的存储库单元测试不是根据存储库的输入来测试数据库中发生的广泛影响;它是为了确认存储库的输入导致调用具有这样一组值的协作者。
您可以看到,存储库与其他代码一样,应遵循单一可重用性原则。基本上你的respoitory有一个且只有一个可重用性,那就是将域模型API问题调解到底层数据访问技术层(通常是ADO.Net,但可能是实体框架或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
这可以帮助您在将来的测试和设计中犯错误。
BTW:如果你想对数据库进行单元测试,你可以。只需使用Visual Studio数据库测试。它的内置INTO vs自VS2005以来一直存在。这不是什么新鲜事。但我需要提醒你,他们需要完全进行SEPERATE单元测试。
答案 4 :(得分:0)
如果您的代码与数据库无关,那么使用内存数据库(如SQLite)进行单元测试(而不是集成测试)将为您带来速度和易用性的好处(您的测试设置初始化数据库)。