用于测试多线程 Java 应用程序的确定性记录/重放框架

Posted

技术标签:

【中文标题】用于测试多线程 Java 应用程序的确定性记录/重放框架【英文标题】:Deterministic record/replay framework for testing multi-threaded java applications 【发布时间】:2013-12-12 16:47:25 【问题描述】:

我正在开发一个使用一些第三方库的框架。框架客户端可以在多线程上下文中使用代码,但框架本身不会产生线程或使用共享内存或锁/同步。我在客户端环境中看到了一些多线程问题,并正在寻找确定性多线程测试框架,因为问题似乎出现在第三方框架中。

目前尝试过:

1) 能够在 jmeter 性能测试环境中运行几次即可重现

2) 能够通过使用 testng 多线程注释进行压力测试以不太一致的方式重现它。 (@Test(threadPoolSize = 10, invocationCount = 100, timeOut = 10000))

缺点:这只是在线程池中执行方法,不保证交错/静态代码分析或提供确定性重现的方法。

3) 尝试了 Junit 的 ActiveTestSuite 和 @ConcurrentJunitRunner。它类似于 testng 注释。

4) MultiThreadedTC :似乎适用于基于锁/同步/共享内存的多线程代码

5) GroboUtils 似乎更倾向于测试/监控共享内存

6) IBM ConTest 似乎已获得许可,我们没有试用版来确保它符合我们的需求并要求我们的管理层购买它。

任何类似于 Microsoft Chess 或 HelGrind/DRD for Java 的建议,它们可以通过静态代码分析或字节码检测记录特定的线程交错并重放以进行调试。?

我也在考虑将此工具集成到我们的单元测试/构建过程中,以避免将来发生类似错误。

【问题讨论】:

您看到什么类型的问题?如果您遇到比赛条件,vmlens 可能会有所帮助。 谢谢。我刚刚在我的项目上尝试了 vmlens。我认为该项目对于代理来说太复杂了,目前无法处理。我已经怀疑可能发生竞争条件的特定类和领域。如果您可以提供包含过滤器或测试“主题”功能而不是排除过滤器,它可能真的很有用。 见Can a multi-threaded program ever be deterministic? 【参考方案1】:

重现并发错误的记录和回放系统的主要挑战是需要记录的大量信息。记录共享变量的线程交错会产生非常大的日志和大的减速。因此,最近的研究工作尝试执行部分记录,然后使用 SMT 求解器来完成交错中丢失(未记录)的部分。

据我所知,这一领域的最新进展是一个名为共生的系统。此 URL 中提供了 java/c/c++ 的开源实现(以及测试、示例和已发表的论文):

http://www.gsd.inesc-id.pt/~nmachado/software/Symbiosis_Tutorial.html

希望对您有所帮助。抱歉回复晚了,但我最近加入了

【讨论】:

以上是关于用于测试多线程 Java 应用程序的确定性记录/重放框架的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程的非确定性行为

JAVA多线程重入锁ReentrantLock应用

《多线程》第4节:控制线程

非确定性多线程测试

201771010126 王燕《面向对象程序设计(Java)》第十七周学习总结

201771010137 赵栋《面向对象程序设计(java)》第十七周学习总结