DbUnit如何防范多个测试同时运行?

时间:2009-07-30 00:07:37

标签: unit-testing dbunit database-testing

我正在为一个项目开发测试环境,我正在研究使用DbUnit.NET进行大量的数据库交互测试。我确实有一个非常大的问题:

我们正在针对Oracle运行,并且为每个开发人员设置一个单独的测试数据库实例实际上是不可行的(特别是因为我们只有1个DBA已经被时间束缚)。这意味着所有开发人员和持续集成服务器都需要使用相同的数据库架构。

所以,关于这个问题:有没有一种方法可以防止超过1人同时进行测试?将记录放在db表中可以很容易地表明测试正在运行,然后在测试完成后将其删除,但是NUnit没有任何方法可以在测试会话的开始和结束时运行。

还有其他想法吗?它似乎应该是一个非常常见的问题......或者每个人实际上是否为每个可能运行测试的开发人员/测试人员运行单独的数据库实例?

3 个答案:

答案 0 :(得分:1)

您可以使用[TestFixtureSetUp]属性来注入表示测试正在运行的标志,以模拟“真正的”信号量。

答案 1 :(得分:1)

当我们在共享数据库上为一群开发人员运行数据库测试时,我们使用了一个带有单个记录的虚拟表作为锁定令牌。我们实际上分别获得了每个测试用例的锁定,以便想要运行一个测试用例的开发人员不必等待运行整个套件的另一个开发人员完成。我们使每个测试都建立了自己的数据 - 测试方法之间没有结转。

我们使用数据库锁定机制来实际排队测试,而不是在其他人已经在运行测试时失败。我认为Oracle的锁定算法有点不同,所以我不知道它是如何工作的。

我们遇到麻烦的唯一地方是开发人员想要在调试模式下完成测试。这将阻止任何其他想要运行测试的开发人员,直到他发布调试器。我们将当前用户的名称写入虚拟表,如果被阻止超过30秒,则锁定机制会打印一条消息:“Bob目前正在运行测试并且已经过了最后5分钟。”

这没关系,但维护工作还很多。我们试图保持较小的数据库测试数量,并将大部分测试作为内存中的纯单元测试。

答案 2 :(得分:0)

我在与此问题有某些相似之处的问题上做了一些事情:

程序的配置变量已添加到所有相关项的前面。每个电台都有自己的设置,正确设置不存在冲突。

相关问题