Vue组件测试测什么

原文:https://laylawang17.github.io/2020/03/19/Vue%E7%BB%84%E4%BB%B6%E6%B5%8B%E8%AF%95%E6%B5%8B%E4%BB%80%E4%B9%88/

学习了一段时间 Vue 组件单元测试相关知识,感觉比起用什么测试框架、怎么写测试更重要的是搞明白组件测试应该测什么,这里就总结一下自己的一些思考。

组件测试不应该测什么

  1. 单纯测试组件模板中的 HTML

    比如,测试组件模板中有几个 divinputbutton,以及元素的 classid 属性等与业务逻辑无关的纯 UI 测试。这里并非说我们不需要关注组件的 UI,而是出于以下几个考量:

    • 使用单元测试测试组件的 UI 会导致测试非常繁琐,为了测试覆盖的全面会导致针对一个组件写出大量的测试,不但降低了开发效率还体验非常差
    • 这种单纯的 UI 测试是非常脆弱的,这类测试和组件模板是强耦合的,一旦我们对 HTML 结构进行调整,测试就会挂掉,这就造成了测试非常难以维护。而实际上我们往往并不关心组件模板中的具体 HTML 结构是怎样的,我们只关心组件呈现出来的样子
    • 像 Jest 等前端测试框架已经提供了快照测试来帮助我们对比修改引起的 UI 变化,并且我们也可以使用Storybook这类工具实现可视化的 UI 测试
  2. 测试组件的内部方法

    如果一些方法只是在组件内部调用其他方法而没有任何暴露给外部的行为(比如更改了组件的 UI、请求外部 API 等),那这些方法是不需要测试的。我们希望一个组件就像一个黑盒一样,我们不关心其内部的处理逻辑而只关注其外部呈现。

    You should test your component's public interface and side effects.

组件测试应该测什么

这里以 Vue 组件来总结一下组件测试需要测什么。

  1. 测试组件是一个 Vue 实例

    test("is a Vue instance", () => {
      const wrapper = shallowMount(MyComponent);
      expect(wrapper.isVueInstance()).toBeTruthy();
    });
    

    这个测试应该置于该组件所有其他单元测试之前,以保证该组件能够正常挂载

  2. 测试组件实例的数据

    由于组件的渲染是依赖propsdata以及计算属性computed的,因此需要针对这些数据进行测试,如

    • 给定 props下,初始的 data是否正确
    • 给定 propsdata后,计算属性的值是否正确
    • 在父组件中测试 props是否正确传递给子组件
  3. 测试组件实例的渲染结果

    同样因为组件的渲染依赖propsdatacomputed这些数据,因此需要 mock 这些数据来测试不同数据作用下的渲染结果是否符合预期,如

    • 测试本文内容是否与数据一致

    • 测试条件渲染的结果

      元素或子组件的存在性是否随数据的变化而变化

    • 测试循环渲染的结果

      元素或子组件的数量是否与数据一致

  4. 测试组件实例的事件

    用户与 UI 的交互是通过事件完成的,因此需要针对事件进行测试,如

    • 触发clickinput等事件后组件上的自定义事件是否被触发

      比如 Todo List App 的add-todo等一系列自定义事件能否被触发

    • 触发事件后对应的处理方法是否被调用,以及是否使用预期的参数调用

      需要注意的是,这里主要测试的是一些对外的方法,比如调用 API 等

    • 触发事件后data是否按预期更新

    • 触发事件后组件是否按预期渲染

      如果已经有测试用例测试过事件能更新data、且组件能根据data渲染,则无需再测试组件能根据事件渲染

使用 Vuex 管理数据的组件应该怎么测

使用 Vuex 管理数据流后,我们需要额外针对gettersmutationsactions等进行测试,以保证组件的数据和行为是符合我们预期的。针对 Vuex 的测试有两个要点:

  • 由于gettersmutationsactions实际上都是普通的函数,因此我们可以通过测试这些函数在给定输入下是否有预期输出来保证它们的正确性

  • 结合Vuex 的作用原理,我们可以按照 Vuex 中数据的流向设计测试用例

    一个由 Vuex 管理数据流的 App 大致是按照如下的方式工作的:

    1. 用户与 UI 交互触发事件
    2. 事件的监听函数 dispatch 相应的action
    3. action提交包含类型和数据的mutation
    4. mutation负责处理具体的业务逻辑,更新 App 的state
    5. getters进而会根据state重新计算
    6. 组件监听到state的变化而重新渲染

在理解上述要点的情况下,我们可以总结出针对 Vuex 的一些测试方法:

  1. 模拟事件的触发,测试是否 dispatch 相应的action
  2. mock 掉commit方法,测试action函数是否能使用正确的参数 commitmutation
  3. 测试给定参数下,mutations能否正确修改state
  4. 测试给定state时,getters的计算结果是否正确
  5. 给定 stategetters下,测试组件接收到的props是否正确
  6. 给定props下组件能否正确渲染

怎么使用快照测试

上述总结的单元测试方法主要测试的是组件的行为是否与预期相符,为了更全面的测试组件 UI,我们可以使用快照测试。

快照测试带来的好处是可以清晰的对比出 UI 的变化,让开发人员确认是必要的改变还是引入的 bug,避免了为测试 UI 导致单元测试过于陷入细节和脆弱。

需要注意的是,快照测试是不能够替代单元测试的,因为它只是对 UI 历史版本的记录,无法用于描述所期望的 App 的行为,因而不能够像传统的单元测试一样做为所开发的 App 的“使用文档”,它应该和单元测试一起互为补充。

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容