什么是单元测试?如何做好单元测试?

什么是单元测试?如何做好单元测试?

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。
 
单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。
 
单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用。
 
如何做好单元测试?
1)代码的基本特征与产生错误的原因
无论是开发语言还是脚本语言,都会有条件分支、循环处理和函数调用等最基本的逻辑控制,如果抛开代码需要实现的具体业务逻辑,仅看代码结构的话,所有的代码都是在对数据进行分类处理,每一次条件判定都是一次分类处理,嵌套的条件判定或者循环执行,也是在做分类处理。
 
如果有任何一个分类遗漏,都会产生缺陷;如果有任何一个分类错误,也会产生缺陷;如果分类正确也没有遗漏,但是分类时的处理逻辑错误,也会产生缺陷。
 
2)单元测试用例详解
单元测试的用例是一个“输入数据”和“预计输出”的集合。需要针对确定的输入,根据逻辑功能推算出预期正确的输出,并且以执行被测试代码的方式进行验证。即“在明确了代码需要实现的逻辑功能的基础上,什么输入,应该产生什么输出”。
 
单元测试用例“输入数据”种类:

  • 被测试函数的输入参数;
  • 被测试函数内部需要读取的全局静态变量;
  • 被测试函数内部需要读取的成员变量;
  • 函数内部调用子函数获得的数据;
  • 函数内部调用子函数改写的数据;
  • 嵌入式系统中,在中断调用时改写的数据;
  • ……

“预计输出”:

  • 被测试函数的返回值;
  • 被测试函数的输出参数;
  • 被测试函数所改写的成员变量;
  • 被测试函数所改写的全局变量;
  • 被测试函数中进行的文件更新;
  • 被测试函数中进行的数据库更新;
  • 被测试函数中进行的消息队列更新;
  • ……

3)驱动代码,桩代码和Mock代码
驱动代码是用来调用被测函数的,而桩代码和Mock代码是用来代替被测函数调用的真实代码的。

驱动代码、桩代码和Mock代码三者的逻辑关系

  驱动代码(Driver)指调用被测函数的代码,在单元测试过程中,驱动模块通常包括调用被测函数钱的数据准备、调用被测函数以及验证相关结果三个步骤。
 
  代码桩(Stub)是用来代替真是代码的临时代码。比如,某个函数A的内部实现中调用了一个尚未实现的函数B,为了对函数A的逻辑进行测试,那么就需要模拟一个函数B,这个模拟的函数B的实现就是所谓的桩代码。
伪代码:

为了实现函数A的全路径覆盖,你需要控制不同的测试用例中函数B的返回值,那么桩函数B的伪代码就应该是:
  当执行第一个测试用例的时候,桩函数B应该返回true,而执行第二个测试用例的时候,桩函数B应该返回false。
  这样就覆盖了被测试函数A的if-else的两个分支。

桩代码的应用首先起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并独立运行。同时,桩代码还具有控制被测函数执行路径的作用。
 
编写桩代码通常需要遵守以下三个原则:

  • 桩函数要具有与原函数完全相同的原形,仅仅是内部实现不同,这样测试代码才能正确链接到桩函数;
  • 用于实现隔离和补齐的桩函数比较简单,只需保持原函数的声明,加一个空的实现,目的是通过编译链接;
  • 实现控制功能的桩函数是应用最广泛的,要根据测试用例的需要,输出合适的数据作为被测函数的内部输入。

Mock代码和桩代码的本质区别是:测试期待结果的验证(Assert and Expectiation)。

  • 对于Mock代码来说,我们的关注点是Mock方法有没有被调用,以书面样的参数被调用,被调用的次数,以及多个Mock函数的先后调用顺序。所以,在使用Mock代码的测试中,对于结果的验证(也就是assert),通常出现在Mock函数中。
  • 对于桩代码来说,我们的关注点是利用Stub来控制被测函数的执行路径,不会去关注Stub是否被调用以及怎么样被调用。所以,你在使用Stub的测试中,对于结果的验证,通常出现在驱动代码中。

实际项目中如何开展单元测试?
1)并不是所有的代码都要进行单元测试,通常只有底层模块或者核心模块的测试中才会采用单元测试。
 
2)你需要确定单元测试框架的选型,这和开发语言直接相关。比如,Java最常用的单元测试框架是Junit和TestNG;C/C++最常用的单元测试框架是CppTest和Parasoft C/C++test;框架选型完成后,你还需要对桩代码框架和Mock代码框架选型,选型的主要依据是开发所采用的具体技术栈;
  通常,单元测试框架、桩代码/Mock代码的选型工作由开发架构师和测试架构师共同决定。
 
3)为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。不同的语言会有不同的代码覆盖率统计工具,比如Java的JaCoCo,JavaScript的Istanbul。
 
4)最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定背刺代码递交是否能够被接受。
 
在项目中全民推行单元测试时,你会发现还有一些困难需要克服:
1)紧密耦合的代码难以隔离;
2)隔离后编译链接运行困难;
3)代码本身的可测性较差,通常代码的可测试性和代码规模成正比;
4)无法通过桩代码直接模拟系统底层函数的调用;
5)代码覆盖率越往后越难提高。

