0

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

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

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

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

4

3 回答 3

1

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

于 2009-07-30T00:14:55.640 回答
1

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

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

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

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

于 2009-07-30T00:35:39.870 回答
0

我在一个与这个有一些相似之处的问题中所做的事情:

该程序有一个配置变量被添加到所有相关项目的前面。每个站都有自己的设置,正确设置不会有冲突。

于 2009-07-30T00:46:24.107 回答