【问题标题】:How to create a test environment for a multi-threaded application如何为多线程应用程序创建测试环境
【发布时间】:2010-10-13 21:09:22
【问题描述】:

全部,

最近我开发了一个据称是线程安全类的代码。现在我之所以说“应该”是因为即使在使用了同步块、不可变数据结构和并发类之后,由于 JVM 的线程调度环境,我也无法在某些情况下测试代码。即我只有纸上的测试用例,但无法复制相同的测试环境。有没有什么具体的指导方针或者有经验的成员可以分享一下如何测试多线程环境。

【问题讨论】:

    标签: java multithreading unit-testing testing concurrency


    【解决方案1】:

    首先,您不能仅通过测试来确保您的类是完全线程安全的。无论您在其上运行什么测试,您仍然需要让尽可能多的有经验的眼睛审查您的代码,以检测细微的并发问题。

    也就是说,您可以设计特定的测试场景来尝试涵盖所有可能的线程间计时场景,就像您所做的那样。有关这方面的想法(以及一般设计线程安全类),建议阅读Java Concurrency in Practice

    此外,您可以运行压力测试,在很长一段时间内同时执行多个线程。线程的数量应该远远超过合理的限制,以确保经常发生线程争用 - 这增加了潜在的并发错误随着时间的推移而出现的机会。

    【讨论】:

    • 经验丰富的眼睛和压力测试 - 总计 +1 :)
    • 感谢彼得的建议
    【解决方案2】:

    另外,我建议您使用code coverage 测量工具并将高标准作为您的目标。例如,为修改后的条件/决策覆盖率设定一个高目标。

    【讨论】:

    • 这在一般情况下当然很有用,但在测试并发代码时可能不一定有多大帮助。这有助于确保在单个线程中遍历大多数或所有可能的执行路径。但它对线程间计时没有任何影响,这是并发问题的根源。
    • 嗯...我想说的是,调节线程间时序的元素应尽可能完整地执行。如果您可以确保压力测试场景在某个时刻已经执行了所有变体中的所有可能决策,那么您可以说压力测试已经过适当的设计,因此您的应用程序已经过适当的验证。另外,我发现这个链接可能有用... (springerlink.com/content/b2jk158074366499)
    【解决方案3】:

    我们使用GroboUtils 来创建多线程测试。

    【讨论】:

      【解决方案4】:

      如果您计划测试代码以使其可靠,则将其设为单线程。

      线程应该保留给那些不需要特别工作的代码,或者足够简单以进行静态分析并且无需测试就能证明是正确的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        相关资源
        最近更新 更多