收藏 分销(赏)

基于JUnit5软件单元测试实践教学.pdf

上传人:自信****多点 文档编号:581549 上传时间:2024-01-02 格式:PDF 页数:6 大小:1.60MB
下载 相关 举报
基于JUnit5软件单元测试实践教学.pdf_第1页
第1页 / 共6页
基于JUnit5软件单元测试实践教学.pdf_第2页
第2页 / 共6页
基于JUnit5软件单元测试实践教学.pdf_第3页
第3页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、189计 算 机 教 育Computer Education第 8 期2023 年 8 月 10 日中图分类号:G642基于 JUnit5 软件单元测试实践教学孙 庚,贺 平(广州番禺职业技术学院 信息工程学院,广东 广州 511483)摘 要:分析软件单元测试的内涵和作用,从单元测试实践教学的设计理念与实现过程出发,围绕教学理念、设计思想、技术运用、实现过程及教学实践活动阐述基于 JUnit5 的单元测试教学实践过程,最后说明教学效果。关键词:单元测试;实践教学;JUnit5;教学设计;工程实现文章编号:1672-5913(2023)08-0189-060引 言软件测试是软件质量保障最重要的

2、措施与手段,而单元测试是软件生命周期中测试级别最低、以针对软件实现的代码为对象的测试活动。依据 Mike Cohn 提出的软件测试金字塔模型,其核心观点是“底层单元测试应多于依赖 UI(用户界面)的高层端到端测试”1。软件测试的理论与实践反复证明了单元测试发现软件缺陷最早、成本最低、效率最高。如果更高于单元测试级别的测试失败了,不仅揭示了代码存在着缺陷,并表明单元测试的质量缺失。无论是以“代码先行,测试其后”的传统开发模式,还是以“用例先行,编码依据”的测试驱动的敏捷方法,单元测试都是软件开发中的一项核心技术与实践。软件业界明确要求软件工程师应具备能够完成单元测试工作任务的相关知识与娴熟技能。

3、软件测试课程在高校软件工程、软件技术类专业中已普遍开设,单元测试作为软件测试的重要内容,如何有效提升软件单元测试实践教学的质量与效能,已成为教学活动普遍重视及需要有效解决的实际问题。1单元测试的内涵单元测试是针对软件的最小可测试单元而开展的一系列测试活动,从而发现单元中的缺陷或错误。最小可测单元通常指函数、类或由此而构成的程序模块。代码先行的单元测试依据软件详细设计文档及程序代码进行。单元测试中针对单元的软件功能与可观测的软件行为进行检查及验证,通常运用黑盒测试策略,而针对单元的软件内部(逻辑与数据流)进行程序结构的分析,通常运用白盒测试技术。以实现A-TRIP(Andrew Hunt&Dav

4、id Thomas)2为目标,可建立优质单元测试的标准。(1)Automatic 测试应能自动运行,准备数据执行测试验证结果全过程无须人工干预。(2)Thorough 优质的测试应为测试了所有可能出现问题的各种情况。(3)Repeatable 能反复运行且每次运行结果都应一样。(4)Independent 每个测试都有且只有一个关注点,多个测试之间无顺序依赖。(5)Professional 测试代码也是代码,须按产品代码标准编写与维护。2JUnit单元测试框架单元测试首要的任务就是选择适用的单元测试框架。测试框架的选择与被测对象的实现语言密切相关。JUnit 是由 Kent Beck 和 Er

5、ich Gamma基金项目:广东省教育厅产教融合创新平台项目“面向国产软件生态测试的产教融合创新平台”(2020CJPT001)。第一作者简介:孙庚,女,副教授,研究方向为软件技术、软件测试等,。2023190计 算 机 教 育Computer Education所创建的单元测试框架,事实上已成为 Java 程序单元测试的业界标准,目前最新版本为 JUnit5,具有如下特点。(1)Lambda 支 持 高 质 量 开 发 测 试 代 码。JUnit5 支持 Lambda 表达式3,代码简洁无冗余,开发出的测试代码更易维护。(2)优化参数化测试脚本开发。参数化单元测试是指通过多组不同的参数数据去

