如何为多线程应用程序创建测试环境

6

大家好,

最近我开发了一段代码,应该是一个线程安全的类。我之所以说“应该”是因为即使使用了同步块、不可变数据结构和并发类,由于JVM的线程调度环境,我无法对某些情况下的代码进行测试。也就是说,我只有纸上的测试案例,但无法复制相同的测试环境。这里是否有经验丰富的成员可以分享关于如何测试多线程环境的特定指南或建议呢?

4个回答

10

首先,仅通过测试无法保证您的类是完全线程安全的。无论您对其运行何种测试,您仍需要尽可能多地让经验丰富的人员审查您的代码,以检测微妙的并发问题。

话虽如此,您可以设计特定的测试场景来尝试覆盖所有可能的线程间定时方案,就像您所做的那样。关于此(以及一般设计线程安全的类),建议阅读Java并发编程实战

此外,您可以运行压力测试,在较长时间内同时执行许多线程。线程数应远远超出合理限制,以确保线程竞争经常发生-这提高了潜在的并发错误随时间显现的机会。


经验丰富的眼睛和压力测试 - 总共+1 :) - aperkins
感谢Peter的建议。 - name_masked

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

1
这在一般情况下确实很有用,但当测试并发代码时可能并没有太大帮助。它适用于确保在单个线程内遍历了大多数或全部可能的执行路径。但它对跨线程的时间同步没有任何影响,而这是并发问题的根源。 - Péter Török
嗯...我想表达的是,调节线程间时序的元素应尽可能完整地执行。如果您能确保压力测试场景在某个时刻已经执行了所有可能的决策及其变体,那么您可以说该压力测试已经得到适当设计,因此您的应用程序已经得到了正确的验证。另外,我找到了这个链接,可能会有所帮助... (http://www.springerlink.com/content/b2jk158074366499/) - EKI

1

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


0
如果你有计划测试以确保代码的可靠性,那么请将其设计为单线程。
多线程应该保留给那些不需要特别工作的代码,或者足够简单以便进行静态分析并在没有测试的情况下证明其正确性的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接