java开源项目——突破junit的局限
ReadyGo!技术成就梦想
www.efish.cn
efish
2007-10-24 15:42:39
“没有人喜欢bug。”大多数关于单元测试的文章以这句话开篇。的确,我们都希望代码如设计的那样准确地执行,但是就好像叛逆孩子一样,程序在完成之后产生的行为将难以控制。比那些家长们幸运的是,我们可以运用工具以确保程序达到预期效果。
市面上有很多用于测试,分析以及debug程式的工具,其中以junit最为有名。这是一个协助软件工程师,qa(品质监管)工程师测试阶段性代码的平台。几乎每个接触过junit的人都对它有强烈的感情:要么喜欢,要么讨厌。主要的抱怨之一是它缺少做复杂场景测试的能力。
通过突破传统模式的思考,这一问题可以得到解决。这篇文章将介绍junit如何利用pisces来实现复杂测试。pisces是一个开源项目,作为junit的扩展,它可以让你写出由一些junit测试组成的测试单元,每个测试单元可以以串行或并行的方式运行在一个远程主机上。pisces可以让你构成、运行复杂场景,并在一个地点协调它们。
junit 基础
junit中有两个基本对象,testcase和testsuite。testcase通过提供一组方法来实现一系列测试。例如,setup()方法用来在每项测试开始前建立测试所需的测试环境,而teardown()方法用来在测试后销毁该环境。其他的方法都会完成各式各样的任务,例如,在测试中进行性能检测,判断变量是否为null,比较变量以及捕捉异常。
要创建测试程序,需要继承testcase类,覆写setup和teardown方法,然后添加自己的测试函数,这些函数通常以“test测试名”的形式命名。
下面是一个测试程序的例子:
public class mytestcase extends testcase {
/**
* call super constructor with a test name
* string argument.
* @param testname the name of the method that
* should be run.
*/ public mytestcase(string testname){
super(testname);
}
/**
* called before every test
* 在每项测试开始前被调用
*/ protected void setup() throws exception {
initsomething();
}
/**
* called after every test
* 在测试完成后被调用
*/ protected void teardown() throws exception {
finalizesomething();
}
/**
* this method tests that ...
* 这个方法测试……
*/ public void testsometest1(){ ... }
/**
* this method tests that ...
* 这个方法测试……
*/ public void testsometest2 (){
...
}
}
testsuite是由几个testcase或其他的testsuite构成的。你可以很容易的构成一个树形测试,每个测试都由持有另外一些测试的testsuite来构成。被加入到testsuite中的测试在一个线程上依次被执行。
activetestsuite是testsuite的一个子类。被添加到activetestsuite中的测试程序以并行方式执行,每个测试在一个独立的线程上运行。创建一个测试单元的方法之一是继承testsuite类并覆写suite()方法。
下面是一个简单的例子:
public class mytestsuite extends testsuite { public static test suite() {
testsuite suite = new testsuite("test suite for ...");
// add the first test // 添加第一个测试
mytestcase mtc = new mytestcase("testsometest1");
suite.addtest(mtc);
// add the second test // 添加第一个测试
mytestcase mtc2 =new mytestcase("testsometest2");
suite.addtest(mtc2);
return suite;
}
}
运行一个测试或测试单元非常简单,因为从junit提供的gui开始,到所有的ide开发环境,例如eclipse,都有gui可以使用。
图1, 显示了testsuite在eclipse中是如何表示的。
]
图1,集成在eclipse中的junit
因为介绍junit并不是这篇文章的主题,而且有很多关于junit的文章,本文就只提供这些junit基础概念的概要。在“资源”小节里有对junit更深入介绍的文章。
junit的优点和缺点
junit是一个易用的,灵活的,开源的,测试平台。就像所有其他项目一样,它有很多优点,但也有不足之处。通过使用无需人工干预的junit自动测试平台,我们很容易累积起大量的junit测试程序从而保证以往的bug不会重现。另外,junit便于和编译单元(如,ant)以及ide单元(如,eclipse)集成。
junit的弱点也众所周知。它仅支持同步测试,而且不支持重现和其他异步单元。junit是一个黑箱测试平台,因此测试那些不会直接影响功能的bug(例如,内存泄漏)就非常困难。除此之外,它不支持易用的脚本语言,因此,想要使用junit就要懂得java。
junit的另一个不足是junit测试被限制于一个jvm之上。当要测试复杂或分布式场景的时候,这就变成个大问题。本文剩下的部分,就这个问题及其解决方法进行论述。
复杂场景测试:试复杂的分布式场景?
1. 那些确保小单元的完整性的测试很有用,但同时也有局限性。经验告诉我们,大多数bug是在完整的测试中被发现的。这些问题从两个模块不能一同正常协调工作,到两个独立应用程序的异常。无论这是两个应用服务,还是客户/服务环境,甚至是点对点模式,对这些复杂场景的测试尤其重要,因为那些难缠的bug往往寄生于此。但是用junit对此几乎无能为力。
2. 虽然java具有平台无关性,但测试一个应用程序在多种操作系统上的表现还是一个明智的选择。你的程序可能在所有的操作系统上都能运行,但是却不一定严格地按照你设计的那样正常工作。在所有的操作系统上重复同样的一组测试程序是一件耗时的工程,而用junit你不能进行分布式测试,因此你无法让同样的一组测试同时运行在几个jvm之上,而每个jvm运行在不同的操作系统之上。
3. 一些单元代码,只能在多jvm场景下被测试。例如,测试建立一个连接(tcp socket或者http连接)以及从中取得的信息的完整性。这样的测试不可能(或者说很难)在单一jvm上测试。而这是junit给我们的唯一选择。
用ant协同测试
仅使用junit和ant来协调几个运行在不同jvm上的测试是可能的。ant可以以并行或者串行的方式执行任务(使用<parallel>标记),而且可以设置当有任何测试失败的时候,就停止运行。
但这种方法有其局限性,首先,使用junit和ant仍然把你限制在一个操作系统之上。其次,随着你的测试程序的累积,你会发现ant xml文件会变得越来越大,以至于无法管理。第三,我们发现在某些情况下,分支jvm会在ant任务结束后保留下来甚至继续运行。
pisces项目就是为了解决junit的这些限制而来的,它给予junit复杂场景和分布式测试的能力。本文下面的章节将介绍这个开源项目。
利用pisces打破junit的局限
pisces基础知识
pisces是
责任编辑: efish
参与评论
查找更多:
核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级
-
相关文章
jbuilder2005单元测试之junit框架
简单的框架 junit是由erich gamma和kent beck开发的开源测试框架,jbuilder集成了这个框架并对此做了..
用 jython 构建 junit 测试包
开发人员有多种理由决定自动化单元测试。许多人甚至进一步发挥它,自动化这些测试的定位和执行。但是如果想..
junit实施
测试的概念 回归测试框架-junit design by contract refactoring ide对junit的支持 junit简..
用junit框架实现java单元测试
随着软件项目的逐渐增大,软件测试在软件开发中的地位显得越来越重要。如果软件项目没有良好的测试流程,随..
tomcat类加载机制
tomcat server在启动的时候将构造一个classloader树,以保证模块的类库是私有的 tomcat server的classlo..
判断java_home友好提示用户
javalauncherbat.zip 4kb
这个脚本执行后判断 java_home 是不是有效, 如果找不到的话就打开帮助页面指..
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