6、驱动运行同一个测试方法,以达到覆盖多个测试用例的目的。JUnit5 的 JUnitParams 模块库支持多种注解形式描述的参数源,实现参数化测试只需定义一个带参数、用 ParameterizedTest 和数据源注解标记的测试方法即可,从而可便捷参数化测试脚本开发。(3)多扩展性支持减少测试类数目。JUnit5实现了可使用多个扩展(多个运行器),或可接入其他测试引擎4。这使得参数化与非参数化测试可以混合于同一个测试类中,极大减少了测试类的数目,使测试脚本更易维护、管理,提高了测试效率。3教学设计与实现3.1单元测试实践教学设计理念单元测试实践教学是“软件项目包的测试(单元与集成测试)”课程的

7、主要教学内容及活动。实施这一教学活动的前提是学习者已具备阅读、理解和编写 Java 应用程序的能力,熟悉常用的黑盒与白盒测试方法。通过单元测试的实践教学,期望学习者能够更深刻理解并掌握单元测试的概念、流程、方法和工具运用,能够灵活运用所学知识进行测试分析、测试设计、测试实施、测试执行等单元测试的过程活动,提升实际工作的技能。单元测试实践教学的目标如图 1 所示。实践教学设计将依据实际测试活动中的工作过程、项目引领、案例驱动及工程启蒙的理念 进行。(1)基于过程。依据单元测试工作流程(如图 2 所示),设计为 6 个教学场景5。图 1 单元测试实践教学的目标分析图 2 单元测试工作流程教育与教学

8、研究第 8 期191(2)项目引领。单元测试实践教学的项目设计,是以项目作为引领。一些项目设计源于软件工程中的实际工作内容,如 Json 解析器、宠物商城等,另一些项目设计则与全国大学生软件测试大赛-开发者测试赛项内容相对接,直接利用竞赛中的真题或样题作为实践教学项目。由此,设置了较高的教学目标,实现赛教资源融通。开发者测试赛项分为预选赛、省赛、全国总决赛。利用预选赛不限人数的规则,可要求选课学生必须参加,并将赛事结果作为考核成绩,“赛教评”融为一体。项目引领的设计策略体现了“实战性”和教学的高标准,有利于培养和选拔优秀 人才。(3)案例驱动。案例驱动教学设计,遵循知识点覆盖、内容包含和难度递

9、进的原则。设计若干典型的单元测试“实战”场景,并体现出案例的层次递进、逻辑关联和工程因素。通过案例驱动,引导学习者亲历一项实际测试项目的内容包含,学会如何联系理论知识,怎样运用技术,发现问题、思考问题和解决问题的方法及过程,提高实践学习的收效,逐步提高实践能力。(4)工程启蒙。一项完整的软件项目从规划设计到完成实施,业界是以工程的形式组织和推进。在实践教学的设计与实现过程中,测试项目中融入了规划设计、计划部署、组织实施、进度控制、项目管理及项目总结等工程内容和要素。这样,在培养知识应用与技能训练的同时,通过实践学习获得工程意识、工程概念、工程过程的经历与体验。3.2单元测试实践教学设计实践教学

10、设计选用的被测对象是用 Java 开发的程序,并选用业界广泛运用的 JUnit5 作为测试框架。(1)项目规划。项目规划确定了项目设计、项目评审、项目实施及项目总结等内容及形式,其目标是被测项目的选取与学习者的认知基础、接受能力和课程教学目标达到契合,规划应具可行性和有效性,即可实现、可实施、可评价。(2)项目设计。采用由简单到复杂的三阶项目设计过程,如图 3 所示。每阶项目内容及教学目标,看似相对独立,实则紧密关联,形成由简到繁、由易到难的递进形态。前阶项目学习中所获知识与技能是实施后阶项目的前提条件与基础,后阶项目既综合运用了前阶项目的所学所获,又设置了构建本阶项目所需的特定内容和目标,不

