快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
class SurnamePrinter extends Thread {     public void run() {       try {        synchronized(lock) {          while ( ! printedFirstName || spaceRequested ||  surName == null) {           lock.wait();          }          System.out.println(surName);        }       } catch (InterruptedException e) {        assert (false);       }     }    }    public static void main(String[] args) {     System.out.println();     new NamePrinter("Washington", "Irving").print();    } }

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

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

如果您愿意,您可以编译和运行此类并且检验它是否像预期的那样把名字打 印出来。 然后,把所有的同步协议删除,如清单 2 所示:

清单 2. 无修饰的 NamePrinter

public class  NakedNamePrinter {    private final String firstName;    private final String surName;    public NakedNamePrinter(String firstName, String surName)  {     this.firstName = firstName;     this.surName = surName;     new FirstNamePrinter().start();     new SpacePrinter().start();     new SurnamePrinter().start();    }    private class FirstNamePrinter extends Thread {     public void run() {       System.out.print(firstName);     }    }    private class SpacePrinter extends Thread {     public void run() {       System.out.print('' '');     }    }    private class SurnamePrinter extends Thread {     public void run() {       System.out.println(surName);     }    }    public static void main(String[] args) {     System.out.println();     new NakedNamePrinter("Washington", "Irving");    } }

这个步骤使类变得完全错误:它不再包含能保证事情以正确顺序发生的指令 。但我们编译和运行此类时会发生什么情况呢?所有的事情都完全相 同!"Washington Irving" 以正确的顺序打印出来。

此试验的寓义是什么?设想 NamePrinter 以及它的同步协议是并行类。您运 行单元测试 -- 也许很多次 -- 并且它每次都运行得很好。自然地,您认为可以 放心它是正确的。但是正如您刚才所看到的,在根本没有同步协议的情况下输出 同样也是正确的,并且您可以安全地推断在有很多错误的协议实现的情况下输出 也是正确的。因此,当您认为 已经测试了您的协议时,您并没有真正地 测试它 。

现在我们看一下另外的一个例子。

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

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

多bug的任务队列

下面的类是一种常见的并行实用程序模型:任务队列。它有一个能使任务入 队的方法和另外一个使任务出队的方法。在从队列中删除一个任务之前,work() 方法进行检查以查看队列是否为空,如果为空则等待。enqueue() 方法通知所有 等待的线程(如果有的话)。为了使此示例简单,目标仅仅是字符串,任务是把 它们打印出来。再一次,main() 充当单元测试。顺便说一下,此类有一个 bug 。

清单 3. PrintQueue

import java.util.*; public class PrintQueue {    private LinkedList<String> queue = new  LinkedList<String>();    privat

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