可能的重复:
我应该如何对线程代码进行单元测试? https://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code
经典的单元测试基本上只是将 x 输入并期望 y 输出,然后使该过程自动化。所以它对于测试任何东西都有好处不涉及时间。但是,我遇到的大多数重要错误都与时间有关。线程会损坏彼此的数据,或导致死锁。不确定性行为的发生——百万分之一。硬东西。
对于多线程并发系统的“单元测试”部分,有什么有用的东西吗?此类测试如何进行?是否有必要长时间运行此类测试的主题并以某种巧妙的方式改变环境,以对其正常工作充满信心?
我现在所做的大部分工作都涉及多线程和/或分布式系统。大多数错误涉及“happens-before”类型错误,其中开发人员assumes(错误地)事件 A 总是在事件 B 之前发生。但是程序每运行 1000000 次,事件 B 首先发生,这会导致不可预测的行为。
此外,实际上没有任何好的工具可以检测时序问题,甚至是由竞争条件引起的数据损坏。 Valgrind 工具包中的 Helgrind 和 drd 等工具非常适合简单的程序,但它们在诊断大型复杂系统时并不是很有用。一方面,他们经常报告误报(尤其是 Helgrind)。另一方面,在 Helgrind/drd 下运行时实际上很难检测到某些错误,因为在 Helgrind 下运行的程序运行速度几乎慢了 1000 倍,而且您通常需要运行一个程序相当长的时间才能甚至复制竞争条件。此外,由于在 Helgrind 下运行完全改变了程序的时间,它可能会变成不可能的重现某个时序问题。这就是微妙的时间问题;它们几乎是海森堡式的,因为改变程序来检测时序问题可能会掩盖原始问题。
可悲的事实是,人类仍然没有做好充分的准备来应对复杂的并发软件。不幸的是,没有简单的方法对其进行单元测试。特别是对于分布式系统,您应该使用以下方式仔细规划您的程序帮助您确定程序中事件的必要顺序。但最终,您无法真正摆脱使用随机变化的输入进行强力单元测试。它还有助于在单元测试期间改变线程上下文切换的频率,例如运行另一个后台进程,该进程只占用 CPU 周期。此外,如果您有权访问集群,则可以并行运行多个单元测试,这可以更快地检测错误并节省大量时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)