2010-10-13 67 views
6

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

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

回答

10

首先,您不能确保只有通过测试,您的班级完全线程安全。无论您在哪个测试上运行,您仍需要通过尽可能多的有经验的眼光审查您的代码,您可以通过来检测细微的并发问题。

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

此外,您可以运行压力测试,在延长的时间内同时执行多个线程。线程的数量应该超过合理的限制,以确保线程争用经常发生 - 这提高了潜在并发错误随时间显现的可能性。

+0

经验丰富的眼睛和压力测试 - 总+1 :) – aperkins 2010-10-13 21:25:34

+0

优秀的答案。 – whiskeysierra 2010-10-13 21:52:42

+0

+1对于书 – Jayan 2010-10-14 05:38:13

1

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

+0

明白了..谢谢您 – 2010-10-14 06:51:47

+1

这一般在一般情况下是有用的,但它在测试并发代码时可能没有什么帮助。这对于确保大多数或所有可能的执行路径都在单个线程中被遍历有好处。但它对线程间时序没有任何影响,这是并发问题的根源。 – 2010-10-14 13:16:07

+0

嗯......我试图做的一点是,调整线程间时序的元素应该尽可能完整地执行。 如果您可以确保压力测试场景在某些时候已经在所有变体中执行了所有可能的决策,那么您可以说压力测试已经过适当设计,因此您的应用程序已经过适当的验证。 此外,我发现这个链接可能有用...(http://www.springerlink.com/content/b2jk158074366499/) – EKI 2010-10-14 13:45:16

1

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

+0

非常感谢! – 2010-10-14 06:51:02

0

如果你有你打算测试的代码以使它可靠,那么使它成为单线程。

线程应该保留给那些不需要特别工作的代码,或者足够简单以便静态分析并在没有测试的情况下证明是正确的代码。