vue+jest 单元测试配置+用例

这篇具有很好参考价值的文章主要介绍了vue+jest 单元测试配置+用例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录 1

Jest 说明文档 2

1、 搭建node环境包 2

这里安装环境是node 18,npm 9.5.0。 2

Test Runner 2

2、 安装jest 3

Jest安装步骤 4

项目的根目录下创建一个.babelrc 配置文件: 4

在项目的根目录下创建 jest.config.js 4

3、 全局设定 5

预处理和后处理 5

方法 6

4、 断言 6

真假断言 6

数字断言 7

字符串断言toMatch 8

数组& 迭代器断言toContain 8

异常断言toThrow 8

快照测试 9

5、 Jest 使用指南 - - Mock 篇 9

Jest Mock 9

jest.fn() 9

jest.spyOn() 9

总结 10

6、 Vue/test-utils API使用说明 10

Jest 说明文档

  1. 搭建node环境包

这里安装环境是node 18,npm 9.5.0。

Node.js 刚刚发布了 18.0.0 版本,内置了 fetch 和 node:test 等标准模块。

Test Runner

单元测试,内置对应的能力,Node.js 在 18.x 里官方支持了 Test 能力,

import test from 'node:test';
import assert from 'assert/strict';
 
// 等价于 describe()
test('asynchronous passing test', async () => {
  const res = await fetch('https://nodejs.org/api/documentation.json');
  assert(res.ok);//断言
});
 
test('multi level test', async (t) => {
  // 等价于 it()
  await t.test('subtest 1', (t) => {
    assert.strictEqual(1, 1);
  });
 
  await t.test('subtest 2', (t) => {
    assert.strictEqual(2, 2);
  });
});
 
// 等价于 describe.skip() / it.skip()
test('skip option', { skip: true }, () => {});
 
// 等价于 describe.only() / it.only()
test('only option', { only: true }, () => {});

可以看到:

语法其实差不多,会更简洁一点,就一个 test(),options 除了 skip 和 only 外,还支持 concurrency 并发。

无需启动器,每一个文件都是一个独立可执行的Node.js 代码。

暂未支持 before/after/beforeEach/afterEach 能力,看 issue 描述会后续支持。

暂未支持Reporter,但日志输出为标准 TAP 格式,所以应该很容易能复用现有的社区生态。

类似覆盖率的演进过程,以前我们需要通过nyc 对代码转译打桩,现在变为 Node.js 内置覆盖率输出,nyc 简化为 c8 这样的覆盖率报告生成工具。

后续Mocha 等估计会变为类似的上层封装,提供批量执行 和 Reporter 等能力。

  1. 安装jest

Jest安装步骤

使用node18+版本,vue-cli默认选择安装jest。

npm install --save-dev jest

npm install --save-dev babel-jest @babel/core @babel/preset-env

·@babel/core:babel核心库

· @babel/preset-env:进行 ES 语法转换的库

· babel-jest:和 Jest 通信的库,用来检测是否安装了上面两个依赖

项目的根目录下创建一个.babelrc 配置文件:

{"presets": [["@babel/preset-env", { "targets": { "node": "current" } }]]}

在项目的根目录下创建 jest.config.js

配置项添加了解释说明,可根据实际项目增加删减

Node 18+ npm9.5.0 自配配置

const path = require('path')
 
module.exports = {
    rootDir: path.resolve(__dirname, '../../'),
    //告诉jest 哪些文件拓展名需要测试
    moduleFileExtensions: [
        'js',
        'json',
        'vue'
    ],
    // 是否显示覆盖率报告
    collectCoverage: false,
    // 这将用于配置覆盖结果的最低阈值强制
    coverageThreshold: {
        global: {
            statements: 90, // 保证每个语句都执行了
            functions: 90, // 保证每个函数都调用了
            branches: 90, // 保证每个 if 等分支代码都执行了
        },
    },
    //从正则表达式到允许根资源的模块名称或模块名称数组的映射
    moduleNameMapper: {
        '^@/(.*)$': '<rootDir>/src/$1'
    },
    //通过一个默认地址给浏览器环境
    testURL: 'http://localhost/',
    //转换/翻译测试问题
    transform: {
        '^.+\\.js$': '<rootDir>/node_modules/babel-jest',
        '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest'
    },
    //快照
    snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'],
    //运行一些代码以配置或设置测试框架的模块的路径列表
    setupFiles: ['<rootDir>/test/unit/setup'],
    //Jest应该输出其覆盖范围文件的目录。
    coverageDirectory: '<rootDir>/test/unit/coverage',
    //匹配需要从中收集覆盖信息的文件
    collectCoverageFrom: [
        'src/**/*.{js,vue}',
        '!src/main.js',
        '!src/router/index.js',
        '!**/node_modules/**'
    ]
}

