基于JUint4的单元测试用例设计与实现学院名称:计算机工程学院专业:软件工程班级:12软件1学号:12144133姓名:王慧二〇一五年五月JIANGSUUNIVERSITYOFTECHNOLOGY软件测试用例设计目录基于JUint4的单元测试用例设计与实现1一、需求分析1二、测试工具介绍2三、软件测试实现3附录1:相关代码91基于JUint4的单元测试用例设计与实现一、需求分析(一)软件测试软件测试(SoftwareTesting),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。软件测试模型有V、W、H、X等模型,其中V模型测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试及发布测试。这其中单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。软件测试的测试目标是:1.发现一些可以通过测试避免的开发风险;2.实施测试来降低所发现的风险;3.确定测试何时可以结束;4.在开发项目的过程中将测试看作是一个标准项目。(二)单元测试单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。经验表明一个尽责的单元测试方法将会在软件开发的某个阶段发现很多的Bug,并且修改它们的成本也很低。它的优点如下:1.它是一种验证行为编写单元测试就是用来验证代码的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。2.它是一种设计行为编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),2迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。3.它是一种编写文档的行为单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。4.它具有回归性自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。二、测试工具介绍(一)JUnit4JUnit是一个Java语言的单元测试框架。它由KentBeck和ErichGamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一个。JUnit有它自己的JUnit扩展生态圈。Junit测试是程序员测试,即所谓白盒测试。JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:1.用于测试期望结果的断言(Assertion)2.用于共享共同测试数据的测试工具3.用于方便的组织和运行测试的测试套件4.图形和文本的测试运行器JUnit常用方式——JUnit4:JUnit4是JUnit框架有史以来的最大改变,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。Annotation,一般是翻译成注解或是元数据。元数据就是描述数据的数据。也就是说,这些个东西在Java里面可以用来和public、static等关键字一样来修饰类名、方法名、变量名。注解的运用可以大量减少测试代码的冗余。JUnit4之Annotation基础篇:@Before-每个测试方法前运行,@After-每个测试方法后运行,@BeforeClass-测试类前运行,@AfterClass-测试类后运行,@Ignore-忽略运行,@Test-测试方法标识。(二)POI3ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能。基本功能有:HSSF-提供读写MicrosoftExcel格式档案的功能;XSSF-提供读写MicrosoftExcelOOXML格式档案的功能;HWPF-提供读写MicrosoftWord格式档案的功能;HSLF-提供读写MicrosoftPowerPoint格式档案的功能;HDGF-提供读写MicrosoftVisio格式档案的功能。(三)Dom4jDom4j是一个易用的、开源的库,用于XML,XPath和XSLT,应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。Dom4j是一个十分优秀的JavaXMLAPI,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。它最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。三、软件测试实现1.初始环境搭建(1)新建项目打开Myeclipse,点击菜单【文件】-【新建】-【项目】,选择【Java项目】:4选择【下一步】,项目名设置为“wanghui12144133”,【下一步】-【完成】。(2)添加库右击项目名称,选择【构建路径】-【添加库】;选择“JUnit”-【下一步】,选择版本为“JUnit4”-【完成】。(3)在src文件夹下建立三个包com.wh.NextDate存放用于测试的JavaBean及它的测试用例,com.wh.utils存放测试工具,com.wh.XmlToExcel存放将xml文件结果读出放入Excel表中的类。(4)导入jar包右击工程名-【配置构建路径】-【添加JAR】2.设计NextDate类及其测试用例(1)设计测试用例:设计好“测试用例.xlsx”并拖入工程目录下。5(2)NextDate类:在com.wh.NextDate包下新建类“ClassNextDate12144133”,该类返回输入的年月日的下一天。主体代码为nextDate方法,运用到switch等语句、判断闰年等方法。(3)POI类:在com.wh.utils包下新建类“POI”,该类可以从“测试用例.xlsx”的文件中读取年、月、日的数据。(4)Test类:右击类“ClassNextDate12144133”-【新建】-【JUnit测试用例】单机【下一步】-可以选择测试的方法,这里我未选择-【完成】。生成测试类,然后利用@RunWith、@Parameters、@Test等注解,POI、assert等方法来测试NextDate类。(5)运行Test类:右击“ClassNextDate12144133Test”-【调试方式】-【1JUnit4测试】。6此时ClassNextDate12144133类未通过该测试用例的Test。呈现结果和预期输出是一样的:第三项及最后两项运行故障。故障追踪如下:将“测试用例.xlsx”稍作修改再运行Test类:此时ClassNextDate12144133类通过了该测试用例的Test。3.向工作簿中写入实际结果7(1)WriteExcel类:用与工作簿相关的各种方法将刚刚的JUnit测试的结果作为文件输出流更新到工作簿“测试用例.xlsx”中。(2)运行WriteExcel类:右击“WriteExcel”-【调试方式】-【1Java应用程序】。4.向工作簿中写入测试状态(1)生成XML文件:选择【测试运行历史记录...】的下拉箭头-【导出】选择好路径并命名为“Result”。Result.xml文件就是JUnit4自动化测试生成的XML文件。8此时,文件夹架构如下:Result.xml文件用浏览器打开如下:(2)应用Dom4j对自动化生成的XML文件进行解析,见附录代码。运行“XmlToExcel”结果如下:9附录1:相关代码1.ClassNextDate12144133类代码:packagecom.wh.NextDate;publicclassClassNextDate12144133{inttomorrowDay=0;privateinttomorrowMonth;privateinttomorrowYear;//输入年月日返回下一天的方法publicStringnextDate(intyear,intmonth,intday){tomorrowDay=day;tomorrowMonth=month;tomorrowYear=year;//swicth方法参数为month判断具体月份作出相关处理switch(month){case1:month_31(month,day);break;case2:_2_month(year,month,day);break;case3:month_31(month,day);break;case4:month_30(month,day);break;case5:month_31(month,day);break;case6:month_30(month,day);break;case7:month_31(month,day);break;case8:month_31(month,day);break;case9:month_30(month,day);break;case10:10month_31(month,day);break;case11:month_30(month,day);break;case12:_12_month(year,month,day);break;default:System.out.println(月份为1到12之间);break;}//当计算处理得到的日期年份在1980到2020之间,返回处理结果,否则提示输入日期错误if(tomorrowYear=1980&tomorrowYear=2020){if(tomorrowDay!=day){Stringdate=tomorrowYear+-+tomorrowMonth+-+tomorrowDay;returndate;}}else{System.out.println(年为1980到2020之间);}return输入日期无效;}//处理有31天的月份,返回下一天的时间publicvoidmonth_31(intmonth,intday){if(day31){tomorrowDay=day+1;}else{tomorrowDay=1;//如果是31日,则月份加一,下一天为1日tomorrowMonth=month+1;}}//处理有30天的月份,返回下一天的时间publicvoidmonth_30(intmonth,intday){if(day30){tomorrowDay=day+1;}elseif(day==30){tomorrowDay=1;tomorrowMonth=month+1;}else{System.out.println(无效);}11}//专用来处理2月份的方法,传入参数年月日publicvoid_2_month(intyear,intmonth,intday){if(day28){//天数少于28天,则不需要判断是否是闰年,天数加一tomorrowDay=day+1;}elseif(day==28){//天数是28日,则需要判断是否是闰年if(testLeap(year)){tomorrowDay=29;//是闰年则天数加1为29}else{//不是闰年则当月只有28天,日期变成3月1日tomorrowDay=1;tomorrowMonth=3;}}elseif(day==29){//如果输入的是2月29日,则判断是否是闰年if(testLeap(year)){//如果是闰年,则变为3月1日tomorrowDay=1;tomorrowMonth=3;}else{//否则输出“无效”System.out.println(无效);}}else{System