使用ConTest进行多线程单元测试 - 编程入门网
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
这个步骤使类变得完全错误:它不再包含能保证事情以正确顺序发生的指令 。但我们编译和运行此类时会发生什么情况呢?所有的事情都完全相 同!"Washington Irving" 以正确的顺序打印出来。 此试验的寓义是什么?设想 NamePrinter 以及它的同步协议是并行类。您运 行单元测试 -- 也许很多次 -- 并且它每次都运行得很好。自然地,您认为可以 放心它是正确的。但是正如您刚才所看到的,在根本没有同步协议的情况下输出 同样也是正确的,并且您可以安全地推断在有很多错误的协议实现的情况下输出 也是正确的。因此,当您认为 已经测试了您的协议时,您并没有真正地 测试它 。 现在我们看一下另外的一个例子。 使用ConTest进行多线程单元测试(3)时间:2010-12-08 IBM Yarden Nir-Buchbinde多bug的任务队列 下面的类是一种常见的并行实用程序模型:任务队列。它有一个能使任务入 队的方法和另外一个使任务出队的方法。在从队列中删除一个任务之前,work() 方法进行检查以查看队列是否为空,如果为空则等待。enqueue() 方法通知所有 等待的线程(如果有的话)。为了使此示例简单,目标仅仅是字符串,任务是把 它们打印出来。再一次,main() 充当单元测试。顺便说一下,此类有一个 bug 。 清单 3. PrintQueue
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |