2009-01-08 123 views
1

为了测试并发性问题,我想使用单元测试在两个不同线程上完全同时调用同一个方法。实际上,我可能想在同一时间在几个线程上调用相同的方法。多线程单元测试

我正在使用微软内置的VS2008单元测试仪。

我的想法是,我会锁定一个对象,然后同步设置每个线程,这些线程会立即等待锁定,然后释放允许所有线程访问共享资源并测试代码能力的锁定正确处理多个线程。

以前有人做过这个吗?我在这里采取合理的方法吗?

回答

3

这种方法的问题是结果不可重现。因此,如果代码中存在错误,多次调用相同的测试会导致(例如)在某些情况下出现死锁,而在其他情况下则不会。

5

我以前做过这件事,即使结果不总是可重复的,但它们可以突出显示代码中的问题或错误。

虽然我不使用Microsoft的单元测试,但我更喜欢MbUnit,它具有ThreadedRepeat属性,允许您指定要运行的线程数。它使整个多线程测试变得更容易,只需编写一个测试并添加一个属性即可。

0

对于单元测试,我认为这是次优的,因为Kibbee表示它可能会或可能不会成功。您需要运行数百次或数千次,即使这样,即使存在竞争条件,您也可能永远不会遇到错误。

如果你试图确保没有死锁,你可以看看typemock赛车手:http://www.typemock.com/learn_about_typemock_racer.html我没有经验,但它听起来像它可以检测到很多死锁。

1

如果你使用单元测试来测试多线程代码,你可能会做错了。

对于初学者,您没有任何保证,两种方法将同时运行;这意味着您的测试不能保证您的代码正常工作。

您可能可以通过插入睡眠命令来测试您的方法在多线程环境中是否正常工作,但这对单元测试来说太具侵入性;它实际上是一个概念证明,而不是我在确定代码的某些部分按预期工作之后作为单元测试离开的东西。

多线程测试本身很好,单元测试需要很长时间才能加速单元测试,但单元测试对于测试小型独立方法是必不可少的。

你可能会考虑的是压力测试,但这是“从外部”完成的,而不是像“从内部”这样的单元测试。这意味着你可以在服务器上再次编写一个客户端,并从多台机器运行数千次,测试整个系统,而不是单个孤立的方法。压力测试有两个主要优势。首先,压力测试用于准确地找到在实时情况下在一百次运行中发生的缺陷类型;其次,由于它们是“从外部”完成的,因此它们更好地重现了线程穿过您的线程的方式应用。

单元测试在我的opionion中对测试多线程代码和通过调试器运行你的代码不一样 - 当一个线程正在等待你启动下一步时,其他线程将超时,而你永远不会有现实生活中的重现。总而言之,并不是所有的事情都应该进行单元测试;概念验证测试是确保您的线程安全集合确实是线程安全的好方法,并且压力测试对于发现多线程代码中的错误非常有用。