单元测试需要知道的那些事

1.什么是单元测试

单元测试是针对单个方法进行的测试,又称为模块测试,是针对程序模块(软件设计中的最小单元)来进行正确性检验的测试工作。一般来说这里的最小可测试单元通常是指函数或者类。

2.单元测试的优点

  1. 代码覆盖率高。
  2. 提高软件质量。
  3. 减少bug。
  4. 让开发者对程序稳定性更有信心。
  5. 有些在单元测试能发现的问题,如果没有被发现,到测试阶段被发现,对开发人员来说要修复bug和部署,对测试人员来说会做一些重复的测试,花费时间成本高。
  6. 如果修改了方法代码, 只需要保其对应的单元测试通过就可以了。
  7. 测试代码本身就可以作为示例代码。
  8. 团队的新人可以更快熟悉系统的逻辑。

3.单元测试一般怎么做

在Java中,单元测试代码应该写在 src/test/java 目录下,单元测试资源应该放在src/test/resources下。平常用的最多的单元测试框架就属Junit了,当然还有后来衍生的testng等单元测试框架。在Dao层,Service层中的每一个方法都确保单元测试的通过。由不经常变动的核心代码开始写,然后写上层的业务代码的单元测试。在重要的算法中,核心业务逻辑必须单元测试通过。目前来说单元测试测试最多的应该是service层的代码。

在《阿里巴巴Java开发手册》中,关于单元测试给了我们非常多实用的建议。

  1. 保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试用例之间决不能互相调用,也不能依赖执行的先后次序。
  2. 单元测试是可以重复执行的,不能受到外界环境的影响。
  3. 单元测试的基本目标:语句覆盖率达到 70% ;核心模块的语句覆盖率和分支覆盖率都要达到 100%。
  4. 在设计评审阶段,开发人员需要和测试人员一起确定单元测试范围,单元测试最好覆盖所有测试用例( UC )。

4.怎样是算是一个优秀的单元测试

自动的、可重复的执行的测试
比较容易实现编写的测试
一旦写好,将来任何时间都依旧可以用
团队的任何人都可运行的测试
一般情况下单击一个按钮就可以运行
测试可以可以快速的运行

易测试的代码基本上可以和设计良好的代码划等号。因为一个单元测试用例其实就是一个单元的最早用户。容易使用显然意味着良好的设计,并且单元测试应该是非常快的,在极短的时间内可以跑完几百甚至上千条单元测试。

5.TDD与BDD

TDD

说到单元测试就不得不想到TDD。
TDD即测试驱动开发(Test-Driven Development),是敏捷开发中的一项核心实践和技术,也是一种设计方法论。我们在软件开发之前,每个程序单元的功能都已经确定了。程序员在理解完整个程序需求以后,直接进行开发,有可能会因为种种原因考虑不很周全,似乎功能实现的没有问题了,但是其中却可能隐藏着非常可怕的Bug。TDD促使开发人员先根据程序单元的功能编写测试代码,就像是先建一个模型,然后向里面浇注合适功能的代码。最后满足所有的测试验证了,才能正常通过测试,这个程序单元才算完成。基于这个流程你可以写出具有极高测试覆盖率(通常接近90%)的代码。TDD还可以减少测试中发现比较难以定位的BUG的可能性,通过测试推动整个开发过程。

TDD的流程:
在这里插入图片描述
refactor阶段属于编写tdd单元测试阶段,此时我们的代码肯定是调不通的,因为业务代码都没有完成,所以延伸到red阶段,此时再编写我们的业务代码,过渡到green阶段通过,以此循环完成开发工作。

那么什么情况下使用TDD:

  1. 项目需求明确。项目需求不明确,tdd开发就毫无意义。
  2. 内部模块依赖性强的项目不适合,在拆分接口和写测试代码工总量大。

BDD

说到tdd,很多人会想到bdd,在这里也了解和区分一下。
BDD,行为驱动开发(Behavior Driven Development),更注重行为,用自然语言描述需求和逻辑。TDD解决的是代码级的验证,但是测试代码与需求的符合问题解决得不是很好,非技术人员、客户看不懂代码,无法评审测试是否符合需求。所以引出了BDD,将自然语言按照一些简单语法组织起来,代码将会非常容易解释与处理。BDD的描述采用了更加’繁琐’的描述风格,阅读BDD的测试用例就像是阅读一篇文档。它的理念是使用自然语言来描述功能,而且强调的是使用例子来说明需求功能。简单来说就是,TDD就是像是我点击了这个按钮,我触发什么事件去执行。BDD就是说,我点击这个按钮我要展现出什么效果来。BDD帮助开发人员设计(design)软件,TDD帮助开发人员测试(test)软件。

BDD的流程:
先写BDD描述-单元测试-代码-通过BDD的方案

看到这里可能还有点懵,下面上个代码就简单明了,以下是BDD举例
在这里插入图片描述
在这里插入图片描述
从上面的代码中可以看出来,bdd编写起来其实很复杂,要写很多描述性的语言,GIVEN语句描述了场景,WHEN语句描述触发了什么动作或者事件,THEN语句描述一种期望的结果。BDD也有很多专用的框架来编写,在此不作说明。
在这里插入图片描述
可以看出来,TDD和BDD其实做的就不是同一件事,自然区别非常大,只是名字比较像。

6.什么是MOCK,MOCK有什么好处

mock就是在测试过程中,对于不容易构造的对象,或者不容易获取的对象,用一个虚拟对象来创建方便用于测试。

mock的好处:

  1. 团队可以更好地并发工作
    并发?没错,技术人员就应该用并发这个词。使用mock,各团队之间可以不需要再互相等待对方的进度,只需要约定好相互之间的数据规范(文档),即可使用mock构建一个可用的接口,可以更快的进行开发和调试以及自测,提升开发进度的同时,也将发现缺陷的时间点大大提前。
  2. 开启TDD(Test-Driven Development)模式
    单元测试是TDD的常规操作,试想一下,当你测试过程中,某些协同模块没有完成,如何进行测试?这时mock就能很好的帮助你解决这个问题。当接口定义好后,测试人员就可以创建一个mock,把接口添加到自动化测试环境,提前创建测试。
  3. 测试覆盖率
    比如一个接口在各种不同的状态下要返回不同的值,我们的传统的做法是复现这种状态然后再去请求接口,这是非常不科学的做法,而且这种复现方法很大可能性因为操作的时机或者操作方式不当导致失败,甚至污染之前数据库中的数据。如果我们使用mock,就完全不用担心这些问题。
  4. 方便演示
    通过使用mock模拟数据接口,我们即可在只开发了UI的情况下,无须服务端的开发就可以进行产品的演示。和3有异曲同工之妙。
  5. 隔离系统
    在使用某些接口的时候,为了避免系统中数据库被污染,我们可以将这些接口调整为mock的模式,以此保证数据库的干净。

7.mockito的使用

目前Mock衍生了几种框架,都有各自的有优点,用的最多的应该是Mockito,比较好上手。在这里插入图片描述

Mocktio的使用,我曾经编写过,跳转链接:Mockito+Junit使用

猜你喜欢

转载自blog.csdn.net/weixin_43909848/article/details/114267291