E4JUnit单元测试1.docx

上传人:b****5 文档编号:27888295 上传时间:2023-07-06 格式:DOCX 页数:12 大小:179.46KB
下载 相关 举报
E4JUnit单元测试1.docx_第1页
第1页 / 共12页
E4JUnit单元测试1.docx_第2页
第2页 / 共12页
E4JUnit单元测试1.docx_第3页
第3页 / 共12页
E4JUnit单元测试1.docx_第4页
第4页 / 共12页
E4JUnit单元测试1.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

E4JUnit单元测试1.docx

《E4JUnit单元测试1.docx》由会员分享,可在线阅读,更多相关《E4JUnit单元测试1.docx(12页珍藏版)》请在冰豆网上搜索。

E4JUnit单元测试1.docx

E4JUnit单元测试1

实验4:

JUnit单元测试

董瑞志

常熟理工学院软件工程系

实验目的

理解手工编写单元测试的基本方法;

编写简单的基于JUnit的单元测试用例;

课时安排

2课时

实验内容

问题1:

软件测试的定义及特点。

软件测试定义:

软件测试时一种实际输出与预期输出间的审核或者比较的过程

软件测试的特点:

软件测试的开销大

 

问题2:

描述软件测试相关的信息流

信息流输入:

软件配置、测试配置

信息流输出:

调试、测试结果分析

 

JUnit初步

单元测试可以描述为“确保方法接收预期范围内的输入,并且对每个测试输入返回预期的结果。

”单元测试是独立的一个工作单元(一个工作单元是一项任务,它不依赖于其他任何任务的完成)。

在Java应用程序中,“独立的一个动作单元”常常指的是一个方法。

1.编写Calculator类及其手工测试类testCalculatorManual

图1:

手工测试Calculator

单元测试的一条准则是“若程序的某项功能没有经过测试,那么该功能基本等于不存在”。

这里的add方法是Calculator的核心功能之一,这里我们先手工编写测试类testCalculatorManual。

2.用JUnit进行单元测试

(1)JUnit有很多功能可以简化测试用例的编写和运行,我们编写TestCase—TestCalculatorWithJUnit如下。

图2:

使用JUnit设计测试脚本

在Calculator类中添加subtract(),multiply(),divide()后,如何编写手工测试用例和基于JUnit框架的测试用例应该如何编写?

(2)使用默认的TestSuite,显式调用JunitTestRunner

图3:

显式调用JunittestRunner

/*

*调用由testRunner自动创建的TestSuite对象

*默认的TestSuite对象将扫描测试类,找出所有以test开头的方法,

*为每一个testXXX方法都创建一个TestCase实例。

*要调用的方法的名称会传给TestCase的构造函数,

*这样每个实例就拥有了一个独一无二的标示。

*/

publicstaticTestSuitesuite(){

returnnewTestSuite(TestCalculatorWithJunit.class);

}

publicstaticvoidmain(String[]args){

//junit.textui.TestRunner.run(TestCalculatorWithJunit.class);

junit.swingui.TestRunner.run(TestCalculatorWithJunit.class);

}

(3)创建TestAll

缺省的TestSuite设计目的在于让测试人员可以轻松应对简单的测试情形。

但是当要组合多个Suite,把它作为主Suite的一部分,特别是这些suite来自不同的包;或者要运行多个Suite、在一个Suite中选一些测试来执行……等情况下,这就需要创建自己的suite对象。

JunitFramework中,Test接口如下:

publicinterfaceTest{

/**

*Countsthenumberoftestcasesthatwillberunbythistest.

*/

publicabstractintcountTestCases();

/**

*RunsatestandcollectsitsresultinatestResultinstance.

*/

publicabstractvoidrun(TestResultresult);

}

而TestSuite的addTest():

publicvoidaddTest(Testtest){

fTests.addElement(test);

}

即可以为TestSuite添加TestSuite也可以添加TestCase,这就为创建特殊的suite或者组合出TestAll创造了方便。

通常情况下,TestAll仅仅包括一个静态的suite(),该方法会注册应用程序需要定期执行的所有Test对象(包括TestCase和TestSuite)。

TestAll的suite()方法细节如下:

publicstaticTestsuite(){

TestSuitesuite=newTestSuite("Alltestswillbeexecuted");

suite.addTestSuite(TestCalculatorWithJunit.class);    

returnsuite;

}

JUnit单元测试的步骤

1.Junit三重唱

当你需要编写更多的TestCase的时候,你可以创建更多的TestCase对象。

当你需要一次执行多个TestCase对象的时候,您可以创建一个TestSuite对象或使用缺省的TestSuite对象进行封装。

为了执行TestSuite,需要使用TestRunner。

通过TestRunner的执行生成TestResult对象。

(如图5所示)

图5:

JUnit成员三重唱,共同产生测试结果

(1)TestCase测试用例

用户定义的TestCase必须扩展junit.framework.TestCase类,它以testXXX方法的形式包含了一个或多个测试。

一个测试用例把具有公共行为的测试归入一组。

(2)testSuite测试套装

一个测试套装可以把多个测试用例或测试套装封装为一组

(3)testRunner测试运行器

测试运行器用来运行测试套装,Junit提供良种典型的测试运行器:

junit.swingui.TestRunner和junit.textui.TestRunner

2.JUnit核心类

JUnit核心类及其简介如下表所示:

