转载《使用NetBeans开发JUnit测试》Word格式文档下载.docx
《转载《使用NetBeans开发JUnit测试》Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《转载《使用NetBeans开发JUnit测试》Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
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(){
scalarMultiplication"
intexpResult=0;
intresult=Vectors.scalarMultiplication(a,b);
}
每个生成的测试方法体都按图所示单独提供,它需要被修改后才能成为一个真正的测试用例。
如果你不需要自动生成代码,你可以在创建测试对话框中取消缺省方法主题选项。
当编译器生成测试方法名时,每个方法名都是在之前加上了test,因为JUnit3使用命名规范和反射识别测试。
为了能识别测试方法每个测试方法都需要按照语法test<
NAME>
。
在JUnit4中就不需要使用这种测试方法命名语法,因为你可以使用标签识别测试方法,并且测试类也不需要继承于TestCase。
编写Vectors.java测试方法
在这个练习中你修改生成的测试方法,使得他们能运行测试并修改默认输出消息。
你不需要为了运行测试而修改输出消息,但你也许想修改输出以帮助识别在JUnit测试结果输出窗口中显示的结果。
1.在编辑器中打开VectorsJUnit3Test.java。
2.修改testScalarMultiplication的测试框架,修改println的值并且移去生成的值。
测试方法应该按照下面所示:
publicvoidtestScalarMultiplication(){
*VectorsJUnit3Test:
testScalarMultiplication()"
3.现在添加一些断言用以测试方法。
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。
testEqual()"
测试方法现在看起来如下所示:
publicvoidtestEqual(){
5.修改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选择工具>
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();
*UtilsJUnit3Test:
setUp()method"
protectedvoidtearDown()throwsException{
super.tearDown();
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("
Utils.concatWords("
));
3.添加一个println语句在JUnit测试结果窗中显示相关测试文本。
testmethod1-testHelloWorld()"
使用Timeout进行测试
这个测试演示了如何测试一个需要消耗很多时间才能完成的方法。
如果方法消耗太久时间,测试线程会中断并且测试失败。
你可以在测试中定义时间限制。
测试方法调用了Utils.java中的computeFactorial方法。
你可以假设computeFactorial方法是正确的,但在这儿你希望测试计算是否能在1000毫秒内完成。
computeFactorial线程和一个测试线程同时被启动。
测试线程将在1000毫秒后停止并抛出一个TimeoutException除非computeFactorial线程。
你可以添加一个消息,如果TimeoutException
被抛出就显示这个消息。
1.删除生成的测试方法testComputeFactorial。
2.添加testWithTimeout方法,随机生成一个数字计算阶乘。
publicvoidtestWithTimeout()throwsInterruptedException,TimeoutException{
finalintfactorialOf=1+(int)(30000*Math.random());
computing"
+factorialOf+'
'
ThreadtestThread=newThread(){
publicvoidrun(){
System.out.println(factorialOf+"
="
+UputeFactorial(factorialOf));
};
3.添加你的导入项import
java.util.concurrent.TimeoutException.
4.在方法中添加下面的代码,如果测试耗时过长,中断线程并显示消息。
ThreadtestThread=newThread(){
testThread.start();
Thread.sleep(1000);
testThread.interrupt();
if(testThread.isInterrupted()){
thrownewTimeoutException("
thetesttooktoolongtocomplete"
你可以修改Thread.sleep行的毫秒数值。
5.添加下面的println在JUnit测试结果窗口中显示文本。
testmethod2-testWithTimeout()"
测试一个预期的异常
这个测试演示如何测试一个预期的异常。
如果没有抛出特定的预期的异常,这个方法就失败了。
这种情况下你测试computeFactorial方法在输入变量为负数(-5)时抛出IllegalArgumentException。
1.添加下面的testExpectedException方法以输入值-5调用computeFactorial。
publicvoidtestExpectedException(){
try{
finalintfactorialOf=-5;
IllegalArgumentExceptionwasexpected"
}catch(IllegalArgumentExceptionex){
2.添加下面的println在JUnit测试结果窗口中显示文本。
testmethod3-testExpectedException()"
屏蔽一个测试
这个测试展示了如何临时屏蔽一个测试方法。
在JUnit3中,如果方法名不是以test开头,就不会被识别为测试方法。
所以你可以在测试方法前添加DISABLED以屏蔽它。
1.删除生成的测试方法testNormalizeWord。
2.添加下面的测试方法到测试类中。
publicvoidtestTemporarilyDisabled()throwsException{
t