E4 - JUnit单元测试(1) 下载本文

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) - used on doubles or floats, where delta is the difference in precision

assertEquals(message, expected, actual, delta) - used on doubles or floats, where delta is the difference in precision 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 public static TestSuite suite(){ return new TestSuite(TestTriangle.class); }

(5) 通过缺省的TestSuite调用TestRunner生成测试结果。 //调用SWING UI或TEXT UI执行测试

//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的关键代码。

public class NextDay {

public int year; public int month; public int day;

public NextDay() {}

public boolean isLeapYear() { }

public boolean isFebruary() { }

public boolean isYearEnd() { }

public int getMonthMaxDays() {

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

return true; return false; } else { if(month==2) { }

return true; return false; } else {

if(year%4==0&&year0!=0||year@0==0) { }

return true; return false; } else {

} }

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

return 30; } else }

return 31;

if(year%4==0&&year0!=0||year@0==0) { }

return 29; return 28; } else {

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

} else {

public String computeNextDay() { }

String nextday = new String(); if(isMonthEnd()) { }

return nextday;

day = 1; month += 1; day += 1;

} else {

问题4:采用等价类划分方法和边界值分析方法为次日问题设计测试用例。给出测试用例设计的详细过程及结果。要求把设计的测试用例整合到表格之中,并给出测试执行情况。 编号 测试对象 测试数据 测试过程 测试预期执行结果 2017/1/1 测试执行情况(Pass/Fail) Pass 1 computeNextDay computeNextDay 2016/12/31 assertEquals(expected, nextDay.computeNextDay()); 2 2016/2/29 assertEquals(expected, nextDay.computeNextDay()); 2016/3/1 Pass 3 getMonthMaxDays 2016/2/3 assertEquals(expected,nextDay.getMonthMaxDays()); 29 pass 问题5:

参考《JUnit In Action(第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

实验报告

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