表1:

JUnit核心类

3.JUnit单元测试的步骤

(1)重载setUp(),封装测试环境初始化及测试数据准备;

(2)设计测试方法,以testXXX命名。

(3)在测试方法中使用断言方法如assertEquals(),assertTrue()等。

JUnit中断言方法如表2所示。

(4)设计测试套件,或使用缺省的测试套件,调用TestRunner执行测试脚本,生成测试结果;

(5)重载tearDown()析构测试环境,执行收尾动作

表2:

断言方法

assertEquals(expected,actual)

assertEquals(message,expected,actual)

assertEquals(expected,actual,delta)-usedondoublesorfloats,wheredeltaisthedifferenceinprecision

assertEquals(message,expected,actual,delta)-usedondoublesorfloats,wheredeltaisthedifferenceinprecision

assertFalse(condition)

assertFalse(message,condition)

assertNotNull(object)

assertNotNull(message,object)

assertNotSame(expected,actual)

assertNotSame(message,expected,actual)

assertNull(object)

assertNull(message,object)

assertSame(expected,actual)

assertSame(message,expected,actual)

assertTrue(condition)

assertTrue(message,condition)

案例分析

1.三角形问题

设计类Triangle及其测试类testTriangle,其类图如图6所示。

Triangle中包含三个属性borderA,borderB,borderC,三遍取值都在(0,20]集合中的自然数;一个构造函数,isTriangle()判断三角形三边是否构成三角形,isType()判断在输入的三边形成三角形的情况下所形成的三角形的具体类型:

等边三角形、等腰三角形还是不等边三角形。

图6:

Triangle及其测试类

testTriangle类定义如下:

(1)重载setUp()方法,进行测试准备,封装测试的预期结果。

(2)定义测试方法testIsTriangle()和testIsType()

(3)在测试方法中使用断言

(4)定义suite()方法,使用缺省的TestSuite

publicstaticTestSuitesuite(){

returnnewTestSuite(TestTriangle.class);

}

(5)通过缺省的TestSuite调用TestRunner生成测试结果。

//调用SWINGUI或TEXTUI执行测试

//junit.textui.TestRunner.run(TestTriangle.class);

junit.swingui.testRunner.run(TestTriangle.class);

2.[作业]设计类NextDay,该类包含year,month,day三个属性,该类可以根据用户输入的year,month,day的值输出用户输入日期对应的下一天。

设计NextDay的测试类TestNextDay对其中核心方法,综合使用等价类划分和健壮性测试方法设计测试用例执行单元测试。

建议NextDay结构如图7所示。

图7:

NextDay

问题3:

给出NextDay的关键代码。

publicclassNextDay{

publicintyear;

publicintmonth;

publicintday;

 

publicNextDay(){}

 

publicbooleanisLeapYear(){

if(year%4==0&&year%100!

=0||year%400==0){

returntrue;

}else{

returnfalse;

}

}

 

publicbooleanisFebruary(){

if(month==2){

returntrue;

}else{

returnfalse;

}

}

 

publicbooleanisYearEnd(){

if(month==12&&day==31){

returntrue;

}else{

returnfalse;

}

}

 

publicintgetMonthMaxDays(){

 

if(month==4||month==6||month==9||month==11){

return30;

}elseif(month==1||month==3||month==5||month==7||month==8||month==10||month==12){

return31;

}else{

if(year%4==0&&year%100!

=0||year%400==0){

return29;

}else{

return28;

}

}

}

 

publicStringcomputeNextDay(){

Stringnextday=newString();

if(isMonthEnd()){

day=1;

month+=1;

}else{

day+=1;

}

returnnextday;

}

 

}                                                                          

问题4:

采用等价类划分方法和边界值分析方法为次日问题设计测试用例。

给出测试用例设计的详细过程及结果。

要求把设计的测试用例整合到表格之中,并给出测试执行情况。

编号

测试对象

测试数据

测试过程

测试预期执行结果

测试执行情况(Pass/Fail)

1

computeNextDay

2016/12/31

assertEquals(expected,nextDputeNextDay());

2017/1/1

Pass

2

computeNextDay

2016/2/29

assertEquals(expected,nextDputeNextDay());

2016/3/1

Pass

3

getMonthMaxDays

2016/2/3

assertEquals(expected,nextDay.getMonthMaxDays());

29

pass

 

 

 

 

 

 

问题5:

参考《JUnitInAction(第2版)》,谈谈你对JUnit测试框架的理解。

当你需要编写更多的testCase的时候,你可以创建更多的TestCase对象。

当你需要一次执行多个TestCase对象的时候,您可以创建一个TestSuite对象或使用缺省的TestSuite对象进行封装。

为了执行TestSuite,需要使用TestRunner。

通过TestRunner的执行生成TestResult对象。

(1)testCase测试用例

用户定义的TestCase必须扩展junit.framework.TestCase类,它以testXXX方法的形式包含了一个或多个测试。

一个测试用例把具有公共行为的测试归入一组。

(2)TestSuite测试套装

一个测试套装可以把多个测试用例或测试套装封装为一组

(3)TestRunner测试运行器

测试运行器用来运行测试套装,Junit提供良种典型的测试运行器:

junit.swingui.TestRunner和junit.textui.TestRunner

实验报告

编制纸质实验报告,详细描述实验过程和实验体会;

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1