【问题标题】:How can I effectively test (unit/integration) concurrent code in Java?如何在 Java 中有效地测试(单元/集成)并发代码?
【发布时间】:2009-10-22 18:30:32
【问题描述】:

我已经在 SO 上看到 this 的帖子,但它仍然引出了问题,至少对于 Java 而言。对于任何多线程的应用程序(我正在为这个用例测试一个网络应用程序)来说,这似乎应该是一个紧迫的问题。你们是如何以允许线程交错的方式处理它的——本质上意味着测试随机线程行为。

【问题讨论】:

    标签: java testing multithreading


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我通常会在单元测试中生成大量(例如 100 个)线程,然后将它们发送出去,以期达到竞争条件 :)。可悲的是,这不是很确定。您可以通过在线程敏感区域中设置调试行来提高您的几率,这会导致活动线程休眠 X 毫秒。此策略允许您将间隙窗口留给其他线程可以交错的地方。这些行只会在单元测试期间激活(使用仅在设置调试标志时激活的方面或硬代码行)。

      证明否定是不可能的。你不能真正证明你没有并发问题。您所能做的就是设置测试以尽可能彻底地进行测试。

      【讨论】:

      • 实际上我在@Test 中尝试了这种临时方法,但它甚至没有注册,线程作用于触发@Before 方面的方法,该方面设置了ThreadLocal在线程端点的其他地方使用的线程——这是一个围绕 JPA 构建的复杂用例,我存在的祸根是找出一个多线程测试。然而,普通的 Junit 工作得很好。
      【解决方案3】:

      我建议你获取Java Concurrency in Practice——它不仅首先告诉你如何避免竞争条件,还有一个关于测试并发性的部分。

      还有用于 Java 的并发静态分析工具——不幸的是,虽然我知道它们已经存在,但我无法评估它们。

      【讨论】:

        【解决方案4】:

        对此进行测试的一个好方法是确保您可以访问多 CPU 机器,然后尽可能长时间地运行您的测试/尽可能多地迭代。例如,如果你有一个多线程的生产者消费者算法,用一个大小合适的列表填充队列,并在生产中使用 2 倍的线程。这至少应该让您有机会更频繁地遇到竞争条件或同步问题。然后在每日构建中运行此测试。

        【讨论】:

          【解决方案5】:

          我对此的回答是,通过明智地使用智能设计和现有技术,避免创造可能存在竞争条件的情况。例如,如果您的 MT 应用程序使用自包含的工作项,您可以在应用程序中嵌入 JMS 代理,以用作线程之间的通信机制。与可能受到竞争条件影响的系统资源类似,不要将这些部分设为多线程。如果你有文件,你需要编写一个线程来负责使用通过 JMS 子系统传递的信息来编写它们。

          最终,没有通过数字绘制的方式来对 MT 代码进行单元测试,以确保其不受竞争条件的影响。

          【讨论】:

            【解决方案6】:

            不应测试由于非确定性线程问题而可能失败的代码。相反,它应该被删除,并用可以的东西代替。

            大多数情况下,只需将所有内容都设为单线程即可完成 - 只有一小部分应用需要进程内抢占式调度提供的微小可扩展性提升。或者,您可以设置一个线程架构,其中操作系统、编译器或第三方工具用于提供非确定性操作不会发生的硬性保证。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-08-25
              • 1970-01-01
              • 2010-11-19
              • 1970-01-01
              • 2019-02-12
              • 1970-01-01
              • 2021-03-12
              相关资源
              最近更新 更多