[.net] 单元测试多线程应用程序?


Answers

第一步是意识到通常单元测试所需的大部分代码都与线程正交。 这意味着你应该尝试分解线程代码来完成工作。 完成之后,您可以使用常规单元测试实践轻松测试执行该工作的代码。 但当然,你知道这一点。

然后问题是测试问题的线程端,但至少现在你有一个点,在这个线程接口与代码工作,希望你有一个接口,你可以模拟。 现在你已经对线程代码调用的代码进行了模拟,我发现最好的做法是向模拟中添加一些事件(这可能意味着你需要手动滚动你的模拟)。 这些事件将被用于允许测试与测试中的线程代码同步和阻塞。

所以,举个例子,可以说我们有一些非常简单的东西,一个处理工作项目的多线程队列。 你会嘲笑工作项目。 该接口可能包含一个线程调用来执行工作的“Process()”方法。 你会在那里放两个事件。 一个是模拟在Process()被调用时设置的,另一个是在设置了第一个事件之后模拟器等待的。 现在,在你的测试中,你可以启动你的队列,发布一个模拟工作项目,然后等待工作项目的“我正在处理”事件。 如果你正在测试的是进程被调用,那么你可以设置其他事件,让线程继续。 如果你正在测试更复杂的东西,比如队列如何处理多个分派或者什么东西,那么在释放线程之前,你可能会做其他事情(比如发布和等待其他工作项目)。 既然你可以在测试中等待一段时间,你可以确保(比如说)只有两个工作项被并行处理,等等。关键是你使用线程代码阻塞的事件来确定测试测试可以控制什么时候运行。

我相信你的情况更复杂,但这是我用来测试线程代码的基本方法,它工作得很好。 如果您嘲笑正确的位并放入同步点,您可以对多线程代码进行令人惊讶的控制。

这里有一些关于这种事情的更多信息,尽管它是在讨论一个C ++代码库: http : //www.lenholgate.com/blog/2004/05/practical-testing.html

Question

有没有人有任何建议一致的方式来单元测试多线程应用程序? 我已经做了一个应用程序,我们的模拟“工作线程”有一个thread.sleep与一个公共成员变量指定的时间。 我们会使用这个,所以我们可以设置一个特定的线程将花费多长时间来完成它的工作,然后我们可以做我们的断言。 任何想法的更好的方法来做到这一点? 任何良好的模拟框架.NET可以处理这个?







在多处理器机器上测试多线程代码是很重要的。 双核机器可能不够用。 我已经看到在双核单处理器上没有发生的4处理器机器上发生死锁。 然后,您需要基于客户端程序创建一个压力测试,该程序会产生许多线程,并针对目标应用程序提出多个请求。 如果客户端机器是多处理器的话,它也会有所帮助,所以目标应用程序的负载更大。




不是一个单元测试,但你可以写一些测试代码,反复调用将在不同线程上执行的代码。 尝试在定期或最终一致性检查之间创建线程之间的最大交错。 当然这种方法有不可重现性的缺点,所以你需要使用大量的日志记录来判断出了什么问题。 这种方法最好与每个线程单个任务的单元测试相结合。