单元测试基础知识

什么是单元测试?

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。

电子元器件组装成电路板,各个功能电路板组装成电视机。

电子元器件就像是软件中的单元,通常是函数或者类,对单个元器件的测试就像是软件测试中的单元测试;
组装完成的功能电路板就像是软件中的模块,对电路板的测试就像是软件中的集成测试;
电视机全部组装完成就像是软件完成了预发布版本,电视机全部组装完成后的开机测试就像是软件中的系统测试。

单元测试通常由开发工程师完成,一般会伴随开发代码一起递交至代码库。单元测试属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量。
另外,单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。

代码的基本特征与产生错误的原因:
   所有的代码都是在对数据进行分类处理,每一次条件判定都是一次分类处理。

  如果有任何一个分类遗漏,都会产生缺陷;如果有任何一个分类错误,也会产生缺陷;如果分类正确也没有遗漏,但是分类时的处理逻辑错误,也同样会产生缺陷。
   要做到代码功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确。

为什么要做单元测试?

是所有测试中【唯一】有保证能够代码覆盖率达到100%的测试

能够提供最基本的产品稳定性与产品质量

性价比最好 ---> 错误发现的越晚,修复它的费用就越高

促使开发者养成更好的编码习惯 --->【代码规范】【优化】【可测试性】【重构】

防止了开发的后期因bug过多而失控

自动化执行 

单元测试用例

  单元测试的用例是一个“输入数据”和“预计输出”的集合。“在明确了代码需要实现的逻辑功能的基础上,什么输入,应该产生什么输出”。

测试用例的设计过程如下:使用一种或多种白盒测试方法分析模块的逻辑结构,然后使用黑盒测试方法对照模块的规格说明以补充测试用例。

单元测试“输入数据”

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

单元测试“输出数据”

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

驱动代码和桩代码

  驱动代码是用来调用被测函数的,而桩代码和 Mock 代码是用来代替被测函数调用的真实代码的。
   驱动代码(Driver)指调用被测函数的代码,在单元测试过程中,驱动模块通常包括调用被测函数前的数据准备、调用被测函数以及验证相关结果三个步骤。驱动代码的结构,通常由单元测试的框架决定。(比如python中的unittest框架?)
    桩代码(Stub)是用来代替真实代码的临时代码。

 

 上例中A是被测函数,内部调用了B,但测试A的时候,B可能没有实现,就需要模拟一个函数B,这个模拟的函数 B 的实现就是所谓的桩代码。

桩代码的应用首先起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并独立运行。同时,桩代码还具有控制被测函数执行路径的作用。

编写桩代码通常需要遵守以下三个原则:

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

Mock代码和桩代码 

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

对于 Mock 代码来说,我们的关注点是 Mock 方法有没有被调用,以什么样的参数被调用,被调用的次数,以及多个 Mock 函数的先后调用顺序。所以,在使用 Mock 代码的测试中,对于结果的验证(也就是 assert),通常出现在 Mock 函数中。

对于桩代码来说,我们的关注点是利用 Stub 来控制被测函数的执行路径,不会去关注 Stub 是否被调用以及怎么样被调用。所以,你在使用 Stub 的测试中,对于结果的验证(也就是 assert),通常出现在驱动代码中。

如何开展单元测试?

  1. 并不是所有的代码都要进行单元测试,通常只有底层模块或者核心模块的测试中才会采用单元测试。
  2. 你需要确定单元测试框架的选型,这和开发语言直接相关。比如,Java 最常用的单元测试框架是 Junit 和 TestNG,Python是unittest
  3. 为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。不同的语言会有不同的代码覆盖率统计工具,比如 Java 的 JaCoCo
  4. 最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值