操纵ConTest举行多线程单元测试[Java编程]
本文“操纵ConTest举行多线程单元测试[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
并路程序易于产生 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 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举行多线程单元测试[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |