E4JUnit单元测试1.docx
《E4JUnit单元测试1.docx》由会员分享,可在线阅读,更多相关《E4JUnit单元测试1.docx(12页珍藏版)》请在冰豆网上搜索。
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
实验报告
编制纸质实验报告,详细描述实验过程和实验体会;