从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

简介: 从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

image.png

Vitest 是个高性能的前端单元测试框架,它的用法其实和 Jest 差不多,但是它的性能要优于 Jest 不少,还提供了很好的 ESM 支持,同时对于使用 vite 作为构建工具的项目来说有一个好处就是可以公用同一个配置文件vite.config.js。因此本项目将会使用 Vitest 作为测试框架。


安装



因为我们测试的前端组件库是运行在浏览器上的,所以我们需要额外安装happy-dom,同时我们还需要安装展示测试覆盖率工具c8

pnpm add vitest happy-dom c8 -D -w


配置



上面提到过,Vitest 的配置可以直接在vite.config.ts中配置,所以我们来到components/vite.config.ts中对 Vitest 做一个相关配置(三斜线命令告诉编译器在编译过程中要引入的额外的文件)

/// <reference types="vitest" />
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue"
...
export default defineConfig(
    {
        ...
        test: {
            environment: "happy-dom"
        },
    }
)

然后我们在package.json中增加两个命令vitestvitest run --coverage,分别是进行单元测试和查看单元测试覆盖情况

"scripts": {
    "test": "vitest",
    "coverage": "vitest run --coverage"
  }

此时我们便可以使用 Vitest 进行测试了,在执行test命令时,Vitest 会执行**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}的文件,这里我们的测试文件统一命名为**/*.{test}.ts的形式并放在每个组件的__tests__目录下

比如在 button 目录下新建__tests__/button.test.ts目录,然后写一个简单的测试代码看一下效果如何

import { describe, expect, it } from 'vitest';
describe('helloeasyest', () => {
  it('should be helloeasyest', () => {
    expect('hello' + 'easyest').toBe('helloeasyest');
  });
});

然后在components目录下执行pnpm run test就可以看到我们的测试通过了

image.png

然后执行pnpm run coverage可以看到我们测试覆盖情况

image.png

其中它们每个字段代表的含义如下

  • %stmts 是语句覆盖率(statement coverage):是不是每个语句都执行了?
  • %Branch 分支覆盖率(branch coverage):是不是每个 if 代码块都执行了?
  • %Funcs 函数覆盖率(function coverage):是不是每个函数都调用了?
  • %Lines 行覆盖率(line coverage):是不是每一行都执行了?


如何测试组件?



上面我们只是简单测试了一个字符串相加,但是我们需要测试的是组件库,那么如何测试我们的组件是否复合要求呢?

因为我们项目是 vue 组件库,因此我们可以安装 Vue 推荐的测试库@vue/test-utils

pnpm add @vue/test-utils -D -w

然后我们修改一下button.test.ts,我们来测试一下 Button 组件的 slot

import { describe, expect, it } from 'vitest';
import { mount } from '@vue/test-utils';
import button from '../button.vue';
// The component to test
describe('test button', () => {
  it('should render slot', () => {
    const wrapper = mount(button, {
      slots: {
        default: 'easyest'
      }
    });
    // Assert the rendered text of the component
    expect(wrapper.text()).toContain('easyest');
  });
});

@vue/test-utils提供了一个mount方法,我们可以传入不同参数来测试组件是否复合我们的预期,比如上面测试代码的含义是:传入 button 组件,并将其默认 slot 设置为easyest,我们期望页面加载的时候文本会展示easyest,很显然我们的 button 组件是有这个功能的,所以我们执行pnpm run test的时候这条测试就通过了

image.png

如果我们想测试 Button 组件传入 type 展示某个样式的时候可以这样写

import { describe, expect, it } from 'vitest';
import { mount } from '@vue/test-utils';
import button from '../button.vue';
// The component to test
describe('test button', () => {
  it('should render slot', () => {
    const wrapper = mount(button, {
      slots: {
        default: 'easyest'
      }
    });
    // Assert the rendered text of the component
    expect(wrapper.text()).toContain('easyest');
  });
  it('should have class', () => {
    const wrapper = mount(button, {
      props: {
        type: 'primary'
      }
    });
    expect(wrapper.classes()).toContain('ea-button--primary');
  });
});

这条测试的含义是:当我们传入的type为primary的时候,期望组件的类名为ea-button--primary,很显然这条也是可以通过的,同时这时候你会发现我们刚刚启动的测试自己自动更新了,说明Vitest是具有热更新功能的

image.png

关于@vue/test-utils更多功能感兴趣的可以点击@vue/test-utils查看官方文档

ok,关于Vitest的引入就介绍到这里了,如果你对搭建Vue组件库感兴趣的话可以关注专栏Vite+TypeScript从零搭建Vue3组件库


相关文章
|
1天前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
11 5
|
1天前
|
敏捷开发 测试技术 持续交付
探索自动化测试框架的演进与实践
【7月更文挑战第14天】自动化测试框架在软件开发生命周期中扮演着越来越重要的角色。本文旨在探讨自动化测试框架从简单的脚本到复杂的系统级解决方案的演变过程,并分析其在不同阶段解决的关键问题。通过案例研究,我们将深入了解如何选择合适的自动化测试工具以及设计有效的测试策略,以提升软件质量保障的效率和效果。
|
4天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
23 6
|
2天前
|
敏捷开发 存储 数据管理
自动化测试框架设计:从理论到实践
【7月更文挑战第13天】本文将深入探讨自动化测试框架的设计原理与实现方法。通过分析自动化测试的必要性和框架设计的基本原则,结合具体案例,展示如何从零开始构建一个高效、可维护的自动化测试系统。文章不仅涵盖框架的结构设计,还包括最佳实践和常见问题的解决策略,为读者提供一套完整的解决方案和实操指南。
|
1天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
11 2
|
3天前
|
前端开发
【vue3】前端实现 生成条形码并调用打印机打印
【vue3】前端实现 生成条形码并调用打印机打印
10 1
|
4天前
|
敏捷开发 Devops 测试技术
自动化测试框架的演进与实践
【7月更文挑战第11天】在软件开发的历程中,自动化测试始终扮演着不可或缺的角色。本文将通过探讨自动化测试框架的发展脉络,揭示其在现代软件工程中的应用与挑战。从早期的线性脚本到今日的模块化框架,我们将一窥自动化测试技术的演进之路,并分享实践中的经验和策略,旨在为读者提供一套实用的自动化测试解决方案。
4 1
|
3天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
【7月更文挑战第11天】页面对象模型(POM)通过Page Factory在Java Selenium测试中被应用,简化了代码维护。在POM中,每个网页对应一个Page Class,其中包含页面元素和相关操作。对比之下,非POM实现直接在测试脚本中处理元素定位和交互,代码可读性和可维护性较低。
|
3天前
|
JavaScript 前端开发 数据安全/隐私保护
【vue】 前端vue2 全局水印效果
【vue】 前端vue2 全局水印效果
6 0
|
3天前
|
JavaScript 前端开发 数据安全/隐私保护
vue 前端 邮箱、密码、手机号码等输入验证规则
vue 前端 邮箱、密码、手机号码等输入验证规则
12 0