快速业务通道

Java理论与实践: 平衡测试,第3部分:用方面检验设计约束 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
上执行任意测试代码,从而对声明的问题提 供更精细的控制。

也可以容易地创建一个静态方面,在编译时识别对 System.gc() 的调用,如 清单 2 所示。同样,如果想发现在库代码中出现的这个 bug 模式,不仅要处理 项目中的代码,还要处理它使用的库。

清单 2. 执行 “不调用 System.gc()” 规则的静态方面

public  aspect StaticGcAspect {    pointcut gcCalls() : call(void java.lang.System.gc ());    declare error : gcCalls() : "Don''t call System.gc!"; }

Java理论与实践: 平衡测试,第3部分:用方面检验设计约束(2)

时间:2010-12-22 IBM Brian Goetz

检查对 Swing 单线程规则的违犯

有一个几乎无法静态地实施的规则是线程限制 —— 指定的对象只能从一个 线程访问(有时是特定线程,例如 Swing 事件线程)。Swing 程序的正确性依 赖于线程限制,但是对于实施这个规则,从编译器、运行时或类库都得不到任何 帮助。如果违犯了这个规则,程序就会被破坏,但是因为在测试时程序可能看起 来工作正常,所以问题可能一直暴露不了。

Swing 单线线程规则指定:

Swing 组件和模块只应当从事件分派线程中创建、修改和实现。

单线程规则的早期描述允许 Swing 组件和模块在屏幕上出现之前,由其他线 程访问,但是这种方式带来了线程安全问题,所以规则被强化了。使用 SwingUtilities.isEventDispatchThread() 方法,Swing 提供了一个机制,询 问 “当前线程是不是事件分派线程?”。所以需要在每个 Swing 的方法调用之 前插入代码,检查调用是否是由合适的线程发出的,如果不是由合适线程发出的 ,就抛出 AssertionError,这样就能在测试中捕捉到对单线程规则的违犯,而 不会让它们在生产中造成莫名其妙的故障。

清单 3 演示了一个可以检测许多单线程规则违犯的方面:它有两部分:不应 当从事件线程之外调用的方法的列表,以及要插到对这些方法的调用之前的代码 。建议(要插入的代码)非常简单:检查当前线程是否是事件线程,如果不是, 就抛出 AssertionError。这个方面处理了对 Swing 包中的所有方法以及扩展了 最重要的 Swing 类的那些类中的方法的全部调用(以便捕捉用户提供的组件和 模块),但是它排除了这些类中已知为可以安全地(或者需要)从多线程调用的 方法。安全方法列表并不全面;构建一个全面的列表可能要花费一些额外时间研 究 Javadoc,找到所有标记为线程安全的方法。

清单 3. 实施 Swing 的单线程规则的方面

public aspect  SwingThreadAspect {   pointcut swingMethods() : call(* javax.swing..*.*(..))      || call(javax.swing..*.new(..));   pointcut extendsSwing() : call(* javax.swing.JComponent+.* (..))      || call(* javax.swing..*Model+.*(..))      || call(* javax.swing.text.Document+.*(..));   pointcut safeMethods() : call(void JComponent.revalidate())      || call(void JComponent.invalidate(..))      || call(void JComponent.repaint(..))      || call(void add*Listener(EventListener+))      || call(void remove*Listener(EventListener+))      || call(boolean SwingUtilities.isEventDispatchThread())      || call(void SwingUtilities.invokeLater(Runnable))      || call(void SwingUtilities.invokeAndWait(Runnable))      || call(void JTextPane.replaceSelection(..))      || call(void JTextPane.insertComponent(..))      || call(void JTextPane.insertIcon(..

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号