11、断加深实践的深度和难度,提升分析问题和解决问题的能力。(3)项目过程。基于工作过程、教学目标分析项目内容特征,制作教学案例,实施教学活动(表 1)。图 3 递进式的三阶项目设计表 1 教学活动、案例及覆盖的知识点教学活动教学案例名称覆盖知识点独立于任何项目单元测试概述单元测试的定义、对象、目标、测试依据、主要任务、测试策略等单元测试的要素与工作过程单元测试的模式、环境(驱动和桩)、单元测试的工作过程初阶项目测试分析项目总体分析测试分析的概念、内容和方法初阶项目测试计划制订项目的单元测试计划测试计划的依据与内容初阶项目测试设计单元测试用例设计白盒与黑盒测试方法初阶项目测试实施JUnit5 学习和

12、工程运用准备JUnit5 的组成、测试类与测试方法、测试实例生命周期、注解在项目中准备和部署测试环境(构建工程环境)在 Eclipse(或 IntelliJ IDEA)的 Maven 项目中添加 JUnit5 依赖、测试代码与被测代码在项目中存放的位置2023192计 算 机 教 育Computer Education3.3单元测试实践教学的实现以初阶项目为例,项目为 NextDate 问题的Java 程序单元测试。NextDate 问题简述如下:NextDate 程序有 3个输入变量 year、month、day(均为整数型),分别作为输入日期的年、月、日,通过程序计算输出该输入日期在日历上

13、的下一天的日期(例如输入 2004 年 12 月 31 日,程序计算输出的日期应为2005年1月1日),如果输入的数据无效(例如 2004 年 2 月 31 日),则程序统一给出提示信息“无效输入”。NextDate 计算问题因输入域之间具有依赖关系而具有一定的复杂性。3.3.1 测试分析测试分析是指根据测试依据提取被测软件中需进行测试的测试项的过程活动。在代码先行模式下的单元测试分析中,测试依据通常是软件的详细设计说明、受测源代码等。NextDate 项目提供的受测源代码本身是正确的程序(不存在缺陷或错误),对该项目中每个类的每个方法都要进行充分的动态测试,对所有受测源代码进行逻辑覆盖。3.

14、3.2 测试计划制订与评审测试计划包含定义测试范围、制订测试策略、确定测试人员素质要求、规划测试进度等。其工作交付物及过程是提交测试计划并评审,评审通过开展后续测试设计。在教学实现中,是由教师引导学习者根据测试分析的结果,编制测试计划,其内容包括:测试范围:NextDate 项目源代码中的所有类、所有方法。测试方法:以分析程序结构(白盒测试)为主,验证程序功能(黑盒测试)为辅。出口准则:所有测试用例均执行并通过,分支覆盖率 100%,变异(程序改变,用例不变)测试评分 90%以上。测试工具:以 JUnit5 单元测试框架搭建工程环境和实施测试。3.3.3 测试设计测试设计是指根据测试依据,选择

15、合适的测试用例设计方法编写测试用例的过程。该活动的交付物是测试用例规格说明,测试组需要对该文档进行静态评审,评审通过进入后续测试进程。此教学环节中,先由教师引领巩固测试用例设计技术要点,然后在教师指导下以测试小组(3 人)形式,依项目源代码完成对整个项目的测试用例设计,并组织对测试用例进行组间交叉评审,修正评审中发现的问题并作修改确认,进入后续测试活动。NextDate 项目中针对 Year 类的 isLeap()方法所得到的测试用例集合见表 2。3.3.4 测试实施与测试执行测试实施主要活动包括构建测试环境、编写自动化测试脚本,此活动的交付物包括自动化测试脚本、测试环境准备就绪报告等。续表

