我应该如何对多线程代码进行单元测试?

到目前为止,我已经避免了测试多线程代码的噩梦,因为它似乎是一个雷区。我想问一下,人们是如何测试依赖线程成功执行的代码的,或者人们是如何测试那些只有在两个线程以给定方式交互时才会出现的问题的

这对于今天的程序员来说似乎是一个非常关键的问题,将我们的知识集中到这一点上会很有用

听着,要做到这一点并不容易。我正在做一个本质上是多线程的项目。事件来自操作系统,我必须同时处理它们

处理测试复杂的多线程应用程序代码的最简单方法是:如果太复杂而无法测试,那么您就做错了。如果您有一个具有多个线程的实例,并且您无法测试这些线程相互重叠的情况,那么您的设计需要重新进行。它既简单又复杂

有许多方法可以为多线程编程,以避免线程同时在实例中运行。最简单的方法是使所有对象都不可变。当然,这通常是不可能的。因此,您必须在设计中确定线程与同一实例交互的位置,并减少这些位置的数量。通过这样做,您可以隔离几个实际发生多线程的类,从而降低测试系统的总体复杂性

但您必须意识到,即使这样做,您仍然无法测试两个线程相互踩在一起的所有情况。要做到这一点,您必须在同一测试中同时运行两个线程,然后精确控制它们在任何给定时刻执行的行。你所能做的就是模拟这种情况。但这可能需要您专门为测试编写代码,而这最多是实现真正解决方案的半步

测试代码线程问题的最佳方法可能是通过对代码进行静态分析。如果您的线程代码没有遵循一组有限的线程安全模式,那么您可能会遇到问题。我相信VS中的代码分析确实包含一些线程方面的知识,但可能不多

看,就目前的情况而言(而且可能会是一个好时机),测试多线程应用程序的最佳方法是尽可能降低线程代码的复杂性。最小化线程交互的区域,尽可能最好地进行测试,并使用代码分析来识别危险区域

发表评论