关键词:
不稳定测试
数据冲突
多线程程序
读写访问
摘要:
Java多线程程序因其高效的并行处理能力而广泛应用到互联网、金融等生活的方方面面,对软件质量提出了更高的要求。不稳定测试(Flaky Test)是指对源程序的同一测试用例,多次执行可能会得到不一样的结果。多线程环境下不稳定测试的出现,使测试人员无法根据测试结果来确定程序是否存在错误,降低了软件测试的可信度。
Java多线程程序中,并发是导致不稳定测试的主要原因。测试用例的不同执行可能引起并发线程交错的不同,进而导致测试执行结果的不同。实际上,当两个可能存在数据冲突的线程交错时,有可能导致测试执行结果不一致。然而,现有Java多线程程序不稳定测试检测工具大多随机安排线程交错以检测不稳定测试,交错空间巨大且检测效率低下。
为有效检测Java多线程程序的不稳定测试,本文提出了一种以数据冲突为导向的不稳定测试检测方法,优先考虑具有数据冲突关系的线程进行调度,以检测测试结果是否发生变化。具体而言,针对Java多线程程序测试用例的动态执行轨迹,分析轨迹中共享变量的读写操作,并与同步保护机制相结合,抽象潜在冲突对(Conflicts Pairs,CPs)来表示测试中线程交错下的潜在数据冲突,以更好地指导不稳定测试检测中的线程调度。考虑到不同的潜在冲突对隐含的线程交错不同,对测试不稳定的影响不同,提出了一个贝叶斯网络的潜在冲突对测试不稳定度评估框架。在此基础上,优先考虑对测试不稳定影响大的潜在冲突对,设计相应的调度策略以尽可能触发不稳定测试。
为验证本文提出方法的有效性,本文在18个Java多线程程序的67个测试用例上进行了实验和评估,实验结果表明本文的以数据冲突为导向的不稳定测试检测方法在检测Java多线程程序不稳定测试时准确率达88.9%。与经典的不稳定测试检测技术相比,本文方法提高了9.3%的准确率,实验结果表明,本文方法能在平均47.5秒内发现不稳定测试,相比经典的翻转方法缩短了13%的检测时间,与随机方法相比减少了44%的时间消耗。