16、1教学活动教学案例名称覆盖知识点运用 JUnit5 编写构建简单测试JUnit5 测试用例结构(测试四阶段)、Test 注解、常用断言(assertEquals、assertTrue)等理想、优质的单元测试特点A-TRIP 特征运用 JUnit5 编写构建参数化测试JUnit5 参数化测试特性、添加依赖性、定义参数源初阶项目测试评估运行测试,同时进行覆盖率统计与变异评分Eclipse(或 IntelliJ IDEA)中集成的覆盖率分析工具、变异测试、pitest 工具进阶项目测试实施模拟对象和 Mockito 简介模拟对象的概念、应用场景等在 JUnit5 单元测试中用 Mockito 生成模

17、拟对象在 Maven 项目中添加 Mockito 依赖、创建模拟对象、对模拟对象打桩及验证高阶项目测试实施在单元测试中隔离数据库Spring Boot 应用的测试初始化数据库和导入数据在测试中使用内存数据库利用 Mockito 模拟 DB在单元测试中隔离外部服务Mock Server 工具-Moco 的应用教育与教学研究第 8 期193该环节是教师通过教学案例分析与指导学习者实践的过程,指导学生运用 JUnit5 完成测试设计中的测试用例脚本化(用于自动化测试)。isLeap()方法测试用例脚本化的过程如下,教学中运用了递进策略。1)运用 JUnit5 编写简单测试的过程。首先引导学生回忆思考

18、手动执行测试用例时需用哪些步骤,其后导入新策略:运用 JUnit5 测试用例结构完成测试,测试用例结构为“测试四阶段”。测试准备阶段:创建被测类的实例,设置被测类的内部状态,注入其外部依赖(一般用模拟对象替代);执行测试阶段:与被测类(SUT)交互,执行测试;结果验证阶段:验证测试的结果是否符合预期;环境清理阶段:将系统和环境恢复到测试前状态。测试不应对系统与环境造成持久性改变。教师实例演示如何用 Test 注解编写并运行简单测试,并布置作业运用 JUnit5 简单测试方式将 isLeap()相关的测试用例脚本化。2)运用 JUnit5 编写参数化测试的过程。结合以上完成的作业,引导学生发现用

19、简单测试方式编写的代码存在的问题,如数据与脚本混杂,可维护性差;代码重复、繁琐等,由此引入运用 JUnit5 参数化测试策略。表 2 isLeap()方法所得到的测试用例集合测试用例编号测试数据(Year 对象的 currentPos 成员)预期结果(返回值)11 992true2-1 992false31 993false41 900false52 000true6-5true7-1 991false8-101false9-401true101false11-1true教师实例演示编写参数化测试的过程:使用 CsvSource 注 解 定 义 参 数 源 数 据、用 Parameterize

20、dTest 取代 Test、测试方法需要定义参数等,分析比较两种测试策略的差异。分派 新任务 用参数化测 试的方 式优化isLeap()简单测试脚本。3.3.5 测试评估采用集成开发环境内置的覆盖率分析工具(IntelliJ IDEA 内置 JaCoCo)进行覆盖率分析。在 IntelliJ IDEA 中,以 Run“All Tests”with coverage 方式运行测试即可在测试运行同时,生成覆盖率分析报告,并可保存为 html 文档。YearTest 类(目前仅包含 testIsLeap 参数化测试方法)运行后,isLeap()的分支覆盖率为 100%。3.4教学效果10余年来,通过

21、基于JUnit(4/5)的测试框架,以不断贴近“实战”的形式,开展实施单元测试的实践教学。这一教学策略不仅完善充实了实践教学内涵,稳步提升了实践教学质量和收效,还培养训练了学生能够“实战”的专业技能,获得了工程启蒙,增强了就业竞争力,实现了“学以致用”的教育教学目标。20182021 年 4 年间我校软件技术专业学生连续参加全国大学生软件测试大赛开发者测试(团体赛),表现出训练有素的专业技能,获得了优异成绩,共获奖 45 项。其中,2019 保加利亚第三届 IEEE 国际大学生软件测试大赛(STC)三等奖 1 项,全国大学生软件测试大赛开发者测试全国总决赛 12 项(特等奖3项、一等奖1项、二

22、等奖8项),省级(广东)奖项 32 项(一等奖 12 项、二等奖 10 项、三等奖 10 项)。这些骄人的成绩,不断激发着学生奋发努力,学习实践,不少获奖、受益的学生在后继学习、升本深造、就业竞争、职场反馈等方面都表现突出。同时,这些成果也得到了业界的肯定和同行的赞誉。4结 语如何提升专业教育质量,增强实践教学成效,培养高质量专业人才,始终是高校教育教学的主导、重要的研究与实践课题、教学改革的关注热点。软件测试单元测试的实践教学在不断改2023194计 算 机 教 育Computer Education革,探索与实践过程中逐步成熟和发展。这一过程从较单纯的理实结合、技术验证、支点应用,到着眼于

