快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

使用ConTest进行多线程单元测试

时间:2010-12-08 IBM Yarden Nir-Buchbinde

并行程序易于产生 bug 不是什么秘密。编写这种程序是一种挑战,并且在编程过程中悄悄产生的 bug 不容易被发现。许多并行 bug 只有在系统测试、功能 测试时才能被发现或由用户发现。到那时修复它们需要高昂的费用 -- 假设能够 修复它们 -- 因为它们是如此难于调试。

在本文中,我们介绍了 ConTest,一种用于测试、调试和测量并行程序范围 的工具。正如您将很快看到的,ConTest 不是单元测试的取代者,但它是处理并 行程序的单元测试故障的一种补充技术。

为什么单元测试还不够

当问任何 Java™ 开发者时,他们都会告诉您单元测试是一种好的实践。 在单元测试上做适当的投入,随后将得到回报。通过单元测试,能较早地发现 bug 并且能比不进行单元测试更容易地修复它们。但是普通的单元测试方法(即 使当彻底地进行了测试时)在查找并行 bug 方面不是很有效。这就是为什么它 们能逃到程序的晚期 。

为什么单元测试经常遗漏并行 bug?通常的说法是并行程序(和 bug)的问 题在于它们的不确定性。但是对于单元测试目的而言,荒谬性在于并行程序是非 常 确定的。下面的两个示例解释了这一点。

无修饰的 NamePrinter

第一个例子是一个类,该类除了打印由两部分构成的名字之 外,什么也不做。出于教学目的,我们把此任务分在三个线程中:一个线程打印 人名,一个线程打印空格,一个线程打印姓和一个新行。一个包括对锁进行同步 和调用 wait() 和 notifyAll() 的成熟的同步协议能保证所有事情以正确的顺 序发生。正如您在清单 1 中看到的,main() 充当单元测试,用名字 "Washington Irving" 调用此类:

清单 1. NamePrinter

public class NamePrinter {    private final String firstName;    private final String surName;    private final Object lock = new Object();    private boolean printedFirstName = false;    private boolean spaceRequested = false;    public NamePrinter(String firstName, String surName) {     this.firstName = firstName;     this.surName = surName;    }    public void print() {     new FirstNamePrinter().start();     new SpacePrinter().start();     new SurnamePrinter().start();    }    private class FirstNamePrinter extends Thread {     public void run() {       try {        synchronized (lock) {          while (firstName == null) {           lock.wait();          }          System.out.print(firstName);          printedFirstName = true;          spaceRequested = true;          lock.notifyAll();        }       } catch (InterruptedException e) {        assert (false);       }     }    }    private class SpacePrinter extends Thread {     public void run() {       try {        synchronized (lock) {          while ( ! spaceRequested) {           lock.wait();          }          System.out.print('' '');          spaceRequested = false;          lock.notifyAll();        }       } catch (InterruptedException e) {        assert (false);       }     }    }    private 

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