Java理论与实践: 平衡测试,第3部分:用方面检验设计约束 - 编程入门网
上执行任意测试代码,从而对声明的问题提 供更精细的控制。
也可以容易地创建一个静态方面,在编译时识别对 System.gc() 的调用,如 清单 2 所示。同样,如果想发现在库代码中出现的这个 bug 模式,不仅要处理 项目中的代码,还要处理它使用的库。 清单 2. 执行 “不调用 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 的单线程规则的方面
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |