广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >前端Vue单元测试入门教程
  • 337
分享到

前端Vue单元测试入门教程

2024-04-02 19:04:59 337人浏览 安东尼
摘要

目录一、为什么需要单元测试 二、如何写单元测试 三、测试工具 四、Jest入门 安装 简单示例 Jest Cli 使用配置文件 使用 Babel Vue-cli 中使用 Jest 常

一、为什么需要单元测试

单元测试是用来测试项目中的一个模块的功能,如函数、类、组件等。单元测试的作用有以下:

  • 正确性:可以验证代码的正确性,为上线前做更详细的准备;
  • 自动化:测试用例可以整合到代码版本管理中,自动执行单元测试,避免每次手工操作;
  • 解释性:能够为其他开发人员提供被测模块的文档参考,阅读测试用例可能比文档更完善;
  • 驱动开发、指导设计:提前写好的单元测试能够指导开发的api设计,也能够提前发现设计中的问题;
  • 保证重构:测试用例可以多次验证,当需要回归测试时能够节省大量时间。

二、如何写单元测试

测试原则

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

编写步骤

  • 准备阶段:构造参数,创建 spy 等
  • 执行阶段:用构造好的参数执行被测试代码
  • 断言阶段:用实际得到的结果与期望的结果比较,以判断该测试是否正常
  • 清理阶段:清理准备阶段对外部环境的影响,移除在准备阶段创建的 spy 等

三、测试工具

单元测试的工具可分为三类:

  • 测试运行器(Test Runner):可以模拟各种浏览器环境,自定义配置测试框架和断言库等,如Karma.
  • 测试框架:提供单元测试的功能模块,常见的框架有Jest, mocha, Jasmine, QUnit.
  • 工具库:assert, should.js, expect.js, chai.js等断言库,enzyme渲染库,Istanbul覆盖率计算。

这里,我们将使用 Jest 作为例子。Jest 功能全面,集成了各种工具,且配置简单,甚至零配置直接使用。

四、Jest入门

Jest 官网的描述是这样的:

Jest is a delightful javascript Testing Framework with a focus on simplicity.

安装


yarn add --dev jest
# or
# npm install -D jest

简单示例

从官网提供的示例开始,测试一个函数,这个函数完成两个数字的相加,创建一个 sum.js 文件︰


function sum(a, b) {
  return a + b;
}
module.exports = sum;

然后,创建 sum.test.js 文件︰


const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

package.JSON 里增加一个测试任务:
{
  "scripts": {
    "test": "jest"
  }
}

最后,运行 yarn test 或 npm run test ,Jest将打印下面这个消息:

PASS  ./sum.test.js
✓ adds 1 + 2 to equal 3 (5ms)

至此,完成了一个基本的单元测试。

注意:Jest 通过用 JSDOM 在 node 虚拟浏览器环境模拟真实浏览器,由于是用 js 模拟 DOM, 所以 Jest 无法测试样式 。Jest 测试运行器自动设置了 JSDOM。

Jest Cli

你可以通过命令行直接运行Jest(前提是jest已经加到环境变量PATH中,例如通过 yarn global add jest 或 npm install jest --global 安装的 Jest) ,并为其指定各种有用的配置项。如:


jest my-test --notify --config=config.json

Jest 命令有以下常见参数:

  • --coverage 表示输出单元测试覆盖率,覆盖率文件默认在 tests/unit/coverage/lcov-report/index.html;
  • --watch 监听模式,与测试用例相关的文件更改时都会重新触发单元测试。

更多选项查看Jest CLI Options.

使用配置文件

使用 jest 命令可生成一个配置文件:


jest --init

过程中会有几个选项供你选择:

√ Would you like to use typescript for the configuration file? ... no
√ Choose the test environment that will be used for testing » jsdom (browser-like)
√ Do you want Jest to add coverage reports? ... yes
√ Which provider should be used to instrument code for coverage? » babel
√ Automatically clear mock calls and instances between every test? ... yes

配置文件示例(不是基于上述选择):


// jest.config.js
const path = require('path')

