您现在的位置:首页 > >

测试驱动开发在Java语言课程实践中的应用

发布时间:

第8卷增刊
2008年7月

广东工业大学学报{社会科学版)
Joumal of G明ngdong UIIive吲ty of.IkhnoIo影(socjal Sdenc伪翻iti彻)

V01.8 Suppl Jul.2008

测试驱动开发在Java语言课程实践中的应用
苏 庆
(广东工业大学计算机学院,广东广州,510006) 摘要:Java语言是计算机专业学生需要掌握的一门面向对象程序设计语言。文章针对Java语言的教学现状,提出 将Java语言编程与测试驱动开发编程思想结合的教学方式。该教学方式取得了良好效果,改善了学生编 写的程序质量,加快了软件开发的速度。 关键词:测试驱动开发Java语言课程教学改革 中图分类号:G642.41 文献标识码:A 实际问题需求,但往往仅限于在思维上的没有做出清晰归纳 的印象。尤其是一些“心急”的程序员,觉得写代码就是解决 问题的全部工作。实际上这样忽略测试用例而编写出来的 程序很容易未能覆盖实际问题的各方面需求。 TDD则强调编写测试用例的重要性。应该首先编写出 可输入的测试用例,然后才针对此测试用例,编写能够通过 此测试用例的代码。 例如存在实际问题:求两个数的最大公约数。则首先可 编写出一个最普通的测试用例:
表l 测试用 例序号


实践应用

一、测试驱动开发在Java语言课程中的作用
Java语言课程是计算机专业本科学生在大学三年级学 习的第二门高级语言课程。在低年级学习了c语言和数据 结构之后,同学们掌握了基本的编程思想和技巧,已经能够 进行具有一定复杂度的软件开发。但在Java课程的教学实 践中发现,许多同学更习惯于编写“基本正确的程序”,而不 是致力于编写“尽量正确的程序”。究其原因是,同学们虽然 能具备了软件工程的系统知识,甚至能够使用uML等工具 来设计他们的Java程序,…却往往忽略了软件测试在程序 开发过程中的重要性,并且不能有效地运用测试技术。嵋1 测试驱动开发(Test—Driven Development,简称TDD)的核 心思想是以测试集为中心,¨1因而能够很好地帮助同学们克 服忽略测试的问题,从而编写具有更好的鲁棒性的程序。 TDD与传统的软件开发方法有所不同,其一般过程为: 首先编写测试;然后编写能通过测试的代码;将测试集逐步 增量,直至复合实际问题的需求。 另外,在采用TDD的过程中,始终遵循“除非有与之相 关的测试,否则不应编写任何产品代码”的原则。p


“求两个数的最大公约数”问题的测试用例 通过 标志
否 a<b,a>O,b>O

方式用结果
键盘
12

输入f测试数据f期望
20


注释

2.编写仅能通过测试用例的代码 在编写测试用例阶段,首先需要遵循的原则是:让编译 器告知程序员,合适该增加新的类或者新的方法,而不是主 动对程序作出规划。此原则能保证程序员仅编写出能通过 编译的代码。 例如对“求两个数的最大公约数”问题,应综合考虑: 输入是一个数对,输入方式有键盘和以.IxT文本文件方 式两种,可以使用专门public
void

Java语言本身也是一种“小而单纯”的程序设计语言,具 备了良好的体系结构中立和可移植性,H o便于进行增量式的 程序开发,所以能与TDD很好地结合起来。

main(string[]args){

二、测试驱动开发(TDD)与Java课程结合的实 践应用
在Java课程教学实践中发现,许多同学在程序开发过程 中对测试不够重视,主要表现为:第一,没有针对实际问题设 计出足够全面的测试用例;第二,主观认为某些代码正确的, 实际上却无法为这些代码设计相应的测试用例。将TDD与 Java课程实践有机结合起来,能够有效地克服同学们对测试 认识的不足,从而编写出更高质量的Java程序。经过实践, 可遵循以下步骤: 1.首先编写测试用例 测试用例是对实际问题需求的表现。用户向程序输入 一个测试用例,则期望程序给出某些输出。输入和输出往往 表现为函数关系。在传统的编程方式中,程序员也会考虑到

PaireNumI)er

pairNum=getlnputs();//获得一个Paire—

Number对象 system.out.println(Gcd.gcd(pairNum)); } 运行这个Java程序,编译器会提示找不到PaireNumber 类、getInPuts()方法和Gcd变量(实际上Gcd是一个类),gcd ()是它的一个静态方法,这里Java编译器未能作出正确识 别)。然后程序员只需要根据编译器的提示,分别实现Pai陀一 Number类、getInputs()方法和Gcd类及其gcd(int,int)方 法,而不需要编写额外的代码。 建立起基本的程序框架之后,则针对当前测试用例需要 进行编制代码。但需要注意的是,仅编写能够通过当前测试 用例的代码。

