java标准单元测试库 junit 4 抢先看
ReadyGo!技术成就梦想
www.efish.cn
efish
2007-10-8 1:15:49
junit 是 java? 语言事实上的 标准单元测试库。junit 4 是该库三年以来最具里程碑意义的一次发布。它的新特性主要是通过采用 java 5 中的标记(annotation)而不是利用子类、反射或命名机制来识别测试,从而简化测试。在本文中,执着的代码测试人员 elliotte harold 以 junit 4 为例,详细介绍了如何在自己的工作中使用这个新框架。注意,本文假设读者具有 junit 的使用经验。
junit 由 kent beck 和 erich gamma 开发,几乎毫无疑问是迄今所开发的最重要的第三方 java 库。正如 martin fowler 所说,“在软件开发领域,从来就没有如此少的代码起到了如此重要的作用”。junit 引导并促进了测试的盛行。由于 junit,java 代码变得更健壮,更可靠,bug 也比以前更少。junit(它本身的灵感来自 smalltalk 的 sunit)衍生了许多 xunit 工具,将单元测试的优势应用于各种语言。nunit (.net)、pyunit (python)、cppunit (c++)、dunit (delphi) 以及其他工具,影响了各种平台和语言上的程序员的测试工作。
然而,junit 仅仅是一个工具而已。真正的优势来自于 junit 所采用的思想和技术,而不是框架本身。单元测试、测试先行的编程和测试驱动的开发并非都要在 junit 中实现,任何比较 gui 的编程都必须用 swing 来完成。junit 本身的最后一次更新差不多是三年以前了。尽管它被证明比大多数框架更健壮、更持久,但是也发现了 bug;而更重要的是,java 不断在发展。java 语言现在支持泛型、枚举、可变长度参数列表和注释,这些特性为可重用的框架设计带来了新的可能。
junit 的停滞不前并没有被那些想要废弃它的程序员所打败。挑战者包括 bill venners 的 artima suiterunner 以及 cedric beust 的 testng 等。这些库有一些可圈可点的特性,但是都没有达到 junit 的知名度和市场占有份额。它们都没有在诸如 ant、maven 或 eclipse 之类的产品中具有广泛的开箱即用支持。所以 beck 和 gamma 着手开发了一个新版本的 junit,它利用 java 5 的新特性(尤其是注释)的优势,使得单元测试比起用最初的 junit 来说更加简单。用 beck 的话来说,“junit 4 的主题是通过进一步简化 junit,鼓励更多的开发人员编写更多的测试。”junit 4 尽管保持了与现有 junit 3.8 测试套件的向后兼容,但是它仍然承诺是自 junit 1.0 以来 java 单元测试方面最重大的改进。
注意:该框架的改进是相当前沿的。尽管 junit 4 的大轮廓很清晰,但是其细节仍然可以改变。这意味着本文是对 junit 4 抢先看,而不是它的最终效果。
测试方法
以前所有版本的 junit 都使用命名约定和反射来定位测试。例如,下面的代码测试 1+1 等于 2:
import junit.framework.testcase;
public class additiontest extends testcase {
private int x = 1;
private int y = 1;
public void testaddition() {
int z = x + y;
assertequals(2, z);
}
}
而在 junit 4 中,测试是由 @test 注释来识别的,如下所示:
import org.junit.test;
import junit.framework.testcase;
public class additiontest extends testcase {
private int x = 1;
private int y = 1;
@test public void testaddition() {
int z = x + y;
assertequals(2, z);
}
}
使用注释的优点是不再需要将所有的方法命名为 testfoo()、testbar(),等等。例如,下面的方法也可以工作:
import org.junit.test;
import junit.framework.testcase;
public class additiontest extends testcase {
private int x = 1;
private int y = 1;
@test public void additiontest() {
int z = x + y;
assertequals(2, z);
}
}
下面这个方法也同样能够工作:
import org.junit.test;
import junit.framework.testcase;
public class additiontest extends testcase {
private int x = 1;
private int y = 1;
@test public void addition() {
int z = x + y;
assertequals(2, z);
}
}
这允许您遵循最适合您的应用程序的命名约定。例如,我介绍的一些例子采用的约定是,测试类对其测试方法使用与被测试的类相同的名称。例如,list.contains() 由 listtest.contains() 测试,list.add() 由 listtest.addall() 测试,等等。
testcase 类仍然可以工作,但是您不再需要扩展它了。只要您用 @test 来注释测试方法,就可以将测试方法放到任何类中。但是您需要导入 junit.assert 类以访问各种 assert 方法,如下所示:
import org.junit.assert;
public class additiontest {
private int x = 1;
private int y = 1;
@test public void addition() {
int z = x + y;
assert.assertequals(2, z);
}
}
您也可以使用 jdk 5 中新特性(static import),使得与以前版本一样简单:
import static org.junit.assert.assertequals;
public class additiontest {
private int x = 1;
private int y = 1;
@test public void addition() {
int z = x + y;
assertequals(2, z);
}
}
这种方法使得测试受保护的方法非常容易,因为测试案例类现在可以扩展包含受保护方法的类了。
setup 和 teardown
junit 3 测试运行程序(test runner)会在运行每个测试之前自动调用 setup() 方法。该方法一般会初始化字段,打开日志记录,重置环境变量,等等。例如,下面是摘自 xom 的 xsltransformtest 中的 setup() 方法:
protected void setup() {
system.seterr(new printstream(new bytearrayoutputstream()));
inputdir
责任编辑: efish
参与评论
查找更多:
核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级核心java基础j2eexmlj2sej2me问题解决核心技术高级
-
相关文章
java开源项目——突破junit的局限
“没有人喜欢bug。”大多数关于单元测试的文章以这句话开篇。的确,我们都希望代码如设计的那样准确地执行,..
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..
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
