令狐写了一篇《单元测试》,源于我们上周的一次关于测试的讨论。TR说到的原子性、独立性、正交性的确也都是值得讨论的问题。不过我比较关注的是粒度和覆盖度。
讨 论是缘起于我们几个最近在合作的一个基于Pylons开发的小项目。Pylons本身是一个基于MVC的WEB框架,我们的应用可以简单地分层为: Controller, Function, Model 这样三层。Model里都是表结构的定义,没有什么好测试的;Function部分是主要的功能实现部分,所以我们在这里使用了Python的 unittest框架进行测试;当然,Pylons为Controller的测试提供了一个基于nose的测试环境,不过我们没用——因为在我们的应用中 Controller只是作为View与Function之间的接口。
但是问题就在这里了,实际开发中发现,某人的Controller代码居然也有错误——具体是谁我就不说了。原因自然是因为我们省略了对Controller的测试,所以这里的错误就不能被及时发现,或者说这部分功能代码没有被测试所覆盖到。
令狐在文中说到的第三点——单元测试应该能保证每一个函数的可靠性——应该说是一个完备的测试所要做到的,但是实际上总会有一些取舍。这其中的原因除了一些特别简单而且基本不会修改的函数可以不必测试以外(这点也要小心,有时越是简单的函数越可能出错),另外一部分原因在于一些函数的依赖性,比如对数据库或网络这样的外部资源的依赖。
回到我们那个具体的项目上。
我们当初之所以只对Function部分进行测试,就是因为这部分被我们设计为最主要的功能实现部分,结果现在出现问题——未被测试所覆盖的部分出错了。
最圆满的解决办法就是再给Controller加一层测试,确保测试的完备。但这样的话就要多一些编写测试的工作了。当然,多写点测试也不是什么坏事,但问题在于我前面已经说了,Controller层很薄,没有多少代码,专门为它写一套测试似乎有点多余。
关于测试的量应该控制在多少,ajoo兄的观点很值得参考。如果测试代码的代码量与被测试代码差不多,那么这样的测试似乎就没有意义了。
好吧,剩下的问题就是:如果减少了测试的代码量,如何保证覆盖范围足够大?答案是把粒度放得粗一些。
以这个案例来说,我 的观点是:实现对Controller层的测试,而放弃对Function层的测试——因为Controller层调用了Function层所有功能,也 就是说,测试可以确保同时覆盖Controller层和Function层。但是代价是失去了测试的准确定位功能,一旦出现测试不通过的情况就无法判断问 题是出在Controller层还是出在Function层。不过幸好Controller层很薄。
当然,令狐是不赞成我这个观点的,所以他写了那么一篇长文章。
其实这样的事情我是干过的。前两年为某商业软件写过一个他们的专用协议所需的反弹端口代理程序,因为如前面所说,这个程序有对网络的外部依赖,所以精确的定点测试比较困难,最后我在开发的时候是用了最偷懒的办法,也就是最粗粒度的测试:
用DUnit写了一个独立的测试程序,在其中实现了两个Mock,分别模拟通讯的两端与代理程序之间用专用协议连接,只要这两个Mock之间通过代理的通讯是正确的,就返回测试通过。
最后我就是用这样的方法把那个程序开发完成的。当然,中间也少不了很多DEBUG LOG的分析处理工作。囧。
总的来说,还是不推荐将测试粒度放得太粗,因为这将失去单元测试的一个很大方面的作用,增加DEBUG的工作量。但是同样不应该将粒度做得太细,这样测试就没有意义了。
分享到:
相关推荐
### 单元测试理论与实践 #### 一、单元测试的概念与目的 单元测试是对软件基本组成...通过合理规划单元测试的内容、策略、过程以及选择合适的工具,可以最大限度地发挥单元测试的作用,确保软件的可靠性和稳定性。
本资源包精心汇总了五类重要的软件测试文档模版,包括单元测试计划、单元测试报告、测试方案、功能测试报告以及性能测试报告,这些都是软件测试工作中不可或缺的部分。 1. **单元测试计划**: 单元测试计划是软件...
【软件单元测试计划模板】 软件单元测试是软件开发过程中至关重要的一环,旨在验证代码的各个独立模块是否按预期工作。一个完整的单元测试计划是确保这一过程有效性和效率的关键。以下是对【标题】“软件单元测试...
首先,iOS单元测试策略是指在编写测试用例前,对于测试目的、测试范围以及测试方法的预先规划。在iOS开发中,通常会对应用的不同层级,如视图层、业务逻辑层、数据持久层等进行单元测试,确保每一部分都能正常工作,...
### 单元测试计划模板知识点解析 #### 一、导言 **1.1 目的** - **定义目的:** 明确指出该计划的主要目的是为了确保软件开发过程中的单元测试能够有效地实施,并且能够达到预期的质量标准。通过制定详细的单元测试...
【计算机软件单元测试】 软件单元测试是软件开发过程中的关键环节,它按照GB/T 15532-1995的标准,提供了一种系统化的方法,旨在确保每个独立的软件组件(即单元)都能按照预定的需求正确运行。这个过程涵盖了测试...
### 有效的单元测试 #### 单元测试的意义 单元测试是一种软件开发技术,它通过自动化的测试用例来验证软件的各个组成部分(通常是函数或方法)是否按预期工作。单元测试的目标是确保每个代码单元都能独立正确地...
### 软件测试系列之单元测试 #### 单元测试概述 单元测试是软件测试的一个重要组成部分,它主要关注于软件系统中的最小可测试单元(通常为一个函数或方法)的功能验证。通过编写测试用例来确保这些单元在各种输入...
在单元测试技术的具体使用流程中,充分性保证是测试之前的必要条件,需要对软件进行规划,确保其能充分发挥作用。测试环节需要明确,包括信息输入、期望值的确定、数据输入情况的分析、前置和后置条件的判断等。此外...
软件测试中单元测试的桌面检查、走查方式和代码审查 单元测试是软件测试的重要部分之一,它关注于软件的每个单元的正确性和可靠性。单元测试可以帮助开发人员和测试人员发现软件中的错误和缺陷,从而提高软件的质量...
单元测试报告对于软件质量的评估和后续测试工作的规划都具有非常重要的作用。 总之,单元测试是软件测试中不可或缺的一环,它通过独立的测试用例来检验最小的可测试单元的正确性。通过单元测试,可以在软件开发的...
测试阶段应分为单元测试、集成测试、确认测试、回归测试和验收测试,各阶段明确责任分配。 3. 测试环境管理:获取并准备合适的测试版本,搭建和维护测试环境,准备测试数据和用例,确保测试的有效性和全面性。同时...
以下是对单元测试中涉及的知识点的详细解释: 1. 距离矢量路由协议:这类协议如RIP(Routing Information Protocol)或IGRP,依赖于相邻路由器发送的路由更新来维护其路由表。路由器D选项正确,它依靠邻居发送的...
【软件测试单元测试实验报告】 单元测试是软件测试的重要组成部分,它主要针对程序代码的最小可测试单元,如函数、方法或对象进行验证,确保它们按照预期正确地工作。本实验报告将详细阐述单元测试的目的、流程、...
这表明开发团队已经完成了项目的整体设计和规划,准备开始实施单元测试。 2. 完成v4l2 驱动 UVC 摄像头的测试,并能够抓取1帧图像并保存。这表明开发团队已经完成了摄像头的单元测试,能够正确地抓取图像。 3. ...
而代码编写完成后,通过编写单元测试来验证每个独立模块的功能正确性,单元测试报告作为测试阶段的重要输出,记录了测试用例、预期结果与实际结果的对比,以及问题的追踪,从而为后续的集成测试和系统测试奠定基础。...
- **复杂系统的测试策略**:通过具体案例展示如何针对大型或复杂的系统进行有效的单元测试规划。 通过上述内容,读者能够全面地掌握单元测试的核心概念、技术和实践方法,从而有效地将其应用到实际项目中,提高...