如何在Java中有效地测试(单元/集成)并发代码?

2022-09-02 13:49:20

我已经在SO上看到了这篇文章,但它仍然回避了这个问题,至少对于Java来说。对于任何多线程的应用程序(我正在为此用例测试Web应用程序),这似乎应该是一个紧迫的问题。你们是如何处理它的,允许你们的线程交错 - 本质上意味着测试随机线程行为。


答案 1

我认为这本质上是困难的,因为你正在寻找证明在(可能)非行列式系统中不存在某些东西。话虽如此,编写可重复的测试来强调您的多线程组件始终是值得的。如果出现问题,您可能无法重复,但您可以通过检查找到错误。因此,请确保您的测试非常详细地记录相关异常(以及可能的输入参数等)。

运行静态代码分析器也是值得的。这些将(除其他事项外)发现变量的不一致同步,并立即突出需要关注的领域。FindBugs就是这样一种工具。


答案 2

我通常会在单元测试中生成大量(如100个)线程,并将它们发送给它,希望:)达到竞争条件。可悲的是,这并不是很确定。不过,您可以通过在线程敏感区域设置调试线来提高赔率,这些调试线会导致活动线程在 X millis 时休眠。此策略允许您将空白窗口保留在其他线程可以交错的位置。这些行仅在单元测试期间处于活动状态(使用仅在设置调试标志时才激活的方面或硬代码行)。

证明否定是很难的,甚至是不可能的。您无法真正证明自己没有并发问题。你所能做的就是设置你的测试,尽可能彻底地练习它。