代码之家  ›  专栏  ›  技术社区  ›  non sequitor

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

  •  18
  • non sequitor  · 技术社区  · 15 年前

    我看见了 this 张贴已经这样,但它仍然回避问题,至少对于Java。对于任何多线程的应用程序(我正在测试这个用例的Web应用程序),这似乎都是一个紧迫的问题。你们是如何处理它的,一种允许线程交错的方式——本质上意味着测试随机线程行为。

    6 回复  |  直到 14 年前
        1
  •  9
  •   Brian Agnew    15 年前

    我认为这从本质上来说是困难的,因为你想证明一个(可能的)非行列式系统中没有什么东西。尽管如此,仍然值得编写可重复的测试来强调您的多线程组件。如果出现问题,您可能无法重复,但您可能可以通过检查找到错误。因此,请确保您的测试详细记录了相关的异常(可能还有输入参数等)。

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

        2
  •  3
  •   Chris Kessel    15 年前

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

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

        3
  •  2
  •   Kathy Van Stone    15 年前

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

    还有Java的并发分析工具,不幸的是,当我知道它们在那里时,我还没有能力去评估它们。

        4
  •  0
  •   Nathan Feger    15 年前

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

        5
  •  0
  •   Jherico    15 年前

    我的答案是避免创造这样的情况,即通过明智地使用智能设计和现有技术,您可以获得竞赛条件。例如,如果您的mt应用程序使用自包含的工作项,您可以在应用程序中嵌入一个JMS代理,以用作线程之间的通信机制。同样,对于可能受竞争条件影响的系统资源,不要使这些部分成为多线程的。如果您有需要编写的文件,那么让一个线程负责使用通过JMS子系统传递的信息来编写它们。

    最终,没有通过数字绘制的方法来单元测试mt代码,以确保它不易受到竞争条件的影响。

        6
  •  -1
  •   soru    15 年前

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

    大多数情况下,只需将所有内容都设为单线程就可以做到这一点——只有一小部分应用程序需要进程内抢占式调度提供的较小的可伸缩性提升。或者,您可以设置一个线程体系结构,在该体系结构中,使用操作系统、编译器或第三方工具来提供不确定性操作无法发生的硬保证。