收稿日期:2008—04一13 作者简介:苏庆(1979一),男,汉族,助教,硕士;主要研究方向:可视计算,Java虚拟机。
216

万   方数据

课程与教材研究:

测试驱动开发在Java语言课程实践中的应用

例如以通过测试用例(12,20)为目的,预期测试结果为 4,采用欧几里得算法实现的gcd(int,int)方法的源代码 如下:
static int

的精确度要求、工程的时间要求等方面作出平衡。 4.维护程序员测试集。进行增量式开发 对于测试集的编写,则应当遵循“不遗漏,不重复”的原 则。通过前三个步骤,不断扩充测试用例至测试集,并立刻 针对扩充的测试用例编写能通过的代码,直至测试集包括了 实际问题的所有方面为止,则认为程序开发的代码编写阶段 已经完成。 例如对于“求两个数的最大公约数”问题,可至少扩充测 试集如下:
表2“求两个数的最大公约数”问题的测试集 测试用 例序号
l 2

gcd(int m,int n){

if(m<n) swap(m,n);//将m和n的值交换 while(n! =0){
int r=m%n: m=n:
n=r:


retum m:

} 在实际的Java语言课程教学实践中发现,有许多同学在 针对某测试用例编写通过代码时,喜欢即兴发挥,写出一些 并非通过本测试用例所需要的代码。这样可能会导致几个 方面的问题:第一,这些代码无合适的测试用例验证,可能永 远都不会被执行;第二,这些代码存在错误,但由于当前测试 用例不是用于检验这些代码的,它们可能会遗漏到后期的软 件开发中,甚至被集成到其它软件,造成后期难以检测出来 的隐患;第三,这些代码可以解决问题的某一方面,但放置位 置不合适,造成代码意义模糊。 例如在上面的代码中,有些同学在完成了当前测试用例 后,马上想到对于以TxT文本文件方式输入的同类型的数据 也可以使用同样的程序代码处理,于是在方法中加入有关读 人TxT文本文件的代码,这样的做法其实不合适,因为有关 11)(T文本文件方式输入的处理应该在求最大公约数之前的 getInputs()方法中实现。 3.代码重构 代码重构对于测试驱动开发来说相当重要。[5 3当程序中 代码的代码越来越多,就有可能需要进行重构,以优化程序 性能,并使程序更加“优美”。例如代码出现重复、某些代码 要表达的意图过于复杂时,程序员都要考虑进行重构的必要 性。 例如对于上一小节的gcd(int,int)方法,经过实际测试 发现,无需对m和n的大小关系作比较。因为即使m>n, 在while循环的第一次执行中也能够通过r=m%n;m=n; n=r;程序段将m与n之间的关系作转换,所以删去这段代 码后,得到改进后的gcd(int,int)方法:
static int

方式嗣结果
输入l测试数据J期望
键盘 键盘 键盘 键盘
12 20 O 20 20 12 12 O 4 4


通过 标志 是 是 是 是

注释
a<b,a>O,b>O a>b,a>O,b>O a<b,a=O,b>O a>b,a>O,b=0






以TxT文本作为输入方式的测试集设计从略。 针对测试用例3和测试用例4,需要对至少有一个数为 0的情况作特别处理。当输入对的第一个数为0时,则规定 将第二个数作为输出;当输入对的第二个数为0时,则规定 将第一个数作为输出。 经完善后的gcd(int,int)方法如下:
static int

gcd(int
renlm

m,int

n){

if(0==m)
n:

else

if(O==n) retum m:

while(n!

=O){

int r=m%n: m=n:
n=r:


retum m:



三、结语
经过实践,发现将TDD与Java课程教学结合起来是可 行的。 同学们在使用TDD进行Java程序开发后,能够明显提 高Java程序的质量。主要表现在: (1)提高了对软件测试重要性的认识。通过锻炼,同学 们养成了“未写程序代码,先建立测试集”成为进行软件开发 的首要原则。 (2)提高了程序的鲁棒性。同学们通过遵守“不编写没 有对于特地测试用力的代码”的原则,使得程序中不存在未 经验证的代码,使得程序出现死循环、崩溃等意外现象减少。 (3)增强了软件编码的规范性,形成良好的代码风格。 部分有能力的同学通过不断对程序代码进行合理的重构,从 而逐步养成了较为规范和良好的代码风格。 (下转第222页)
217

gcd(int

m,im

n){

while(n!=O){
int r=m%n: m=n:
n=r:


r℃tum m:

} 代码重构与代码编写是交错进行的。代码编写是进行 代码重构的基础,而适时地进行代码重构将能极大地加快代 码编写的进度。 另一方面,代码重构无可避免地增加了代码编写阶段的 工作量,所以在进行重构的时机和范围都需要根据实际问题

万   方数据

第8卷增刊
2008年7月

广东工业大学学报(社会科学版)
JoumaI of G岫ngd明g University of T盹量InoIo科(SociaI Sdeno蛸Editi伽)

V01.8 Suppl. Jul.2008

AppHcation and Discussion of Visual C++on Teaching the Course of“Artificial Intelljgence"
HE Yuan.1iel,WANG“n92

(1.Faculty
2.School of

of

Computer,Guallgdong Unive瑙ily

of

Technology,Gu粕铲hou,Gu阻gdong 510006,P.R.China;

Forei印L舢guage,Guangdong

Unive碍ity of

Technolog)r,G∞ngzhou,cuangdong 510520,P.R.china)
of‘‘Visual C++Visualization Progmmming”and“Ar- Puzzle Displaying Program"and the“Game

Abstract:This p印er combines the characteristic of the tificial Intelligence’’to develop

course

Tree—Reversi Displaying
cussed in mis paper.

Program".

the“Info珊ed nese

Search

Method——8

programs

are印plied

in the teaching of course“Anificial Intelli—

gence"and obtain optimistic印proach.

Finally,the future of the computer

aided(multimedia)instmction

is dis—

Key words:visualization programming;anificial intelligence;course;computer aided instruction

(文字编辑、责任校对:邹

红)

dH●‘p—q‘I一_lh.,_●I-—o¨。”¨¨—¨¨..一。”帅∥-‘¨¨.“帅..p_‘㈨.一咖?¨一嘲…一_”¨-一H‰—嘲¨.,…‰—H帅—“II—州¨.一~I_.一ⅥI-—”¨¨一呻II"—_l●-?—_¨Ip一“lI“—一o¨.一_¨—”●IH—_¨¨—_¨¨—¨¨?,呻¨一”¨¨—n¨¨。“¨¨?—_‰_州‰一H‘Ip,咖¨,叫¨一”¨_。叫‘l_,一忡一¨¨_

(上接第217页) (4)提高了同学们在软件测试的技巧。同学们通过在 编写测试集的过程中,拓广了考虑问题的视野,力求编写出 来的测试集遵循“不遗漏,不重复”的原则,使得软件测试的 技巧也得到了提高。 另外,同学们在熟悉TDD的初始阶段,程序开发的速度 落后于采用传统软件开发方法时的速度。但经过足够的训 练之后,由于逐步增量的测试集保证了程序的鲁棒性,反而 使得同学们的软件开发速度得到了提高。 参考文献
[1]Robenc.M矾in.uML:Java程序员指南[M].黄晓春,译.北京: 清华大学出版社,2004.1—8 [2]张克东,庄燕滨.软件工程与软件测试自动化教程[M].北京: 电子工业出版社,2002.23—25 [3]DavidABtel8.测试驱动开发使用指南[M].崔 国电力出版社,2004.3—8 f4]Cay S. Horstm明n.Gray ComeU. Com 凯,译.北京:中
I—Funda-

Jav舢,Volume

mentaIs.7出Edition[M].PearBon Educatjon,Inc,20()6.2—5 [5]Martin Fowler.重构——改善既有代码的设计[M].侯 熊节,译.北京:中国电力出版社,2003.53—57 捷,

The Application of Test Driven DeVelopment in the JaVa Course Practice
SU

Qing

(Faculty Abstract:Java is JAVA.As for the

0f

Computer,Guangdong Univers竹of Technology,Gu肌铲hou,Gu锄gdong 5l0006,P.R.China)

aIl

object耐ented pro秘吼ming

language.

nose

who

major


in computer science

ought

to

master

current

situation of JAVA teaching,the

p印er

presents

teaching way which combines progmm-

ming with Test Driven development.Consequently,tlle way impmVes the quality of students’progmms and acceler-
ates

sof附are developmem.

Key words:test ddven devel叩ment;Jave language;teaching

refo珊;appication

in practice

(文字编辑、责任校对:邹红)

万   方数据

测试驱动开发在Java语言课程实践中的应用
作者: 作者单位: 刊名: 英文刊名: 年,卷(期): 苏庆, SU Qing 广东工业大学计算机学院,广东,广州,510006 广东工业大学学报(社会科学版) JOURNAL OF GUANGDONG UNIVERSITY OF TECHNOLOGY(SOCIAL SCIENCES) 2008,8(z1)

参考文献(5条) 1.Martin Fowler;侯捷;熊节 重构--改善既有代码的设计 2003 2.Cay S.Horstmann;Gray Comell Core JavaTM2,Volume I-Fundamentals 2006 3.DavidAstels;崔凯 测试驱动开发使用指南 2004 4.张克东;庄燕滨 软件工程与软件测试自动化教程 2002 5.RobertC.Martin;黄晓春 UML:Java程序员指南 2004

本文链接:http://d.g.wanfangdata.com.cn/Periodical_gdgydxxb-shkxb2008z1098.aspx



热文推荐
猜你喜欢
友情链接: 幼儿教育 小学教案 初中教案 高中教案 职业教育 成人教育