module.exports = {
    preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',
    rootDir: path.resolve(__dirname, './'),
    coverageDirectory: '<rootDir>/tests/unit/coverage',
    collectCoverageFrom: [
        'src*.{js,ts,vue}',
        'src/services*.spec.(js|jsx|ts|tsx)|**/__tests__

然后你可以基于这些数据来设置断言:


// 断言事件已经被触发
expect(wrapper.emitted().foo).toBeTruthy()

// 断言事件的数量
expect(wrapper.emitted().foo.length).toBe(2)

// 断言事件的有效数据
expect(wrapper.emitted().foo[1]).toEqual([123])

还可以触发子组件的事件:


import { mount } from '@vue/test-utils'
import ParentComponent from '@/components/ParentComponent'
import ChildComponent from '@/components/ChildComponent'

describe('ParentComponent', () => {
  test("displays 'Emitted!' when custom event is emitted", () => {
    const wrapper = mount(ParentComponent)
    wrapper.find(ChildComponent).vm.$emit('custom')
    expect(wrapper.html()).toContain('Emitted!')
  })
})

组件的data

可以使用 setData() 或 setProps 设置组件的状态数据:


it('manipulates state', async () => {
  await wrapper.setData({ count: 10 })

  await wrapper.setProps({ foo: 'bar' })
})

模拟vue实例方法

由于Vue Test Utils 的 setMethods() 即将废弃,推荐使用 jest.spyOn() 方法来模拟Vue实例方法:


import MyComponent from '@/components/MyComponent.vue'

describe('MyComponent', () => {
  it('click does something', async () => {
    const mockMethod = jest.spyOn(MyComponent.methods, 'doSomething')
    await shallowMount(MyComponent).find('button').trigger('click')
    expect(mockMethod).toHaveBeenCalled()
  })
})

全局插件

如果你需要安装所有 test 都使用的全局插件,可以使用 setupFiles,先在 jest.config.js 中指定 setup 文件:


// jest.config.js
module.exports = {
    setupFiles: ['<rootDir>/tests/unit/setup.js']
}

然后在 setup.js 使用:


// setup.js
import Vue from 'vue'

// 以下全局注册的插件在jest中不生效,必须使用localVue
import ElementUI from 'element-ui'
import VueClipboard from 'vue-clipboard2'

Vue.use(ElementUI)
Vue.use(VueClipboard)

Vue.config.productionTip = false

当你只是想在某些 test 中安装全局插件时,可以使用 localVue,这会创建一个临时的Vue实例:


import { createLocalVue, mount } from '@vue/test-utils'

// 创建一个扩展的 `Vue` 构造函数
const localVue = createLocalVue()

// 正常安装插件
localVue.use(MyPlugin)

// 在挂载选项中传入 `localVue`
mount(Component, {
  localVue
})

测试watch

假如我们有一个这样的watcher:


watch: {
  inputValue(newVal, oldVal) {
    if (newVal.trim().length && newVal !== oldVal) {
      console.log(newVal)
    }
  }
}

由于watch的调用是异步的,并且在下一个tick才会调用,因此可以通过检测watcher里的方法是否被调用来检测watch是否生效,使用 jest.spyOn() 方法:


describe('FORM.test.js', () => {
  let cmp
  ...

  describe('Watchers - inputValue', () => {
    let spy

    beforeAll(() => {
      spy = jest.spyOn(console, 'log')
    })

    afterEach(() => {
      spy.mockClear()
    })

    it('is not called if value is empty (trimmed)', () => {
    })

    it('is not called if values are the same', () => {
    })

    it('is called with the new value in other cases', () => {
    })
  })
})

it("is called with the new value in other cases", done => {
  cmp.vm.inputValue = "foo";
  cmp.vm.$nextTick(() => {
    expect(spy).toBeCalled();
    done();
  });
});

第三方插件

当我们使用一些第三方插件的时候,一般不需要关心其内部的实现,不需要测试其组件,可以使用 shallowMount 代替 mount, 减少不必要的渲染:


import { shallowMount } from '@vue/test-utils'

const wrapper = shallowMount(Component)
wrapper.vm // 挂载的 Vue 实例

还可以通过 findAllComponents 来查找第三方组件:
import { Select } from 'element-ui'
test('选中总部时不显示分部和网点', async () => {
    await wrapper.setProps({
        value: {
            clusterType: 'head-quarter-sit',
            branch: '',
            site: ''
        }
    })
    // 总部不显示分部和网点
    expect(wrapper.findAllComponents(Select)).toHaveLength(1)
})

六、总结

单元测试理论

  • 单元测试能够持续验证代码的正确性、驱动开发,并起到一定的文档作用;
  • 测试时数据尽量模拟现实,只考虑测试,不考虑内部代码;
  • 测试时充分考虑数据的边界条件
  • 对重点、复杂、核心代码,重点测试
  • 编写单元测试有以下阶段:准备阶段、执行阶段、断言阶段、清理阶段;
  • 单元测试的工具可分为三类:测试运行器(Test Runner)、测试框架、工具库。

Jest

  • --watch 选项可以监听文件的编码,自动执行单元测试;
  • 测试异步代码可以用 done 方法或 aync 函数;
  • mock函数可以捕获这个函数的调用、this、返回值等,测试回调函数时非常有用。

Vue Test Utils

  • 用 mount 方法挂载组件,并可自定义各种vue属性;
  • shallowMount 方法不渲染子组件,从而加快测试速度;
  • setupFiles 可以设置全局环境,如安装 element-ui;
  • createLocalVue 可在创建单独的vue实例,与全局的隔离;

到此这篇关于前端Vue单元测试入门教程的文章就介绍到这了,更多相关Vue单元测试内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 前端Vue单元测试入门教程

本文链接: https://www.lsjlt.com/news/160374.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 前端Vue单元测试入门教程
    目录一、为什么需要单元测试 二、如何写单元测试 三、测试工具 四、Jest入门 安装 简单示例 Jest Cli 使用配置文件 使用 Babel vue-cli 中使用 Jest 常...
    99+
    2022-11-12
  • 前端单元测试之UI测试功能性代码测试教程
    目录前言UI测试:功能性代码测试:让人闻风丧胆的单元测试代码测试代码Jest介绍一、基础教程安装源码开发测试用例编写开始测试二、核心API全局方法匹配器异步代码测试回调Promise...
    99+
    2022-11-13
    前端单元测试 前端UI测试 前端功能性代码测试
  • Android Studio单元测试入门
      通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程跑一下ap...
    99+
    2022-06-06
    Android Studio studio 测试 Android
  • 前端Vue单元测试知识点有哪些
    本篇内容介绍了“前端Vue单元测试知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、为什么需要单元测试单元测试是用来测试项目中的...
    99+
    2023-06-22
  • SpringBoot中Mockito单元测试入门
    目录Mock 测试What's Mockito使用 Mockitopom依赖Demo Code【常规操作】【Mockito】Mock 测试 Mock 测试就是在测试过程中,创建一个假...
    99+
    2022-11-12
  • JUnit单元测试入门必看篇
    什么是单元测试写了个类,要给别人用,会不会有bug?怎么办?测试一下。用main方法测试好不好?不好!不能一起运行!大多数情况下需要人为的观察输出确定是否正确为什么要进行单元测试重用测试,应付将来的实现的变化。提高士气,明确知道我的东西是没...
    99+
    2023-05-30
    junit 单元测试
  • 前端自动化测试Vue中TDD和单元测试示例详解
    目录1、简单用例入门2、快照测试3、覆盖率测试4、结合 Vuex 进行测试1、简单用例入门 Vue 提供了 @vue/test-utils 来帮助我们进行单元测试,创建 Vue 项...
    99+
    2023-02-14
    Vue TDD单元测试 Vue 前端自动化测试
  • NodeJS测试框架mocha入门教程
    NodeJS里最常用的测试框架估计就是mocha了。它支持多种node的assert libs, 同时支持异步和同步的测试,同时支持多种方式导出结果,也支持直接在browser上跑Javascript代码测...
    99+
    2022-06-04
    框架 入门教程 测试
  • web前端视频教程?自学前端,怎样入门?
      学习前端,要从学习HTML和CSS开始着手。关于这部分的学习,网上可选择的资料就太多了,这里不一一列举,题主百度搜索栏搜索 HTML 教程,或者css 教程,就可找到相关资料。  接着是学习前端的一个难点、也是重点,就是JavaScri...
    99+
    2023-06-05
  • 前端开发TypeScript入门基础教程
    TYPESCRIPT 官网 github TypeScript是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集,最终会被编译为JavaScript代码。 可...
    99+
    2022-11-13
  • H5前端性能实例测试教程
    本篇内容主要讲解“H5前端性能实例测试教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“H5前端性能实例测试教程”吧!一、开篇:H5 页面加载过程浅析如下图所示...
    99+
    2022-10-19
  • Spring Boot 单元测试,保姆级教程!
    一、 单元测试的概念 概念: 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类。 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。...
    99+
    2023-10-18
    java spring spring boot
  • Go语言单元测试基础从入门到放弃
    目录Go语言测试go test工具单元测试函数格式单元测试示例go test -vgo test -run回归测试跳过某些测试用例子测试表格驱动测试介绍示例并行测试使用工具生成测试代...
    99+
    2022-11-13
  • Python学习教程:前后端分离开发入门
    今天的Python学习教程跟大家讲讲关于:前后端分离开发入门的相关内容!在传统的Web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有...
    99+
    2023-06-02
  • 全网最全最细的jmeter接口测试教程以及接口测试流程(入门教程)
    目录一、Jmeter简介二、Jmeter安装三、设置Jmeter语言为中文环境四、Jmeter主要元件五、Jmeter元件的作用域和执行顺序六、Jmeter进行接口测试流程七、Jme...
    99+
    2022-11-12
  • react-router-dom入门使用教程(前端路由原理)
    目录React路由相关理解 SPA的理解 路由的理解 前端路由原理(重点)react-router-dom@5 基本路由使用 一般组件与路由组件 路由API:Switch提高路由匹配...
    99+
    2022-11-13
    react-router-dom react-router-dom入门
  • 前端自动化测试之Jest 进阶教程示例
    目录Jest Mockmock 异步方法Mock TimersMock 类Snapshot 快照测试DOM 测试Jest Mock mock 异步方法 export const r...
    99+
    2023-02-14
    Jest 前端自动化测试 Jest 自动化测试进阶
  • web自动化测试入门篇02——selenium安装教程
      😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信...
    99+
    2023-08-17
    selenium python java 测试工具
  • SpringBoot使用@SpringBootTest注解开发单元测试教程
    目录概述1.添加依赖:2. 编写启动入口类3. 编写Controller类4. 编写service类5. 编写mapper类6. 编写测试类7.测试结果:概述 @SpringBoot...
    99+
    2022-11-12
  • MQ的分类组成优缺点测试点入门教程
    目录一、什么是 MQ二、MQ 的作用1. 流量削峰2. 应用解耦3. 异步处理三、MQ 的缺点四、常见 MQ 分类1. ActiveMQ2. Kafka3. RocketMQ4. R...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作