更详细的jest配置说明地址:

https://zhuanlan.zhihu.com/p/535048414

这里注意transform配置项,需要先安装babel-jest,不然报错。

  1. 全局设定

预处理和后处理

beforeAll(() => { // 在所有测试用例前执行一次});

afterAll(() => { // 在所有测试用例后执行一次});

beforeEach(() => { // 在每个测试用例前执行一次});

afterEach(() => { // 在每个测试用例后执行一次});

方法

describe 将您的测试套件分解为多个组件,可以嵌套使用 describe 块。

it 是您执行单个测试。

test是执行测试,类似it ,是测试的最小单位。

expect:提供很多的matcher 来判定你的方法返回值是否符合特定条件。

describe.only:如果你只想运行一次模块测试的话,可以使用 describe.only。

describe.skip 可以使用skip 跳过某一个测试。

test.only如果你只想运行一次测试的话。

test.skip 来指定一些要跳过的测试。

test.failing:失败的测试将抛出任何错误,如果不抛出,则它将失败。

test.todo :用 test.todo 来表示你计划要写这些测试。

  1. 断言

每次要测试值时都会使用expect函数,使用expect和“matcher”函数来断言某个值。

假设您有一个方法bestLaCroixFlavor(),它应该返回字符串“葡萄柚”。以下是测试方法:

test('the best flavor is grapefruit', () => {

expect(bestLaCroixFlavor()).toBe('grapefruit');

});

这段代码翻译:期望bestLaCroixFlavor()这个函数返回正确的'grapefruit'

toBe是是否精确匹配器函数。期望的参数应该是代码生成的值,匹配器的任何参数都应该是正确的值。

真假断言

在测试中常用API,有时需要区分undefined、null和false,not取反;

toBeNull仅匹配null

toBeUndefined仅匹配未定义

toBeDefined与toBeUndefined相反

toBeTruthy匹配if语句视为真的任何内容

toBeFalsy匹配if语句视为false的任何内容

例子如下:

test('zero', () => {

const z = 0;

expect(z).not.toBeNull();

expect(z).toBeDefined();

expect(z).not.toBeUndefined();

expect(z).not.toBeTruthy();

expect(z).toBeFalsy();

});

数字断言

expect(value)

.toBeCloseTo(number, numDigits) 比较浮点数以获得近似相等。

.toBeGreaterThan(number) 比较数字或大整数值。

.toBeGreaterThanOrEqual(number) 比较数字或大整数值所需的接收值>=。

.toBeLessThan(number) 比较数字或大整数值的接收<预期值。

.toBeLessThanOrEqual(number) 比较数字或大整数值所需的接收<=。

例子如下:

test('two plus two', () => {

const value = 2 + 2;

expect(value).toBeGreaterThan(3);

expect(value).toBeGreaterThanOrEqual(3.5);

expect(value).toBeLessThan(5);

expect(value).toBeLessThanOrEqual(4.5);

// toBe and toEqual are 等同于数字

expect(value).toBe(4);

expect(value).toEqual(4);

});

字符串断言toMatch

.toMatch检查字符串是否与正则表达式匹配

例子如下:

describe('grapefruits are healthy', () => {

test('grapefruits are a fruit', () => {

expect('grapefruits').toMatch('fruit');

});

});

数组& 迭代器断言toContain

如果要检查数组中是否有项,请使用.toContain。对于测试数组中的项,这使用==,一个严格的相等检查。toContain还可以检查一个字符串是否是另一个字符串的子字符串。

例子如下:

const shoppingList = [

'diapers', 'kleenex', 'trash bags', 'paper towels', 'beer',

];

test('the shoppingList list contains beer', () => {

expect(getAllFlavors()).toContain('beer');

});

异常断言toThrow

toThrow测试函数在调用时抛出异常。

例子如下:

test('throws on octopus', () => {

expect(() => {

drinkFlavor('octopus');

}).toThrow();

});

不规则匹配器

expect.anything匹配除null或undefined以外的任何内容

快照测试

toMatchSnapshot() 会为expect 的结果做一个快照并与前面的快照做匹配。(如果前面没有快照那就保存当前生成的快照即可)

执行单元测试后,测试通过,然后Jest会在test/__snapshots__/文件夹下创建一个快照文件****.spec.js.snap

  1. Jest 使用指南 - - Mock 篇

Jest Mock

Mock函数提供的以下三种特性,在我们写测试代码时十分有用:

擦除函数的实际实现(换句话说:改变函数的内部实现)。

捕获函数调用情况( 包括:这些调用中传递的参数、new 的实例)。

设置函数返回值。

jest.fn()

Jest.fn()是创建Mock函数最简单的方式,如果没有定义函数内部的实现,jest.fn()会返回undefined作为返回值。

Jest.fn()所创建的Mock函数还可以设置返回值,定义内部实现或返回Promise对象。

jest.spyOn()

Jest.spyOn()方法同样创建一个mock函数,但是该mock函数不仅能够捕获函数的调用情况,还可以正常的执行被spy的函数。实际上,jest.spyOn()是jest.fn()的语法糖,它创建了一个和被spy的函数具有相同内部代码的mock函数。 如果没有提供实现,调用模拟函数将返回 undefined。

总结

在实际项目的单元测试中,jest.fn()常被用来进行某些有回调函数的测试;jest.mock()可以mock整个模块中的方法,当某个模块已经被单元测试100%覆盖时,使用jest.mock()去mock该模块,节约测试时间和测试的冗余度是十分必要;当需要测试某些必须被完整执行的方法时,常常需要使用jest.spyOn()。

  1. Vue/test-utils API使用说明

mount: 创建一个包含被挂载和渲染的 Vue 组件的 wrapper,它仅仅挂载当前实例。

shallowMount:和 mount 一样,创建一个包含被挂载和渲染的 Vue 组件的 Wrapper,只挂载一个组件而不渲染其子组件 (即保留它们的存根),这个方法可以保证你关心的组件在渲染时没有同时将其子组件渲染,避免了子组件可能带来的副作用(比如Http请求等)

shallowMount和mount的区别:在文档中描述为"不同的是被存根的子组件",大白话就是shallowMount不会加载子组件,不会被子组件的行为属性影响该组件。

Wrapper:常见的有一下几种方法:

Wrapper:Wrapper 是一个包括了一个挂载组件或 vnode,以及测试该组件或 vnode 的方法。

Wrapper.vm:这是该 Vue 实例。你可以通过 wrapper.vm 访问一个实例所有的方法和属性。

Wrapper.classes: 返回是否拥有该class的dom或者类名数组。

Wrapper.find:返回第一个满足条件的dom。

Wrapper.findAll:返回所有满足条件的dom。

Wrapper.html:返回html字符串。

Wrapper.text:返回内容字符串。

Wrapper.setData:设置该组件的初始data数据。

Wrapper.setProps:设置该组件的初始props数据。 (这是使用了,但没有效果)

Wrapper.trigger:用来触发事件。

执行单元测试后,测试通过,然后Jest会在test/__snapshots__/文件夹下创建一个快照文件*****.spec.js.snap

注意:文章来源地址https://www.toymoban.com/news/detail-723479.html

  1. shallow 1.0.0版本已删除,请改用shallowMount 安装

到了这里,关于vue+jest 单元测试配置+用例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (2.2w字)前端单元测试之Jest详解篇

    Jest是一个领先的JavaScript测试框架,特别适用于React和Node.js环境。由Facebook开发,它以简单的配置、高效的性能和易用性而闻名。Jest支持多种类型的测试,包括单元测试、集成测试和快照测试,后者用于捕获组件或数据结构的状态,以便于后续的比较和验证。Jest自动化模拟依

    2024年02月20日
    浏览(45)
  • Jest单元测试Vue项目实践

    ​ 做单元测试的优点: 1.减少bug避免低级错误 2.提高代码运行质量 3.快速定位问题 4.减少调试时间,提高开发效率 5.便于重构 Jest安装: 配置 vueCli内置了一套jest配置预置文件,一般情况下直接引用即可,如有特殊配置可见下文配置释意。 配置项目释意 module.exports = { 相关

    2024年02月12日
    浏览(43)
  • vue-cli 项目集成 Jest 单元测试

    前端单元测试对于保证代码质量和稳定性是非常重要的。 为什么需要单元测试: 检测bug; 提升回归效率; 保证代码质量。  ①、Mocha 比较灵活成熟,但没有内部集成,需要自主选择断言库和监听库。。 ②、Jasmine 是 Jest 的底层库,助攻 BDD(即行为驱动开发)断言库与异步测

    2024年01月17日
    浏览(75)
  • 快速上手 Jest 单元测试框架:使用 Jest Preset 加速配置,灵活应对项目需求

    Jest preset 参数的作用是提供一个预先定义好的配置集合,以便于快速开始使用 Jest 单元测试框架。你可以选择现有的 preset,如 jest-preset-angular 、 create-react-app 或自定义 preset,以根据你的项目需求自动应用一系列配置。 使用示例: 先安装一个现有的 preset,例如 jest-preset-angul

    2024年02月06日
    浏览(36)
  • 记录使用vue-test-utils + jest 在uniapp中进行单元测试

    uniapp推荐了测试方案 @dcloudio/uni-automator ,属于自动化测试,api提供的示例偏重于渲染组件,判断当前渲染的组件是否和预期一致 vue推荐的测试方案 vue test utils ,属于单元测试,可以搭配jest、mocha等单测运行器 我选了方案2🕶️ 关于vue的组件测试,vue官方提到: 你的 Vue 应用

    2024年02月06日
    浏览(46)
  • 前端自动化测试(二)Vue Test Utils + Jest

    项目会从快速迭代走向以维护为主的状态,因此引入自动化测试能有效减少人工维成本 。 自动化的收益 = 迭代次数 * 全手动执行成本 - 首次自动化成本 - 维护次数 * 维护成本 对于自动化测试,相对于发现未知问题,更倾向于避免可能的问题。 (1) 单元测试 单元测试(unit t

    2024年02月08日
    浏览(42)
  • VectorCAST单元测试手动配置测试用例

    一、单元测试 等待环境创建完成后,就可以开始单元测试。 二、生成测试用例 在 VectorCAST 中,一共有两种方法来生成测试用例,一种是手动生成测试用例,另外一种是自动 生成测试用例。 三、手动生成测试用例         在 VectorCAST 中,手动生成测试用例,需要根据函数

    2024年02月12日
    浏览(36)
  • 使用Mock.js和json server快速生成前端测试数据

    下面演示的是我总结的一个使用示例,帮助大家参考学习,看完后,如果大家有其他需求,可以参考Mock.js 的官方文档,需要生成哪些格式的数据,复制样例代码即可,本案例重在演示如何使用Mock.js和json server自动生成前端开发测试用的接口数据。 先创建一个项目文件夹,取

    2023年04月08日
    浏览(43)
  • vue3配置jest自动化测试

    前排提醒,并不是所有的项目都需要单元测试,因为写单元测试真的很耗时间。单元测试主要针对需求变更不多,项目时间充裕的项目。如elementui这种框架类的项目 本文主要针对vue3+vuecli4 这里主要有两种情况:新建项目和老项目 对于新建项目,在通过脚手架生成时可选择

    2024年02月12日
    浏览(46)
  • Jest | 测试框架实战之-测试用例编写与覆盖率解读

    通常写完库的测试用例,总要跑跑覆盖率,看看测试用例写得如何,jest刚好也支持查看覆盖率,对应的指令是:jest --coverage。当然在继续往下看,如果还没搭建jest环境,可以先搭建,毕竟实践出真知。 如何编写测试用例,已经存在很多教程,官方也有非常多例子,因此这里

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包