23、从培养学生的能力出发,通过运用业界主流的 JUnit5 框架技术,以项目引领、案例驱动、工作过程为牵引,重构教学设计,改革教学进程,优化实践内涵。教学实践的成效反馈了这一改革思路的正确和成功;同时,通过 JUnit5 良好特性的运用和展现,也促进将其迁移运用到后继的接口测试开发与 Web 自动化测试等其他课程的实践教学中。参考文献:1 Cohn M.Succeeding with agile:Software development using scrumM.Boston:Addison-Wesley Professional,2009:311-313.2 Hunt A,Thomas D.单元

24、测试之道JAVA版-使用JUnitM.陈伟柱,陶文,译.北京:电子工业出版社,2005:79-86.3 书栈网.Junit 5官方文档中文版EB/OL.2018-06-05.https:/ Java Magazine.Migrating from JUnit 4 to JUnit 5:Important differences and benefitsEB/OL.2020-04-06.https:/ 朱冬玲.基于先进工作过程的软件测试课程教学J.电脑与电信,2013(11):37-38.(实习编辑:欧 阳)足于按照实验步骤做出实现结果;学生更加大胆尝试,面对问题不为难不慌乱,即便未必立刻解决,

25、也多半可以给出大致正确的解决方向。4结 语在嵌入式开发实训系列课程教学中还有几点值得关注,首先要根据业界发展和技术更新动态调整实训内容,嵌入式开发的发展变化可谓日新月异,如果想让学生可以在毕业时从实践能力角度具备更强的竞争力,那么在保留必备的基本素养实训同时,要结合最新技术动向,动态调整各次实训和终极任务的内容和要求;其次,借助教学活动进行的双创和思政教育,是需要通过多次反复不断渗透,我们应仔细设计、持续更新具体文案,从而达到反复而不重复、强化而不引起反感。参考文献:1 熊旭辉,程永山,童强,等.物联网应用型人才培养背景下的嵌入式系统的实践教学探讨J.湖北师范学院学报(自然科学版),2015,

26、35(4):108-111.2 黄丽.以电子设计竞赛推进嵌入式系统实践教学改革J.科教导刊(下旬),2017(3):105-106.3 黄培灿,肖慧娟.面向工程实践能力培养的嵌入式系统实践教学改革与实践J.工业控制计算机,2021,34(12):153-154.4 杜娟,初红霞,张鹏,等.基于“任务驱动+项目导向”的嵌入式系统设计课程教学设计与建设J.中国现代教育装备,2022(3):124-126.5 李佑军.嵌入式系统综述J.现代电子技术,2003(6):90-91,98.6 舒展.嵌入式系统综述J.现代计算机(专业版),2011(5):44-46.7 屈召贵.面向“双创”教育的嵌入式系统课程改革与实践J.电气电子教学学报,2021,43(2):52-55.8 郭超,姚雷博,胡友耀.基于创新能力培养的嵌入式系统课程教学改革策略探析J.电子元器件与信息技术,2021,5(7):163-164.9 王博,黄永红,贾好来.“嵌入式系统及应用”课程思政教学实践J.电气电子教学学报,2020,42(6):25-29.10 刘黎明.融合思政元素的“嵌入式系统”课程教学模式改革探索J.工业和信息化教育,2022(5):79-84.(实习编辑:欧 阳)(上接第188页)

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 论文指导/设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服