浅谈前端单元测试

6/28/2019 单元测试

# 一、单元测试的介绍

  • 测什么:单元测试就是测试最小单元,我们的单元可能是一个函数,一个button的样式,一个文案等等都可能是一个单元。我们在做需求的时候没有必要将所有的单元都做测试,那可能测试代码要比需求代码多得多呢。
  • 怎么测:我们在做需求之前需要提前想好我们的测试用例,并针对测试用例编写测试代码,然后写需求代码。
  • 为什么测:随着每个工程的复杂化、代码的高复用性要求和前端代码模块之间的高内聚低耦合的需求,前端工程中的单元测试流程就显得很有其必要。

# 二、单元测试的目的

  1. 易于维护和重构
    互联网行业产品迭代速度很快,迭代后必然存在代码重构的过程,那怎么才能保证重构后代码的质量呢?有测试用例做后盾,就可以大胆的进行重构。
  2. 验证代码正确性
    测试可以验证代码的正确性,在上线前做到心里有底。
  3. 实现测试自动化
    当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证。通过编写测试用例,可以做到一次编写,多次运行。
  4. 解释测试接口的使用
    测试用例用于测试接口、模块的重要性,那么在测试用例中就会涉及如何使用这些API。其他开发人员如果要使用这些API,那阅读测试用例是一种很好地途径,有时比文档说明更清晰。
  5. 驱动开发,指导设计
    代码被测试的前提是代码本身的可测试性,那么要保证代码的可测试性,就需要在开发中注意API的设计,TDD将测试前移就是起到这么一个作用。

# 三、单元测试的原则

  • 测试代码时,只考虑测试,不考虑内部实现
  • 数据尽量模拟现实,越靠近现实越好
  • 充分考虑数据的边界条件
  • 对重点、复杂、核心代码,重点测试
  • 利用AOP(beforeEach、afterEach),减少测试代码数量,避免无用功能
  • 测试、功能开发相结合,有利于设计和代码重构

# 四、两个常用的单元测试方法论

在单元测试中,常用的方法论有两个:TDD(测试驱动开发)&BDD(行为驱动开发)

# TDD(测试驱动开发)

  • 其基本思路是通过测试来推动整个开发的进行。
  • 单元测试的首要目的不是为了能够编写出大覆盖率的全部通过的测试代码,而是需要从使用者(调用者)的角度出发,尝试函数逻辑的各种可能性,进而辅助性增强代码质量。
  • 测试是手段而不是目的。测试的主要目的不是证明代码正确,而是帮助发现错误,包括低级的错误。测试要快。快速运行、快速编写。测试代码要保持简洁。
  • 一定不能误解了TDD的核心目的!测试不是为了覆盖率和正确率,而是作为实例,告诉开发人员要编写什么代码。
  • TDD的原理
    测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
  • TDD的原则
    • 独立测试:不同代码的测试应该相互独立,一个类对应一个测试类,一个函数对应一个测试函数。用例也应各自独立,每个用例不能使用其他用例的结果数据,结果也不能依赖于用例执行顺序。
    • 一个角色:开发过程包含多种工作,如:编写测试代码、编写产品代码、代码重构等。做不同的工作时,应专注于当前的角色,不要过多考虑其他方面的细节。
    • 测试列表:代码的功能点可能很多,并且需求可能是陆续出现的,任何阶段想添加功能时,应把相关功能点加到测试列表中,然后才能继续手头工作,避免疏漏。
    • 测试驱动:即利用测试来驱动开发,是TDD的核心。要实现某个功能,要编写某个类或某个函数,应首先编写测试代码,明确这个类、这个函数如何使用,如何测试,然后在对其进行设计、编码。
    • 可测试性:产品代码设计、开发时的应尽可能提高可测试性。每个代码单元的功能应该比较单纯,“各家自扫门前雪”,每个类、每个函数应该只做它该做的事,不要弄成大杂烩。尤其是增加新功能时,不要为了图一时之便,随便在原有代码中添加功能。
    • 先写断言:编写测试代码时,应该首先编写判断代码功能的断言语句,然后编写必要的辅助语句。
    • 及时重构:对结构不合理,重复等“味道”不好的代码,在测试通过后,应及时进行重构。 -小步前进:软件开发是复杂性非常高的工作,小步前进是降低复杂性的好办法。
  • TDD的过程
    测试驱动开发的基本过程如下:
    • 明确当前要完成的功能。可以记录成一个 TODO 列表。
    • 快速完成针对此功能的测试用例编写。
    • 测试代码编译不通过。
    • 编写对应的功能代码。
    • 测试通过。
    • 对代码进行重构,并保证测试通过。
    • 循环完成所有功能的开发。

# BDD(行为驱动开发)

  • BDD的重点
    BDD的重点是通过与利益相关者(简单说就是客户)的讨论,取得对预期的软件行为的认识,其重点在于沟通
  • BDD的过程
    • 从业务的角度定义具体的,以及可衡量的目标,找到一种可以达到设定目标的、对业务最重要的那些功能的方法。
    • 然后像故事一样描述出一个个具体可执行的行为。其描述方法基于一些通用词汇,这些词汇具有准确无误的表达能力和一致的含义。例如,expect, should, assert
    • 寻找合适语言及方法,对行为进行实现。
    • 测试人员检验产品运行结果是否符合预期行为。最大程度的交付出符合用户期望的产品,避免表达不一致带来的问题。

# 参考文章

聊聊前端单元测试 (opens new window)
浅谈前端单元测试 (opens new window)

Last Updated: 8/10/2021, 2:12:13 PM
我再没见过 像你一般的星空
Seto