原文地址:https://www.cnblogs.com/111testing/p/11656261.html

时间: 2024-10-05 13:57:42

什么是单元测试?如何做好单元测试?的相关文章

如何做好单元测试

前言 单元测试是对软件基本组成单元进行的测试,是属于白盒测试的范畴,它主要通过对代码的逻辑结构进行分析来设计测试用例.在动态测试手段中,单元测试是一种非常高效的测试方法,并且是软件测试周期中第一个进行的测试.从成本角度考虑,缺陷发现越早越好,加强单元测试力度有利于降低缺陷定位和修复难度,从而降低缺陷解决成本,同时加强单元测试也减轻了后续集成测试和系统测试的负担.根据业界的统计,一个 BUG 在单元测试阶段发现花费是 1 的话,到集成测试就变为 10 ,到系统测试就高达 100 ,到实际推向市场量

Visual Studio 2010 单元测试之一---普通单元测试

原文:Visual Studio 2010 单元测试之一---普通单元测试 本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元测试,这是进行顺序测试.压力测试的基础.如果在Visual Studio 2010(2008)里面没有发现下图中的Test菜单,请用Visual Studio安装光盘进行安装,因为Visual Studio单元测试插件安装时可能不是默认选项. 测试之前,我们要准备一些测试代码.或者从下面的链接下载完

利用单元测试框架进行单元测试

单元测试目的是为了保证代码按照程序员的预期运行,往往关注的是比其他测试更低的层次,从而确定代码的底层功能是否与期望一致. 对于API框架而言,单元测试的一个重要优点在于测试在编译阶段就引入了依赖关系,从而使之更容易确定代码的更改是否会影响API表示的契约. 单元测试程序集与被测代码一般要分离开,这样可以保证在对应用程序代码进行部署时不包含单元测试,因为单元测试代码在产品环境中没有什么用. 代码的独立单元测试越容易,就越容易维护. 所有测试都应该是自主的和独立的,且应该对期望行为和错误情况都进行测

Django中的单元测试以及Python单元测试

Python单元测试 是用来对一个模块.一个函数或者一个类进行正确性检验的测试工作. 在Python中unittest是它内置的单元测试框架,单元测试与功能测试都是日常开发中必不可少的部分. 比如对函数abs(),我们可以编写出一下几个测试用例: 输入正数,比如1,1.2,0.99,我们期待返回值与输入相同 输入负数,比如-1,-1.2,-0.99,我们期待返回值与输入值相反 输入0,我们期待返回0 输入非数值类型,比如None,[],{},我们期待抛出TypeError 把上面的测试用例放到一

读书笔记-单元测试艺术(一)-单元测试的基本知识

一.定义单元测试和集成测试 1.什么是单元测试 单元测试是一段自动化代码,用来调用被测试的方法或类,而后验证基于该方法或类的逻辑行为的一些假设. 单元测试几乎总是用单元测试框架来写的.它写起来很顺手,运行起来不费时,它是全自动的,可信赖的,可读性强的.可维护的. 2.什么是集成测试 集成测试(integration test)意味着把两个或多个相依赖的软件模块作为一组进行测试. 缺点:存在"意外缺陷",在代码修改后,如果不能对以前的功能运行测试,很可能会无意中破坏已有的功能.可通过&q

Visual Studio 单元测试之三---压力测试

原文:Visual Studio 单元测试之三---压力测试 我们都知道大名鼎鼎的LoadRuner,但是很少有人知道Visual Studio自带的Test也可以做些简单的压力测试,下面我们就介绍一下如何利用Visual Studio进行压力测试. 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试不熟悉的话,请先参看上一篇.http://blog.csdn.net/tjvictor/archive/2011/

Android单元测试实践

为什么要写单元测试 首先要介绍为什么蘑菇街支付金融这边会采用单元测试的实践.说起来比较巧,刚开始的时候,只是我一个人会写单元测试.后来老板们知道了,觉得这是件 很有价值的事情,于是就叫我负责我们组的单元测试这件事情.就这样慢慢的,单元测试这件事情就成了我们这边的正常实践了.再后来,在公司层面也开始有一定 的推广. 要说为什么要写单元测试的话,我相信大部分人都能承认.也能理解单元测试在保证代码质量,防止bug或尽早发现bug这方面的作用,这可能 是大家觉得单元测试最大的作用.然而我觉得,除了这方面

【腾讯Bugly干货分享】安卓单元测试:What, Why and How

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d28349101cd07a5404c415 Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师.每周都会举行嘉宾分享,话题讨论等活动. 本期,我们邀请了蘑菇街 Android 开发工程师——小创,为大家分享<安卓单元测试:What, Why and How>. 分享内容简介: 单元测试一直是软件开发过程中保证软件质量.提高

对于单元测试

今天从坑里边跳出来了,原因单元测试不够充分.. 运行了N个月的系统,出现了页面也只跳出异常,ip为null...原因是1.老数据没有导入,2.单元测试没有做好,对于重复情况,导致两个数据库不一致的情况处理失败.以后要注意单元测试要做好... 昨天才写了单元测试的很重要,今天就从坑了跳出来.真是衰啊.