2009-07-30 49 views
0

我正在研究一个项目的测试环境,并且正在研究使用DbUnit.NET进行大量的数据库交互测试。我确实有一个非常大的问题:DbUnit如何防范同时运行多个测试?

我们针对Oracle运行,并且为每个开发人员设置单独的测试数据库实例确实是不可行的(尤其是因为我们只有1位DBA已经被绑定了时间) 。这意味着所有开发人员和连续集成服务器都需要使用相同的数据库模式。

因此,在这个问题上:有没有一种好方法可以防止同时测试1个以上的人?在db表中放入一条表示测试正在运行的记录很容易,然后在测试完成后将其删除,但NUnit无法在测试会话的开始和结束时运行某些操作。

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

回答

1

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

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

我们遇到麻烦的唯一原因是开发人员想要在调试模式下单步执行测试。这会阻止任何想要运行测试的其他开发人员,直到他发布调试器。我们将当前用户的名字写入一个虚拟表格,并且如果封锁超过30秒,锁定机制会打印一条消息:“Bob正在运行测试并且最近5分钟已经过。”

这是好的,但需要维护很多工作。我们尽量减少数据库测试的数量,并将大部分测试作为内存中的纯粹单元测试。

+0

这基本上是我想我会做的。我最大的问题是我正在处理大量遗留的pl/sql(超过10k行值),并触发几乎所有的表格,并且所有这些都未经测试。所以我必须通过Oracle及其所有的触发器和sprocs,否则我很想装配一个内存中的SQLite数据库或其他东西......感谢您的输入! – CodingWithSpike 2009-07-30 13:03:59

1

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

0

东西我中存在的问题做了一些相似之处这一个:

该方案有已添加到所有相关项目的前面配置变量。每个电台都有自己的设置,正确设置就不会有冲突。

相关问题