以“泾渭分明”的职责进行单元测试改革
2022-03-16谭学芹
谭学芹
(广州软件学院 广东·广州 510980)
在一个项目中,程序开发出来后,首先就要进行单元测试,在单元测试过程中,有一部分是本身程序开发人员进行操作,另外一部分属于软件测试人员进行操作的。但至于划分哪些单元测试是由测试人员去进行,哪些由开发人员去进行呢?业界其实一直都有一定的争论,在平常开课中,一般都认为单元测试只是软件测试方向人员所做的工作,但只要上网搜索一下相关资料,不难发现,单元测试其实做得最多却是软件开发人员,至于测试人员,一般都是软件开发差不多时,才进行介入,主要做集成方面的测试。由此,开设单元测试课程中,就已经进入一个误区,为了搞清楚弄明白这个误区,应该要对单元测试课程进行深入的企业调查研究,针对社会上实际需求进行单元测试课程改革。
1 单元测试重要性
单元测试一般都是针对源代码的测试,在单元测试中,有一些测试原则需要遵循。第一个原则是尽可能保证各个测试用例是互相独立的,应该避免在测试类中调用其他依赖的类。第二个原则是一般由代码的开发人员来实施,用以检验所开发的代码功能符合自己的设计要求。[1]就是实施单元测试的人需要对被测试的模块代码有相当程度的了解。
在软件测试的不同阶段当中,单元测试是个非常重要的阶段,可以说是其他测试阶段的基础,单元测试有很多好处。第一个好处是通过单元测试能尽早发现缺陷,在测试的前期能够发现更多的缺陷,而且收益是更高的。第二个好处是有利于重构,通过实施单元测试有利于重构,进行了完善的单元测试就能够最大限度地保证后面的重构的正确性,且可以快速识别出重构时出现的问题。第三个优点是简化集成,单元测试保证最小单元模块的稳定性和正确性,为我们后面的集成测试奠定了基础。第四个优点是文档,单元测试包括了对模块的基本理解和特性,如果单元测试比较规范,通过对它的阅读,就能够基本了解到这个模块的特性,单元测试就相当于文档。第五个优点是用于设计,通过编写单元测试,可以把设计思路体现在单元测试的组织当中。[3]由此可见,单元测试做得好与否,将会直接关系到项目是否完善,对于项目日后bug追溯起到很重要的作用。
2 开发和测试人员写单元测试的优、缺点
2.1 开发人员写单元测试
优点:开发对代码最熟悉,而且开发技能也强,开发自己写单元测试效率上和覆盖率上都比较高。而且单元测试有时候需要开发对代码进行部分重构才方便进行,开发自己做这些重构也比较顺手。
缺点:开发平时写业务代码就忙不过来了,哪有时间写单元测试?而且大部分开发没有太好的测试思想,单元测试可能只是写个最简单的用例就完了,最终可能单元测试通过,但基本的功能还是有问题,这样的单测没有太大作用。
2.2 测试人员写单元测试
优点:测试有比较好的测试思想,可以更好地保证用例的覆盖。而且通过写单元测试能更好地了解具体代码结构、流程,对于后续的业务测试也有利。
缺点:有比较好代码能力的测试人员不多,而且测试对代码没有开发熟悉,遇上为了可测性需要重构的时候还是得开发花时间配合。效率上不如开发自己写。
3 单元测试如何进行改革
(1)必须清楚单元测试中要做的所有工作,列出具体内容,同时,也列举出要用的相关的知识点,列举出在哪个时间段进行的。
(2)明确软件开发与软件测试的目标,必须清楚一般情况下,哪部分是由软件开发人员做的,哪部分是由测试人员做的,分工应该如何进行配合,如何才能做到最佳的配合。
(3)弄清楚各自的测试计划,这样对各自的职责都是明确的,有利于系统顺利地进行开发及完成。
(4)如果存在相关重复的,应该如何划分责任。如果存在互不相关,但又必须要做,又如何进行重新分工。
(5)如何将测试结果进行相互共享,相互进行改进,最终形成一个共同的单元测试报告。
4 软件开发方向单元测试任务
鉴于软件开发人员最熟悉代码,且开发能力强,在单元测试分工中,会更多的做逻辑性更强、应用性更强的单元测试任务:
(1)粗粒度测试。隔离测试是单元测试的核心,隔离测试包括粗粒度测试和细粒度测试,粗粒度测试构建的依赖部件是一个比较大的模块,比如Web服务器、文件系统或者数据库等。通过stub技术来做粗粒度测试,写出的stub替代代码需要有详细的逻辑处理,因此这种粗粒度隔离测试比较适合开发人员来完成。
(2)服务器端应用测试。组件测试是软件项目软件质量控制不可缺少的一个环节,对组件进行单元测试要难于对普通Java类进行单元测试,这是因为组件要与它们的容器打交道。容器内单元测试通常使用Cactus框架在容器内运行测试[5]。因为要进行容器内单元测试,需要深入理解组件、容器等相关的知识,所以是比较适合软件开发人员来进行这一块的单元测试。
(3)数据库访问测试。数据库访问代码毫无疑问是任何企业项目中最重要的部分之一,在实际测试中采用DbUnit工具对Java应用程序的数据库访问代码进行单元测试。只要掌握数据库访问相关知识和DbUnit工具的使用,就可以胜任数据库访问的单元测试任务。软件开发人员和测试人员均可以承担这部分的测试任务。
5 软件测试方向单元测试任务
软件测试人员相对开发人员来说,代码能力相对弱些,但是有很好的测试思想,针对不需要有非常好的代码能力的单元测试任务比较适合软件测试人员来做:
(1)隔离测试中的细粒度测试。细粒度测试指主要测试对象依赖其他类对象的场景,按照单元测试的隔离思想,在测试主要测试对象的时候,会创建模拟的对象来代替依赖的对象。在做这种细粒度测试通常采用 mock框架如EasyMock借助一些简单的方法动态生成依赖对象,这个过程不需要手工创建模拟类,代码量比较小,比较适合软件测试人员完成这一部分的单元测试任务。
(2)数据库访问测试。只要软件测试人员掌握数据库访问相关知识并会使用专门用于数据库访问单元测试的工具DbUnit,完全可以和开发人员合理分工一起完成应用程序的数据库访问测试任务。
(3)基于Parasoft Jtest单元测试工具进行单元测试。Parasoft Jtest是为Java EE、Web及其他Java应用程序的开发团队量身定做的一款全面测试Java程序的工具,可以自动查找隐藏的运行缺陷、自动代码检测、自动生成高质量的测试用例集合发现尽可能多的结构性错误等,通过该工具可以很方便的进行单元自动化测试[4]。软件测试人员通过相关学习掌握Parasoft Jtest工具的使用,且该工具不需要编写测试脚本或测试用例,适合测试人员去完成这部分测试工作。
(4)单元测试框架与构建工具的集成。通过构建工具,可以实现代码编译、打包、测试、部署等一系列过程实现自动化,可以有效的节约开发人员或者测试人员在这一系列过程中所耗费的时间。在进行持续集成构建过程,通常将Junit与构建工具Ant与Maven进行集成。通过Ant可以将测试作为Ant构建生命周期中的一部分来启动,并且可以根据Junit的执行结果生成一些特定的报告。通过Maven可以在Maven构建生命周期中包含测试的执行还可以使用Maven插件生成HTML报告[5]。关于单元测试框架与构建工具的集成,软件测试人员可以进行。
6 结束语
在敏捷开发的时代,强调团队内部的协作。单元测试是要求开发人员与测试人员相互配合才能完成的,各自完成各自的任务,甚至有些测试任务两者还可以合作完成,故在改革过程中,应该在此课程改革中要进行仔细研究一般哪部分是属于软件开发要做的工作,哪部分是属于软件测试方面的工作,只有做好这方面的改革工作,才能让整个项目系统开发过程变得更加成熟稳重,系统才能变得更加规范。