转载《使用NetBeans开发JUnit测试》.docx
《转载《使用NetBeans开发JUnit测试》.docx》由会员分享,可在线阅读,更多相关《转载《使用NetBeans开发JUnit测试》.docx(23页珍藏版)》请在冰豆网上搜索。
![转载《使用NetBeans开发JUnit测试》.docx](https://file1.bdocx.com/fileroot1/2023-1/31/f7a28689-e4ca-455f-9297-61fe88e3570d/f7a28689-e4ca-455f-9297-61fe88e3570d1.gif)
转载《使用NetBeans开发JUnit测试》
使用NetBeans开发工具编写JUnit测试
本文介绍在NetBeans开发工具中编写和运行JUnit单元测试的基础部分。
测试一个应用程序是开发周期的一部分,编写和维护单元测试可以保证你源代码中独立的方法可以正常工作。
NetBeans开发工具整合了对JUnit单元测试框架的支持,使得你可以简便,快捷的创建JUnit测试和测试套件。
在这个教程中你将为一个Java项目创建简单的JUnit3和JUnit4单元测试和测试套件。
第一部分展示了如何创建JUnit3测试,第二部分展示了如何在JUnit4中使用JUnit注释创建同样的测试。
因为测试都是一样的,所以不需要全部完成教程的这两部分。
但可以阅读一下这两个版本下的测试是如何编写的,这样你可以看到JUnit4中涉及的一些变化。
关于使用JUnit的更多信息,参考www.junit.org
内容
∙创建工程
o创建Java类库项目
∙编写JUnit3测试
o为Vectors.java创建一个测试用例
o为Vectors.java编写测试方法
o为Utils.java创建测试用例
o为Utils.java创建测试方法
o运行测试
∙编写JUnit4测试
o为Vectors.java创建一个测试用例
o为Vectors.java编写测试方法
o为Utils.java创建测试用例
o为Utils.java创建测试方法
o运行测试
∙创建JUnit测试套件
o创建JUnit3测试套件
o创建JUnit4测试套件
o运行测试套件
下面的教程你将会使用如下的软件和资源
NetBeansIDE
6.5,6.1or6.0
JavaDevelopmentKit(JDK)
version6orversion5
JUnitSampleSolProject
创建工程
为了完成这个教程,你首选要创建一个Java类库项目,名为JUnit-Sample。
创建Java类库工程
1.从主菜单选择文件>新建项目。
2.从Java类别中选择Java类库,点击下一步。
3.为项目输入JUnit-Sample并设置项目位置。
4.如果使用专用文件夹存储库选择被选,取消选择,点击下一步。
5.点击完成。
当你创建项目完毕,如果你查看项目的测试库节点,你会看到这个项目包含了JUnit3和JUnit4库。
IDE默认为新项目添加这两个库。
你第一次创建JUnit测试时,IDE提示你选择一个版本并移除不需要的库。
创建Java类
这个练习中你下载示例项目并复制文件Utils.java和Vectors.java到你创建的类库项目。
1.右键点击项目的源包节点,在弹出菜单选择新建>Java包。
2.输入sample作为包名。
点击完成。
3.下载并解压缩JUnitSampleSol项目,并在编译器中打开。
4.将JUnitSampleSol项目的源包中的Utils.java和Vectors.java 复制到JUnit-Sample项目中的sample源包。
如果你查看类的源代码,你可以看到Utils.java有三个方法(computeFactorial, concatWords,和 normalizeWord) Vectors.java有两个方法(equals 和 scalarMultiplication)。
下一步就是为每个类创建测试类并为这些方法编写测试用例。
编写JUnit3单元测试
在这部分教程中,你将为类Vectors.java和 Utils.java创建基础的JUnit3单元测试。
你将使用编译器创建基于项目类的测试类框架。
然后你修改这些生成的测试方法并添加新的测试方法。
编译器在你第一次为项目创建测试时会提示选择JUnit版本。
你选择的版本变为该项目默认的JUnit版本,编译器将之后的测试和测试套件都生成为该版本。
创建Vectors.java的测试类
在这个练习中你将创建Vectors.java的JUnit测试框架
1.右键点击Vectors.java选择工具>创建JUnit测试。
2.在选择JUnit版本对话框中选择JUnit3.x。
当你选择JUnit3.x编译器将从项目移去JUnit4库。
3.在创建测试对话框中将测试类名改为VectorsJUnit3Test。
当你修改测试类名时,你将会看到关于修改名称的警告。
默认的名字是基于你要测试的类名,在名称后加上Test。
例如,对于类MyClass.java,默认的测试类名是MyClassTest.java。
通常最好都保留默认名,但是在这个教程中你需要修改名字,因为你之后将在同一个包中创建JUnit4,测试类名必须是唯一的。
4.取消测试初始化函数和测试释放方法,选择确定。
当你点击确定,编译器在测试包sample目录中创建JUnit测试框架。
一个项目需要一个目录作为测试包去创建测试。
默认的测试包路径目录是项目的根级别,不过这也是依赖于你在项目属性中定义的不同的位置。
如果你用编辑器查看生成的类VectorsJUnit3Test.java,你会看到编译器生成了下面的测试类,和对应方法 equal和scalarMultiplication的测试方法。
publicclassVectorsJUnit3TestextendsTestCase{
/**
*Testofequalmethod,ofclassVectors.
*/
publicvoidtestEqual(){
System.out.println("equal");
int[]a=null;
int[]b=null;
booleanexpResult=false;
booleanresult=Vectors.equal(a,b);
assertEquals(expResult,result);
//TODOreviewthegeneratedtestcodeandremovethedefaultcalltofail.
fail("Thetestcaseisaprototype.");
}
/**
*TestofscalarMultiplicationmethod,ofclassVectors.
*/
publicvoidtestScalarMultiplication(){
System.out.println("scalarMultiplication");
int[]a=null;
int[]b=null;
intexpResult=0;
intresult=Vectors.scalarMultiplication(a,b);
assertEquals(expResult,result);
//TODOreviewthegeneratedtestcodeandremovethedefaultcalltofail.
fail("Thetestcaseisaprototype.");
}
}
每个生成的测试方法体都按图所示单独提供,它需要被修改后才能成为一个真正的测试用例。
如果你不需要自动生成代码,你可以在创建测试对话框中取消缺省方法主题选项。
当编译器生成测试方法名时,每个方法名都是在之前加上了test,因为JUnit3使用命名规范和反射识别测试。
为了能识别测试方法每个测试方法都需要按照语法test。
在JUnit4中就不需要使用这种测试方法命名语法,因为你可以使用标签识别测试方法,并且测试类也不需要继承于TestCase。
编写Vectors.java测试方法
在这个练习中你修改生成的测试方法,使得他们能运行测试并修改默认输出消息。
你不需要为了运行测试而修改输出消息,但你也许想修改输出以帮助识别在JUnit测试结果输出窗口中显示的结果。
1.在编辑器中打开VectorsJUnit3Test.java。
2.修改testScalarMultiplication的测试框架,修改println的值并且移去生成的值。
测试方法应该按照下面所示:
publicvoidtestScalarMultiplication(){
System.out.println("*VectorsJUnit3Test:
testScalarMultiplication()");
assertEquals(expResult,result);
}
3.现在添加一些断言用以测试方法。
publicvoidtestScalarMultiplication(){
System.out.println("*VectorsJUnit3Test:
testScalarMultiplication()");
assertEquals(0,Vectors.scalarMultiplication(newint[]{0,0},newint[]{0,0}));
assertEquals(39,Vectors.scalarMultiplication(newint[]{3,4},newint[]{5,6}));
assertEquals(-39,Vectors.scalarMultiplication(newint[]{-3,4},newint[]{5,-6}));
assertEquals(0,Vectors.scalarMultiplication(newint[]{5,9},newint[]{-9,5}));
assertEquals(100,Vectors.scalarMultiplication(newint[]{6,8},newint[]{6,8}));
}
这个测试方法使用JUnit的assertEquals 方法.。
使用这个断言,你要提供输入变量和期待结果。
要通过测试,测试方法必须在运行中基于提供的变量成功返回所有的期待结果。
你需要添加足够数量的断言以覆盖各种情况的组合。
4.修改testEqual 测试骨架,删除生成的方法体并添加如下println。
System.out.println("*VectorsJUnit3Test:
testEqual()");
测试方法现在看起来如下所示:
publicvoidtestEqual(){
System.out.println("*VectorsJUnit3Test:
testEqual()");
}
5.修改testEqual方法,添加如下断言:
publicvoidtestEqual(){
System.out.println("*VectorsJUnit3Test:
testEqual()");
assertTrue(Vectors.equal(newint[]{},newint[]{}));
assertTrue(Vectors.equal(newint[]{0},newint[]{0}));
assertTrue(Vectors.equal(newint[]{0,0},newint[]{0,0}));
assertTrue(Vectors.equal(newint[]{0,0,0},newint[]{0,0,0}));
assertTrue(Vectors.equal(newint[]{5,6,7},newint[]{5,6,7}));
assertFalse(Vectors.equal(newint[]{},newint[]{0}));
assertFalse(Vectors.equal(newint[]{0},newint[]{0,0}));
assertFalse(Vectors.equal(newint[]{0,0},newint[]{0,0,0}));
assertFalse(Vectors.equal(newint[]{0,0,0},newint[]{0,0}));
assertFalse(Vectors.equal(newint[]{0,0},newint[]{0}));
assertFalse(Vectors.equal(newint[]{0},newint[]{}));
assertFalse(Vectors.equal(newint[]{0,0,0},newint[]{0,0,1}));
assertFalse(Vectors.equal(newint[]{0,0,0},newint[]{0,1,0}));
assertFalse(Vectors.equal(newint[]{0,0,0},newint[]{1,0,0}));
assertFalse(Vectors.equal(newint[]{0,0,1},newint[]{0,0,3}));
}
这个测试使用JUnit的assertTrue和assertFalse 方法测试各种可能的结果。
要这个测试通过,theassertTrue必须都为true,assertFalse必须都为false。
创建Utils.java测试类
现在你开始创建Utils.java的测试框架。
在你上一次练习中创建测试时,编译去会提示你选择JUnit版本,这次你不必再次选择。
1.右键点击Utils.java选择工具>创建JUnit测试。
2.如果测试初始化函数和测试释放方法未选,将其选择。
3.在创建测试对话框中修改测试类名为UtilsJUnit3Test 选择确定。
当你选择确定,编译器会在测试包>samples包中创建UtilsJUnit3Test.java测试文件。
你可以看到添加的对应Utils.java中方法的测试框架testComputeFactorial,,testConcatWords,和 testNormalizeWord,编译器还会创建测试方法初始化函数setUp和测试方法释放函数tearDown。
编写Utils.java测试方法
在这个练习中你添加一些通用的JUnit测试要素的测试用例。
你也要在方法内添加一个println,因为一些方法默认是没有任何输入的。
通过添加println你可以在JUnit测试结果窗口看到方法运行和运行的顺序。
测试测试初始化函数和测试释放方法
setUp和tearDown方法被用来初始化和释放测试条件。
testUtils.java并不需要这两个方法,但是留在这儿可以演示他们是如何工作的。
setUp方法是一个初始化方法,在测试类的每个测试用例之前运行。
测试并不强制要求有初始化函数,但是如果你需要在运行测试前初始化一些变量,你需要用到初始化函数。
tearDown方法是测试类中每个测试用例运行之后的释放方法。
测试并不强制要求有测试释放方法,但是如果你需要在运行测试之后释放数据,你需要用到测试释放方法。
1.按照下面进行修改,在每个方法里面添加println。
@Override
protectedvoidsetUp()throwsException{
super.setUp();
System.out.println("*UtilsJUnit3Test:
setUp()method");
}
@Override
protectedvoidtearDown()throwsException{
super.tearDown();
System.out.println("*UtilsJUnit3Test:
tearDown()method");
}
当你运行测试,每个println的文本会在JUnit测试结果输出窗口显示,如果你不添加println,没有任何输出展现出方法的运行。
使用一个简单断言进行测试
这个简单的测试用例测试了concatWords方法。
你将添加一个新的测试方法名为testHelloWorld,替代使用生成的测试方法testConcatWords ,这个方法使用一个简单断言测试方法是否成功拼接字符串。
这个测试用例中的assertEquals 使用语法assertEquals(EXPECTED_RESULT,ACTUAL_RESULT)测试期望结果是否等于实际结果。
这种情况下,如果concatWords方法的输入是"Hello",", ","world"and"!
",期望结果应该等于"Hello,world!
"。
1.删除生成的测试方法testConcatWords。
2.添加如下代码测试concatWords。
publicvoidtestHelloWorld(){
assertEquals("Hello,world!
",Utils.concatWords("Hello",",","world","!
"));
}
3.添加一个println语句在JUnit测试结果窗中显示相关测试文本。
publicvoidtestHelloWorld(){
System.out.println("*UtilsJUnit3Test:
testmethod1-testHelloWorld()");
assertEquals("Hello,world!
",Utils.concatWords("Hello",",","world","!
"));
使用Timeout进行测试
这个测试演示了如何测试一个需要消耗很多时间才能完成的方法。
如果方法消耗太久时间,测试线程会中断并且测试失败。
你可以在测试中定义时间限制。
测试方法调用了Utils.java中的computeFactorial方法。
你可以假设computeFactorial方法是正确的,但在这儿你希望测试计算是否能在1000毫秒内完成。
computeFactorial线程和一个测试线程同时被启动。
测试线程将在1000毫秒后停止并抛出一个TimeoutException除非computeFactorial线程。
你可以添加一个消息,如果TimeoutException 被抛出就显示这个消息。
1.删除生成的测试方法testComputeFactorial。
2.添加testWithTimeout方法,随机生成一个数字计算阶乘。
publicvoidtestWithTimeout()throwsInterruptedException,TimeoutException{
finalintfactorialOf=1+(int)(30000*Math.random());
System.out.println("computing"+factorialOf+'!
');
ThreadtestThread=newThread(){
publicvoidrun(){
System.out.println(factorialOf+"!
="+UputeFactorial(factorialOf));
}
};
}
3.添加你的导入项import java.util.concurrent.TimeoutException.
4.在方法中添加下面的代码,如果测试耗时过长,中断线程并显示消息。
ThreadtestThread=newThread(){
publicvoidrun(){
System.out.println(factorialOf+"!
="+UputeFactorial(factorialOf));
}
};
testThread.start();
Thread.sleep(1000);
testThread.interrupt();
if(testThread.isInterrupted()){
thrownewTimeoutException("thetesttooktoolongtocomplete");
}
}
你可以修改Thread.sleep行的毫秒数值。
5.添加下面的println在JUnit测试结果窗口中显示文本。
publicvoidtestWithTimeout()throwsInterruptedException,TimeoutException{
System.out.println("*UtilsJUnit3Test:
testmethod2-testWithTimeout()");
finalintfactorialOf=1+(int)(30000*Math.random());
System.out.println("computing"+factorialOf+'!
');
测试一个预期的异常
这个测试演示如何测试一个预期的异常。
如果没有抛出特定的预期的异常,这个方法就失败了。
这种情况下你测试computeFactorial方法在输入变量为负数(-5)时抛出IllegalArgumentException。
1.添加下面的testExpectedException方法以输入值-5调用computeFactorial。
publicvoidtestExpectedException(){
try{
finalintfactorialOf=-5;
System.out.println(factorialOf+"!
="+UputeFactorial(factorialOf));
fail("IllegalArgumentExceptionwasexpected");
}catch(IllegalArgumentExceptionex){
}
}
2.添加下面的println在JUnit测试结果窗口中显示文本。
publicvoidtestExpectedException(){
System.out.println("*UtilsJUnit3Test:
testmethod3-testExpectedException()");
try{
屏蔽一个测试
这个测试展示了如何临时屏蔽一个测试方法。
在JUnit3中,如果方法名不是以test开头,就不会被识别为测试方法。
所以你可以在测试方法前添加DISABLED以屏蔽它。
1.删除生成的测试方法testNormalizeWord。
2.添加下面的测试方法到测试类中。
publicvoidtestTemporarilyDisabled()throwsException{
System.out.println("*UtilsJUnit3Test:
t