优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2025-01-24 13:20:07 技术文章 7 ℃

首先我们应该明白很重要的一点,就是单元测试的对象是代码,然后需要掌握一些单元测试的基本方法和主要的技术手段。比如,什么是Mock代码,驱动代码,桩代码。

代码一般产生错误的原因是什么?

我们都知道,不管你用什么语言开发程序,我们抛开业务逻辑不谈,只看代码的框架。你会发现不管你是使用条件分支,循环,调用子函数等等,其实都是对数据的一些处理。

这里我们应该关注代码的两个点:

  1. 数据分类处理,要保证分类没有遗漏,一旦有遗漏就会产生bug。
  2. 在一个分类中,数据的处理逻辑是否正确。

单元测试详解

单元测试的定义:

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

单元测试的用例设计:

单元测试的用例其实是一个“输入数据”和“预计输出”的集合。你需要跟你输入数据,根据逻辑功能给出预计输出,这里所说的根据逻辑功能是指,通过需求文档就能给出的预计输出。而非我们通过已经实现的代码去推导出的预计输出。这也是最容易被忽视的一点。你要去做单元测试,然后还要通过代码去推断出预计输出,如果你的代码逻辑本来就实现错了,给出的预计输出也是错的,那么你的单元测试将没有意义。(如果听懂了麻烦给个赞)

如何定义输入数据?

如果你觉得输入数据就是函数的入参,那就大错特错。这里我给出几种经常遇到的输入数据。

  • 被测试函数的输入数据。
  • 被测试函数读取的在函数内部读取的静态变量,全局变量。
  • 调用子函数获得数据。
  • .....

如何定义预计输出?

同样如果你觉得预计输出,就是函数的返回值,那也是大错特错。这里我给出几种经常遇到的预计输出类型。

  • 被测函数的返回值。
  • 被测函数的输出参数。
  • 被测函数所需改变的全局变量。
  • 被测函数更新的数据库。
  • 被测函数对kafka中的数据进行更新。
  • 以及一些rpc(远程过程调用)相关的返回值。
  • ......

驱动代码,桩代码,Mock代码

驱动代码:

驱动代码其实就是,我们用不同语言的测试框架的实现。比如java 中的junit,c++中的gtest等等。这里给你相关视图。




我们通过驱动程序,来给我们的测试用例生成,输入数据,以及用例的执行,最后生成用例的测试报告(那些运行成功,那些运行失败)。

桩代码:

是指,比如你需要测试一个函数A,但是在A中需要通过调用子函数B的返回值来执行不同的if分支。但是这个时候如果B函数还没有实现。这个时候我们需要构造一个假的函数来代替函数B。这个假的函数就叫桩函数。见测试代码。

void funA(){
		int funB_returnValue;
    funB_returnValue = funB();
    if(1 == funB_returnValue)
    { /* todo */}
    else if (2 == funB_returnValue)
    {/* todo */}
    else
    {/* todo */}
}
int funB(){
   if(testcase == "test01")
   {
     return 1;
   }
  else if (testcase == "test02"){
     return 2;
  }
  else
  {
     return 3;
  }
}

Mock代码:

Mock代码和桩代码都是用例临时替换未实现的模块。我个人觉得桩代码主要是通过桩函数的返回值来控制被测函数的代码执行路径的。而Mock代码则是通过Mock的返回值来做断言用的。

这里具体如何来通过代码实例来演示Mock,应为不同的编程语言的测试框架不同,Mock的使用也不同。如果单赞过百,就继续发文章来讲解这一块的知识。感谢阅读。

最近发表
标签列表