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

时间:2013-12-12 16:47:25

标签: java multithreading unit-testing debugging concurrency

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

试了很久:

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的任何建议,可以通过静态代码分析或字节代码检测记录特定的线程间隔,并重放以进行调试。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

希望它有所帮助。很抱歉迟到的回复,但我最近加入了