软件测试中单元测试案例教学实践
来源:用户上传
作者:张苏 杨元峰 陆公正
摘要:单元测试是软件测试过程中必不可少的一个环节。作为《软件测试工具应用》课程的一个教学单元,在单元测试教学设计中,分析了单元测试的教学定位、学情和教学目标。结合黑盒测试用例设计方法和白盒测试用例设计方法,通过设计不同的案例,讨论了JUnit单元测试、被测代码100%覆盖率以及JDBC GUI程序的单元测试的在教学中的实现。
关键词:案例教学;软件测试;单元测试;JUnit
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2020)13-0132-04
高职教育的培养目标是复合型专业技术人才,培养学生不仅具有丰富的专业知识,更要有较强的实践动手能力、技术创新能力和可持续发展的能力。在专业技能培养方面要和企业实际工作要求相结合,通过各种实践教学保障学生获得充分的专业知识和专业技能,能够顺利地适应新工作岗位的要求,具备较高的职业素养和技术水平。
软件测试是软件质量保障的重要手段之一,而单元测试是软件测试过程中必不可少的一个测试阶段。单元测试是对软件中的最小的可测试单元进行检查和验证。单元测试可以由测试工程师来完成也可以由程序开发工程师来完成。从企业对人才的要求来看,单元测试技术是学生将来从事不管是开发还是测试,都必须掌握的基本技术。
执行单元测试有助于帮助开发人员理清业务逻辑思路,提高代码质量,降低bug出现率。在开发端执行单元测试,可以减少错误反馈时间,提高工作效率。当我们使用单元测试工具来编写测试代码时,这些测试代码将协同源代码一起进行保存和维护,当软件版本升级时,这将大大降低新版本软件测试的工作量,使得代码维护更容易并提升代码质量。
针对不同的类型的软件应用,可以采用不同的单元测试工具。在教学中我们选用JUnit工具进行教学,帮助学生掌握单元测试的基本思想和基本做法。
1單元测试教学设计
基于JUnit的单元测试教学是本校《软件测试工具应用》课程的一个教学单元。该课程依据软件测试过程,将教学内容分为:需求分解、测试计划撰写、测试管理、基于JUnit的单元测试、自动化测试、性能测试、测试报告撰写等教学单元。课程总课时80课时,课程教学内容设计如图1所示。
基于JUnit的单元测试属于《软件测试工具应用》课程的一个教学单元。在学习本课程前,学生应掌握面向对象JAVA程序开发的基本思想,会编写JAVA逻辑代码,会编写基于JDBC数据库访问的GUI应用程序,并在同步学习JavaWeb开发课程。通过本单元的学习,希望学生能够掌握单元测试基本概念,理解单元测试的目的、意义以及工作过程。能够针对不同类型的被测程序采用合适的黑盒、白盒用例设计方法,通过缜密的逻辑分析来设计测试用例,以达到全面的代码测试覆盖率。使用JUnit工具将用例写成测试代码,执行测试。通过测试代码预置bug使得学生在单元测试执行过程中体会和掌握缺陷报告和缺陷跟踪管理部分的工作内容。
通过案例教学使得学生能够熟练掌握使用JUnit进行单元测试,培养学生缜密的逻辑分析和用例设计能力以及细心、耐心的工作态度。单元测试学情和教学目标分析如图2所示。
2教学过程设计
基于JUnit的单元测试教学分成4个教学步骤,层层深入,开展教学,具体的教学过程设计方案如表1所示。第一步讲解单元测试的概念和基本原理,讲解JUnit各语法的作用和使用方法,使得同学们能够看懂和理解JUnit代码。
第二步以NextDay程序单元测试为案例,引入算法类程序的单元测试方法。NextDay程序用于返回指定日期的下一个日期。在进行测试用例设计教学时,使用该案例进行基于等价类分析法、边界值分析法、错误推测法的黑盒测试用例设计,以及基于逻辑覆盖和独立路径分析的白盒测试用例设计,在教授单元测试时,指导学生使用JUnit将这些测试用例写成单元测试代码。在完成本部分内容授课后,可以给学生提供一些更复杂的应用案例,引导学生理解和学会算法类程序的单元测试,实现分层次教学引导。
第三步以房产信息管理模块单元测试为案例,讲解白盒测试用例设计方法和实现,配合EclEmma插件,编写测试代码,实现被测代码100%的测试覆盖。使得学生在整个测试过程中提高源代码白盒分析水平,提高自己的测试代码编写能力。
第四步以顾客信息管理模块单元测试为案例,讲解分层数据库应用程序的单元测试方法。该案例是一个java GUI应用程序,采用Mysql数据库,程序实现了顾客信息的添加、修改、删除和查询功能。窗体应用程序的单元测试主要是针对程序dao层的添加、修改、删除和查询接口(interface)编写JUnit单元测试代码并执行测试。
通过以上教学步骤层层递进,教会同学们从一般算法到窗体应用程序的JUnit单元测试代码编写和执行。
3NextDay教学案例设计
NextDay程序是测试学习经典程序,该程序实现的功能是用户输入一个有效日期,由程序返回该日期的下一天的日期。例如2020/2/28的下一天是2020/2/29。被测程序由6个类组成,分别是:Nextday、CalendarUnit、Day、Month、Date、Year。根据黑盒测试用例设计方法设计测试用例举例,首先进行等价类分析,划分出有效等价类和无效等价类,然后根据边界值分析法确定每个等价类边界值的内点、上点和离点,将这些分析写成测试用例,最后再加上闰年、闰月等特殊数据完成用例设计。
测试用例代码举例如图3所示,testNextDay函数中实现了日边界nextday合法数据的测试代码,测试了大月、小月和闰月的日期边界nextDay函数返回值是否正确。testDateValid函数中测试了程序是否对非法的日期进行处理。2个测试函数的执行结果如图4所示。在授课过程中要求同学们把年、月、日的边界,有效日期和无效日期均编写相应的测试用例代码并执行。通过该部分的教学引导同学们掌握JUnit单元测试的一般做法,在课外习题中补充难度更大的算法案例,来实现分层教学,巩固学习成果。 4房产信息管理模块案例设计
房产信息管理模块程序使用HashMap来保存房屋数据,实现房产信息的添加、修改、删除和查询。教学中要求根据白盒测试用例设计方法设计测试用例,编写和执行JUnit代码并统计代码覆盖率。白盒测试用例设计方法主要有逻辑覆盖法和独立路径分析法。源程序代码测试覆盖率统计使用EclEmma插件生成JUnit覆盖率测试报告来实现。房产信息管理模块由3个类和1个接口构成,其类图结构如图5所示。
在对该模块进行测试的时候,设计测试用例配合EclEmma插件实现对测试代码的全覆盖。如图6所示为测试用例举例,该测试用例实现了对新增房产信息、修改房产信息、判断是否已经存在、根据房产编号查询房产信息、显示所有房产信息、根据房产价格查询房产信息、删除房产信息等功能的测试。
这是一个测试用例的示范,根据白盒测试方法进一步补充设计用例以达到100%的被测代码覆盖率。如图7所示为源代码测试覆盖率截图。在执行测试的时候会碰到一些问题,例如有的代码难以被覆盖到,最后发现该代码本身逻辑上就有问题,属于永远都不会被执行到的代碼,那么应该把这些代码去掉或者重写。在测试中还有一些异常处理代码可能较难被测试覆盖,这时可能做不到100%的代码覆盖率,需要根据具体情况进行分析。在执行测试的时候,使用EclEmma插件会将没有被覆盖到的代码标红色显示,这非常有助于改善和提高测试用例以获得更好的测试效果。
5顾客信息管理模块教学案例设计
顾客信息管理模块是一个Java GUI应用程序,数据存放在Mysql数据库中,实现客户信息的添加、修改、删除和查询。被测系统程序结构如图8所示,程序运行界面如图9所示。该程序由bean、dao、db、gui4个包构成:bean包中存放实体类;dao包中存放客户类添加、修改、删除的接口interface和接口实现类;db包中存放JDBC数据库连接对象;gui包中存放各窗体JFrame代码。
在教学中,顾客信息管理模块的JUnit测试主要实现对于顾客信息添加、修改、删除的Dao层进行的测试,测试思路和执行步骤设计如表2所示。首先在JUnit测试代码中生成Custom-erDAOImp类的对象,调用各个interface实现方法,实现相应功能,然后测试代码通过jdbc连接,直接去数据库表查询相关数据进行比对,来验证interface的功能有没有正确实现。表2列举了各个interface的测试设计。
例如在测试deleteCustomer时,先删除编号为1的客户信息,再根据编号1查询客户,根据是否能查到来判断根据编号删除客户功能是否正确。在测试getAllCustomer时,先根据CustomerDAO对象获得所有客户List的size,再通过JDBC去数据库中查询所有客户数目的总数,比较2个数目是否一致来判断该功能是否正确。当然客户数目一致不代表所有数据是一致的,也可以修改代码为按序查出所有客户对象后,逐个比较数据内容。
6结语
在教学过程中,根据人才培养目标,分析学生特点,在单元测试教学模块中以案例教学方法改进教学效果。在学生已具备基本的测试知识后,以3个教学案例覆盖各知识技能点,使用NextDay教学案例教学教会学生黑盒用例设计和实现方法,学习算法类程序的单元测试方法;使用房产信息管理模块案例教学教会学生白盒用例设计方法和分析方法,实现被测代码100%覆盖率;使用顾客信息管理模块教学案例教学教会学生分层数据库应用程序的单元测试方法。三个案例层层深入,涉及知识点和技能点全面,在实际教学中取得了良好的教学效果。
转载注明来源:https://www.xzbu.com/8/view-15267132.htm