前面说过项目级的质量保障中,一个很关键的活动就是单元测试。那么到底如何来做单元测试呢?这里先讲一个有关单元测试的小故事。
这个故事说的是Morgan Conrad。
一天早晨,一名程序员向大师提了一个问题:“我想写一些单元测试。我应该为多少代码写测试呢?”
大师回答:“不要为多少担心,写一些好的就是了。”
程序员笑了,鞠了一躬,离开了。
……
几天之后,第二个程序员问了相同的问题。
大量指着一锅烧开的水说:“这里面该下多少米呢?”
这个程序员对这个问题感到奇怪,回答到:“我怎么能告诉您呢?这要看你准备请多少人吃饭了,看他们有多饿,还看您提供不提供别的食品,你是否有足够的米,等等。”
“答得很对。”大师说。
第二个程序员笑了,鞠了一躬,离开了。
……
最后一天,第三个程序员问了同样的有关测试程度的问题。
“80%,不能再少了。”大师用拳头敲着桌子,用严肃的口吻说。
第三个程序员笑了,鞠了一躬,离开了。
……
就在大师回答第三个问题的时候,一个年青的新手走了过来,问道:“大师,今天,我听您对同样的有关测试程度的问题做出了不同的回答,这是什么原因呢?”
大师从椅子上站起来,回答:“给我倒杯新茶,我们谈谈。”
在他们都在自己杯里倒满热气腾腾的绿茶后,大师开始说话了。
“对于测试来说,第一个程序员是个新手,刚刚开始测试。现在,他有大量的代码,但是没有测试。他还要走很长的路,这个时候关注测试程度,会摧毁他的信心,一点用也没有。他最好去写写,用用测试。他可以以后再考虑测试程度的问题。“
“相反,第二个程序员已经熟练掌握编程和测试了。当我问她应当往锅里下多少米时,我让她意识到测试的数量是受很多因素影响的。她比我都了解这些因素——这毕竟是她自己的代码。没一个简单的答案,她很聪明,可以自己找到问题的答案,开始工作。”
“我明白了。”年青的新手说,“但是,如果没有唯一的简单的答案,那么,为什么您对第三个程序员说,‘一定要大于80%’呢?”
大师一听大声笑得把肚子都鼓了起来,比他喝下去的水还多,涨起来,又憋下去。
“第三个程序只是要个简单答案罢了——虽然根本就没有简单的答案……这样他就不用为这个问题困绕了。”
从这个故事可以看出单元测试虽然很多人都在说,其实并不象大家想象的那么容易,下面来说说单元应该注意的三个关键问题:
1、单元测试的单元选取
单元测试,测试对象是单元,似乎很简单,但是单元选取不合理是很多人在做单元测试时候容易犯得到错误。比如C语言编程,很多人直接就把每个函数作为单元来对待,把函数作为单元并没有错,错的是并不是所有的C语言函数都是单元。我们在选取单元的时候要注意两点:单元应该高内聚、低耦合。高内聚就是一个单元应该是一个实现一定逻辑功能的相对完整的单元,做单元测试我们经常要对一些函数作桩来代替依赖函数的功能,而高内聚保证我们一般不需要在单元的内部做桩;低耦合就是,单元逻辑边界应该比较清晰稳定,这样单元测试通过逻辑边界接口来驱动单元的时候,单元测试用例的稳定性相对比较好,不至于经常一点小小的变化就要对单元测试用例做大规模变更。
2、单元测试的度
前面大师的故事重点说的是单元测试的度的问题,大师没有直接回答这个问题,那么到底单元测试应该做到什么度呢?这个问题连大师都没有正面回答,当然不是那么简单,很多项目在没有正确答案的情况下都用白盒覆盖率来衡量,比如语句覆盖80%,分支覆盖60%等等,项目组以为达到覆盖率目标就可以了,殊不知这样恰恰是顾了指标忘了目标,特别白盒覆盖率指标,这些指标只是用来进行辅助判断的,根本的还是应该关注单元的逻辑功能的覆盖,通过代码覆盖率的不足来分析这些代码涉及的逻辑功能测试上的场景缺失。
那么到底如何做单元测试呢?这里给大家推荐一个方法,那就是软件质量分级。因为不同的单元对于质量的要求不同,因此我们针对不同的单元可以采取不同的质量方法。对于低质量要求的单元,我们可以只进行基本的代码走读等基本代码质量保障活动就可以了;一般的交付质量要求的单元,我们除了基本的代码走读之外,一般要求至少100%的代码语句覆盖和基本代码静态检查;一些质量高的单元可能还需要增加更加深入的覆盖,比如80%的分支判定覆盖,增加动态检查等;对于最高质量要求的单元,除了上面的我们可能还得考虑其他办法,比如不同的编译器,多种不同的静态检查、动态检查等。通过分级的单元测试确保分级的单元质量。
3、单元测试自动化
不同公司单元测试的方法可能不一样,但是有一点一点必须保证,就是单元测试自动化。因为单元测试的目的是为了保证代码的质量防护,如果不能自动化运行必然不能频繁运行,这样也就谈不上对代码的看护了。
分享到:
相关推荐
单元测试实施规程是软件开发过程中一个关键的质量保证环节,它旨在确保软件的每个独立模块都能按照预期的功能正确运行。以下是对这一规程的详细说明: 1. **目的**:单元测试的主要目的是验证软件的各个模块(任务...
当进行单元测试时,开发者或测试人员会编写小规模的测试用例,这些用例直接针对代码的特定部分进行,而白盒测试提供了一种方法来深入这些代码的内部,确保其逻辑正确性。 白盒测试的分类包括多种方法: 1. **代码...
单元测试是软件测试的基础,是软件开发过程中不可或缺的一部分。 单元测试的目的是为了确保软件的每个组件都能够正确地执行其功能,并且在集成时不会出现问题。单元测试可以帮助开发人员早期发现代码中的错误和缺陷...
本教程将深入探讨Java单元测试的基础,特别是结合JUnit框架的使用。 首先,我们需要理解什么是单元测试。单元测试是对软件中的最小可测试单元进行检查和验证的过程。对于Java来说,这通常是单个方法。通过编写测试...
《软件测试基础教程》是一本全面介绍软件测试的教程,对于从事测试工作的人来说极具价值。本文将深入探讨软件测试的基本概念、分类以及测试方法。 测试是软件生命周期中的关键环节,其目的是确保产品在交付给最终...
【单元测试】 单元测试是软件开发中的一个重要环节,它主要针对程序的最小可测试单元——模块进行。单元测试的基本属性包括明确的功能定义、可定义的规格以及与其他单元清晰的接口划分。其目的主要是发现模块内部的...
RTT操作系统基础版虽然在描述中提及,但主要关注点仍在于单元测试。 单元测试是一种软件测试方法,它将程序的不同功能模块分解为独立可测试的单元,然后对每个单元进行单独验证。这样可以确保每个模块在集成到整个...
标题和描述均指向了一个主题——单元测试的基础,这是软件开发中的关键环节,旨在通过独立测试软件的最小可测试部分(通常是函数或方法)来确保代码的正确性和稳定性。以下是对给定文件信息中所涉及的知识点的详细...
在实际应用中,单元测试和集成测试通常结合使用,形成一种测试金字塔模型,其中单元测试构成了基础,而集成测试和其他类型的测试(如系统测试和验收测试)位于金字塔的上层。这种模型有助于保持测试的效率和深度。 ...
集成测试则在单元测试的基础上验证单元之间接口的正确性。基于越早发现bug开发成本越低的原则,在进行代码功能验证的过程中,按照V流程右半部分先完成单元测试再进行集成测试的测试顺序更为有效。另外,Tessy也可以...
这个“单元测试培训资料 Xunit系列示例 单元测试基础培训”压缩包显然包含了关于如何使用Xunit进行单元测试的教程和实例。 在进行单元测试时,我们首先需要理解其核心概念: 1. 测试驱动开发(TDD):这是一种编程...
一、单元测试基础 单元测试是对软件中的最小可测试单元进行检查和验证,这个单元可能是函数、模块、类或对象。它的主要目的是尽早发现代码中的错误,降低修复成本,提高软件的可维护性和可读性。单元测试通常由...
#### 五、单元测试策略 单元测试的实施策略有很多种,主要包括以下几种: 1. **自顶向下测试**: - **方法**:从系统的顶层开始逐步向下进行测试,对未完成部分使用桩模块代替。 - **优点**:能够提前发现高层...
【软件测试基础理论】 在软件开发的生命周期中,软件测试占据着至关重要的位置,它确保产品的质量、稳定性和安全性。本教程将引导你逐步了解软件测试的基础理论,这对于初入测试领域的人员尤其重要。 1. **软件...
1. 语文学习:此文档是一个关于人教部编版八年级上册语文第五单元的测试卷,涉及到了语文基础知识的考察,包括字音、字形、成语运用、语病辨析、句子排序等,这些都是语文学习的基础部分。 2. 语言文字运用: - ...
"软件测试之单元测试基础知识" 单元测试是软件测试中的一种重要方法,它能够帮助开发者发现软件中的错误和缺陷,从而提高软件的质量和可靠性。在本文中,我们将讨论单元测试的基础知识,包括单元测试的重要性、测试...
### 单元测试规范详细说明 #### 一、测试分类(方法) 单元测试是一种软件测试方法,用于验证软件中最小可测试单元或组件的功能是否正确。为了确保单元测试的有效性和全面性,通常需要对不同类型的类进行测试。...
此文档是小学六年级英语上册第五单元的测试题,主要涉及了英语听力、口语交际、阅读理解及书写等基本语言技能的考察。以下是对各个部分知识点的详细解析: 一、单词或词组 这部分测试学生对英语词汇的理解和辨识...