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



Answers

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

问题是测试问题的线程方面,但至少现在你有一个点,这个线程与执行工作的代码接口,希望你有一个可以模拟的接口。 既然你有一个模拟线程代码调用的代码我发现最好的事情就是向mock添加一些事件(这可能意味着你需要手动滚动你的模拟)。 然后,这些事件将用于允许测试与测试中的线程代码同步并阻止它们。

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

我确定你的情况更复杂,但这是我用来测试线程代码的基本方法,它运行得很好。 如果你模拟出正确的位并放入同步点,你可以对多线程代码进行惊人的控制。

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

Question

有没有人对一致的多线程应用程序单元测试方法有任何建议? 我做了一个应用程序,其中我们的模拟“工作线程”有一个thread.sleep,其时间由公共成员变量指定。 我们将使用它,以便我们可以设置特定线程完成其工作所需的时间,然后我们可以执行断言。 有没有更好的方法来做到这一点的想法? 任何可以处理这个问题的.Net好的模拟框架?




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




在多处理器计算机上测试多线程代码非常重要。 双核机器可能还不够。 我已经看到死机发生在4处理器机器上,而双核单处理器上却没有发生。 然后,您需要基于客户端程序创建压力测试,该客户端程序会生成许多线程并对目标应用程序发出多个请求。 如果客户端计算机也是多处理器,那么它会有所帮助,因此目标应用程序上的负载会更多。







Links