快速业务通道

使用ConTest进行多线程单元测试 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
nted first) >Irving   Washington (surname + new-line printed first) > Irving Washington (space, surname, first name)

注意不需要得到像上面那样顺序的结果或相继顺序的结果;您可能在看到后 面的两个结果之前先看到几次前面的两个结果。但是很快,您将看到所有的结果 。 ConTest 使各种交错情况出现;由于随机地选择交错,每次运行同一个测试 时都可能产生不同的结果。相比较的是,如果使用 ConTest 运行如 清单 1 所 示的 NamePrinter ,您将总是得到预期的结果。在此情况下,同步协议强制以 正确的顺序执行,所以 ConTest 只是生成合法的 交错。

如果您使用 ConTest 运行 PrintQueue,您将得到不同顺序的结果,这些对 于单元测试来说可能是可接受的结果。但是运行几次以后,第 24 行的 LinkedList.removeFirst() 会突然抛出 NoSuchElementException 。bug 潜藏 在如下的情形中:

启动了两个 consumer 线程,发现队列是空的,执行 wait()。

一个 producer 把任务放入队列中并通知两个 consumer。

一个 consumer 获得锁,运行任务,并把队列清空。然后它释放锁。

第二个 consumer 获得锁(因为通知了它所以它可以继续向下进行)并试图 运行任务,但是现在队列是空的。

这虽然不是此单元测试的常见交错,但上面的场景是合法的并且在更复杂地 使用类的时候可能发生这种情况。使用 ConTest 可以使它在单元测试中发生。 (顺便问一下,您知道如何修复 bug 吗?注意:用 notify() 取代 notifyAll () 能解决此情形中的问题,但是在其他情形中将会失败!)

ConTest 的工作方式

ConTest 背后的基本原理是非常简单的。instrumentation 阶段转换类文件 ,注入挑选的用来调用 ConTest 运行时函数的位置。在运行时,ConTest 有时 试图在这些位置引起上下文转换。 挑选的是线程的相对顺序很可能影响结果的 那些位置:进入和退出 synchronized 块的位置、访问共享变量的位置等等。通 过调用诸如 yield() 或 sleep() 方法来尝试上下文转换。决定是随机的以便在 每次运行时尝试不同的交错。使用试探法试图显示典型的 bug。

注意 ConTest 不知道实际是否已经显示出 bug -- 它没有预期程序将如何运 行的概念。是您,也就是用户应该进行测试并且应该知道哪个测试结果将被认为 是正确的以及哪个测试结果表示 bug。ConTest 只是帮助显示出 bug。另一方面 ,没有错误警报:就 JVM 规则而言所有使用 ConTest 产生的交错都是合法的。

正如您看到的一样,通过多次运行同一个测试得到了多个值。实际上,我们 推荐整个晚上都反复运行它。然后您就可以很自信地认为所有可能的交错都已经 执行过了。

ConTest 的特性

除了它的基本的方法之外,ConTest 在显示并行 bug 方面引入了几个主要特 性:

同步覆盖:在单元测试中极力推荐测量代码覆盖,但是在测试并行程序时使 用它,代码覆盖容易产生误导。在前两个例子中,无修饰的 NamePrinter 和多 bug 的 Print Queue,给出的单元测试显示完整的语句覆盖(除了 InterruptedException 处理)没有显示出 bug。 同步覆盖弥补了此缺陷:它测 量在 synchronized 块之间存在多少竞争;也就是说,是否它们做了“有意义的 ”事情,您是否覆盖了有趣的交错。

死锁预防: ConTest 可以分析是否以冲突的顺序嵌套地拥有锁,这表明有死 锁的危险。此分析是在运行测试后离线地进行。

调试帮助:ConTest 可以生成一些对并行调试有用的运行时报告:关于锁的 状态的报告(哪个线程拥有哪个锁,哪个线程处于等待状态等等),当前的线程 的位置的报告和关于最后分配给变量和从变量读取的值的报告。您也可以远程进 行这些查询;例如,您可以从不同的机器上查询服务器(运行 ConTest)的状态 。另一

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号