前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >试试使用 Vitest 进行组件测试,确实很香。

试试使用 Vitest 进行组件测试,确实很香。

作者头像
前端小智@大迁世界
发布于 2022-09-21 11:54:27
发布于 2022-09-21 11:54:27
2.4K01
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:1
代码可运行

新出了一个系列:Vue2与Vue3 技巧小册

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

什么是Vitest?

自从 尤大 的构建工具Vite获得了巨大的人气,现在有了一个由它驱动的极快的单元测试框架。Vitest

Vitest 与 Jest 兼容,具有开箱即用的 ESM、Typescript 和 JSX 支持,并且由 esbuild 提供支持。它在测试过程中使用 Vite 开发服务器来转换你的文件,并监听你的应用程序的相同配置(通过vite.config.js),从而消除了使用Jest等测试替代品所涉及的重复工作。

为什么选择Vitest?

Vite是一个构建工具,旨在为现代 web 项目提供更快、更精简的开发体验,它开箱即用,支持常见的 web 模式、glob导入和 SSR 等功能。它的许多插件和集成正在促进一个充满活力的生态系统。

但这导致了一个新问题:如何在Vite上编写单元测试。

将Jest等框架与Vite一起使用,导致Vite和Jest之间有很多重复的配置,而 Vitest 解决了这一问题,它消除了为我们的应用程序编写单元测试所需的额外配置。Vitest 使用与 Vite 相同的配置,并在开发、构建和测试时共享一个共同的转换管道。它还可以使用与 Vite 相同的插件API进行扩展,并与Jest的API兼容,以方便从Jest迁移,而不需要做很多重构工作。

因此,Vitest 的速度也非常快。

如何使用 Vitest 来测试组件

安装 Vitest

在项目中使用 Vitest 需要 Vite >=v2.7.10Node >=v14 才能工作。

可以使用 npmyarnpnpm 来安装 Vitest,根据自己的喜好,在终端运行以下命令:

NPM

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -D vitest

YARN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add -D vitest

PNPM

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pnpm add -D vitest

Vitest 配置

安装完 Vitest 后,需要将其添加到 vite.config.js 文件中:

vite.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

export default defineConfig({
    plugins: [vue()],
    //add test to vite config
    test: {
        // ...
    },
});

为 TypeScript 配置 Vitest 是类似的,但如果从 Vite 导入 defineConfig,我们需要在配置文件的顶部使用三斜线命令添加对 Vitest 类型的引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <reference types="vitest" />
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
// https://vitejs.dev/config/

export default defineConfig({
    plugins: [vue()],
    test: {
        // ...
    },
});

值得注意的是,Vitest 也可以在项目中通过在根文件夹中添加 vitest.config.js 文件来配置。如果这个文件存在,它将优先于 vite.config.js 来配置Vitest。Vitest 也允许额外的配置,可以在配置页面中找到。

事例演示:Notification

为了看看Vitest的运作情况,我们创建一个显示三种类型通知的通知组件:infoerror 和success。这个组件的每个状态如下所示:

info

error

success

notification.vue 内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div
    :class="[
      'notification',
      type === 'error' ? 'notification--error' : null,
      type === 'success' ? 'notification--success' : null,
      type === 'info' ? 'notification--info' : null,
      message && message.length > 0 ? 'notification--slide' : null,
    ]"
  >
    <img
      src="https://res.cloudinary.com/djalafcj9/image/upload/v1634261166/getequityV2/denied_sbmv0e.png"
      v-if="type === 'error'"
    />
    <img
      src="https://res.cloudinary.com/djalafcj9/image/upload/v1656690265/getequityV2/Frame_irxz3e.png"
      v-if="type === 'success'"
    />
    <img
      src="https://res.cloudinary.com/djalafcj9/image/upload/v1634261166/getequityV2/pending_ctj1ke.png"
      v-if="type === 'info'"
    />
    <p class="notification__text">
      {{ message }}
    </p>
    <button
      ref="closeButton"
      class="notification__button"
      @click="$emit('clear-notification')"
    >
      <img
        src="https://res.cloudinary.com/djalafcj9/image/upload/v1635485821/getequityV2/close_muxdyb.png"
      />
    </button>
  </div>
</template>
<script>
  export default {
    name: "Notification",
    emits: ['clear-notification'],
    props: {
      type: {
        type: String,
        default: null,
      },
      message: {
        type: String,
        default: null,
      },
    },
  };
</script>

<style>
  .notification {
    transition: all 900ms ease-out;
    opacity: 0;
    z-index: 300001;
    transform: translateY(-100vh);
    box-sizing: border-box;
    padding: 10px 15px;
    width: 100%;
    max-width: 730px;
    /* margin: 0 auto; */
    display: flex;
    position: fixed;
    /* left: 0; */
    top: 20px;
    right: 15px;
    justify-content: flex-start;
    align-items: center;
    border-radius: 8px;
    min-height: 48px;
    box-sizing: border-box;
    color: #fff;
  }

  .notification--slide {
    transform: translateY(0px);
    opacity: 1;
  }

  .notification--error {
    background-color: #fdecec;
  }

  .notification__text {
    margin: 0;
    margin-left: 17px;
    margin-right: auto;
  }

  .notification--error .notification__text {
    color: #f03d3e;
  }

  .notification--success {
    background-color: #e1f9f2;
  }

  .notification--success > .notification__text {
    color: #146354;
  }

  .notification--info {
    background-color: #ffb647;
  }

  .notification__button {
    border: 0;
    background-color: transparent;
  }
</style>

在这里,我们使用 message prop创建了一个显示动态消息的组件。我们还利用 type prop 来设计这个组件的背景和文本,并利用这个 type prop 显示我们计划的不同图标(error, success, info)。

最后,我们有一个按钮,用来通过发出一个自定义事件:clear-notification来解除通知。

我们应该测试什么?

现在我们对需要测试的组件的结构有了了解,我们可以再思考一下,这个组件需要做什么,以达到预期的功能。

我们的测试需要检查以下内容:

  • 该组件根据通知类型渲染出正确的样式。
  • message 为空时,通知就会逐渐消失。
  • 当关闭按钮被点击时,该组件会发出一个事件。

为了测试这些功能,在项目中添加一个 notification.test.js 用于测试。

安装测试依赖项

在编写单元测试时,可能会有这样的情况:我们需要用一个什么都不做的假组件来替换组件的现有实现。这被称为 stub(存根),为了在测试中使用存根,我们需要访问Vue Test Utils的mount方法,这是Vue.js的官方测试工具库

现在我们来安装Vue Test Utils。

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save-dev @vue/test-utils@next

# or

yarn add --dev @vue/test-utils@next

现在,在我们的测试文件中,我们可以从"@vue/test-utils"导入 mount

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { mount } from "@vue/test-utils";

在测试中,我们还需要能够模拟 DOM。Vitest目前同时支持 happy-domjsdom。对于这个演示,我们将使用happy-dom,然后安装它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add happy-dom --dev

安装后,我们可以在测试文件的顶部添加以下注释...

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @vitest-environment happy-dom
 */

.或者将此添加到 vite/vitest 配置文件中,以避免在有多个需要 happy-dom 工作的测试文件时出现重复情况。

vite.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
// https://vitejs.dev/config/
export default defineConfig({
    plugins: [vue()],
    test: {
        environment: "happy-dom",
    },
});

因为我们只有一个测试文件,所以我们可以选择第一个选项,所以我们测试文件内容如下:

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @vitest-environment happy-dom
 */

import { mount } from "@vue/test-utils";

有了这些依赖关系,我们现在可以导入我们要测试的组件。

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @vitest-environment happy-dom
 */

import { mount } from "@vue/test-utils";
import notification from "../components/notification.vue";

常见的Vitest方法

为了编写测试,我们需要利用以下常见的方法,这些方法可以从 Vitest 导入。

  • describe:这个函数接受一个名字和一个函数,用于将相关的测试组合在一起。当你为一个有多个测试点(如逻辑和外观)的组件编写测试时,它就会很方便。
  • test/it:这个函数代表被测试的实际代码块。它接受一个字符串,通常是测试案例的名称或描述(例如,渲染成功的正确样式)和另一个函数,所有的检查和测试在这里进行。
  • expect: 这个函数用于测试值或创建断言。它接受一个预期为实际值(字符串、数字、对象等)的参数x,并使用任何支持的方法对其进行评估(例如toEqual(y),检查 x 是否与 y 相同)。

因此,我们现在将这些导入我们的测试文件中

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @vitest-environment happy-dom
 */

import { mount } from "@vue/test-utils";
import notification from "../components/notification.vue";
import { describe, expect, test } from "vitest";

有了这些函数,我们开始构建我们的单元测试。

建立 Vitest 单元测试

首先使用 describe 方法将测试分组。

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe("notification.vue", () => {
    
});

describe 块内,我们添加每个实际的测试。

我们第一个要测试的用例是:组件根据通知类型渲染出正确的样式

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe("notification.vue", () => {
    test("renders the correct style for error", () => {

    });
});

renders the correct style for error 表示 test 所检查的内容的 name。它有助于为代码块检查的内容提供上下文,这样就可以由原作者以外的人轻松维护和更新。它也使人们容易识别一个特定的失败的测试案例。

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe("notification.vue", () => {
    test("renders the correct style for error", () => {
       const type = "error";
    });
});

在我们组件中,定义了一个 type 参数,它接受一个字符串,用来决定诸如背景颜色、图标类型和文本颜色在组件上的渲染。在这里,我们创建一个变量 type,并将我们正在处理的类型之一,error (error, info, 或 success)分配给它。

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe("notification.vue", () => {
    test("renders the correct style for error", () => {
        const type = "error";
        const wrapper = mount(notification, {
            props: { type },
        });
    });
});

在这里,我们使用 mount 来存根我们的组件,以便进行测试。

mount 接受组件作为第一个参数,接受一个选项列表作为第二个参数。这些选项提供了不同的属性,目的是确保你的组件能在浏览器中正常工作。

在这个列表中,我们只需要 props 属性。我们使用这个属性是因为我们的 notification.vue组件至少需要一个 prop 才能有效工作。

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe("notification.vue", () => {
    test("renders the correct style for error", () => {
        const type = "error";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--error"])
        );
    });
});

在这一点上,剩下的就是写一个断言,或者更好的是,写出我们组件的预期行为,即:renders the correct style for error

为了做到这一点,我们使用了 expect 方法。它接受我们的存根组件和所有的选项(在我们的例子中,我们把它命名为wrapper以方便参考)。

这个方法可以被链接到其他一些方法上,但是对于这个特定的断言,我们要重新检查组件的类列表是否返回一个包含这个 notification——error 的数组。。

我们使用 classes 函数来实现这一点,该函数返回包含该组件所有类的数组。在这之后,下一件事就是使用 toEqual 函数进行比较,它检查一个值 X 是否等于 Y。在这个函数中,我们检查它是否返回一个包含我们的类的数组: notification--error

同样,对于 type 为 successinfo 类型,测试过程也差不多。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { mount } from "@vue/test-utils";
import notification from "../components/notification.vue";
import { describe, expect, test } from "vitest";
describe("notification.vue", () => {
    test("renders correct style for error", () => {
        const type = "error";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--error"])
        );
    });

    test("renders correct style for success", () => {
        const type = "success";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--success"])
        );
    });

    test("renders correct style for info", () => {
        const type = "info";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--info"])
        );
    });

    test("slides down when message is not empty", () => {
        const message = "success";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--slide"])
        );
    });
});

到这,我们已经写好了测试,以确保我们的通知是根据其类型来进行样式设计的。当用户点击组件上的关闭按钮时,我们会重置 message 参数。根据我们的代码,我们要根据这个 message 参数的值来添加或删除 notification--slide 类,如下所示:

notification.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div
    :class="[
      'notification',
      type === 'error' ? 'notification--error' : null,
      type === 'success' ? 'notification--success' : null,
      type === 'info' ? 'notification--info' : null,
      message && message.length > 0 ? 'notification--slide' : null,
    ]"
  >
//...

如果我们要测试这个特定的断言,它的内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test("slides up when message is empty", () => {
        const message = "";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.classes("notification--slide")).toBe(false);
    });

在这段测试代码中,我们用一个空字符串创建一个 message 变量,并把它作为一个 prop 传递给我们的组件。

之后,我们检查我们组件的类数组,确保它不包括 notification--slide 类,该类负责使我们的组件向下/向外滑动到用户的视图。为了做到这一点,我们使用 toBe 函数,它接收一个值A,并试图检查它是否与 B 相同。

我们还想测试一下,每当组件上的按钮被点击,它就会发出一个事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test("emits event when close button is clicked", async() => {
        const wrapper = mount(notification, {
            data() {
                return {
                    clicked: false,
                };
            },
        });
        const closeButton = wrapper.find("button");
        await closeButton.trigger("click");
        expect(wrapper.emitted()).toHaveProperty("clear-notification");
    });

在这个测试块中,我们使用了一个 async 函数,因为我们将触发一个事件,它返回一个 Promise,我们需要等待这个 Promise 的解决,以便捕捉这个事件所引起的变化。我们还使用了data函数,并添加了一个 clicked 属性,当点击时将被切换。

到这,我们需要触发这个点击事件,我们首先通过使用 find 函数来获得按钮。这个函数与querySelector相同,它接受一个类、一个id或一个属性,并返回一个元素。

在找到按钮后,使用 trigger 方法来触发一个点击事件。这个方法接受要触发的事件名称(click, focus, blur, keydown等),执行这个事件并返回一个 promise。出于这个原因,我们等待这个动作,以确保在我们根据这个事件做出断言之前,已经对我们的DOM进行了改变。

最后,我们使用返回一个数组的 [emitted](https://test-utils.vuejs.org/api/#emitted) 方法检查我们的组件所发出的事件列表。然后我们检查这个数组是否包括 clear-notification 事件。

最后,我们测试以确保我们的组件渲染出正确的消息,并传递给 message prop。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test("renders message when message is not empty", () => {
        const message = "Something happened, try again";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.find("p").text()).toBe(message);
    });

这里,我们创建了一个 message 变量,给它分配了一个随机字符串,并把它作为一个 prop 传递给我们的组件。

然后,我们使用 p 标签搜索我们的消息文本,因为这里是显示消息的地方,并检查其文本是否与 message 相同。

我们使用 text 方法提取这个标签的内容,这和 innerText很相似。最后,我们使用前面的函数 toBe 来断言这个值与 message 相同。

完整的测试文件

在涵盖所有这些之后,下面是完整的测试文件内容:

notification.test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @vitest-environment happy-dom
 */

import { mount } from "@vue/test-utils";
import notification from "../components/notification.vue";
import { describe, expect, test } from "vitest";

describe("notification.vue", () => {
    test("renders the correct style for error", () => {
        const type = "error";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--error"])
        );
    });

    test("renders the correct style for success", () => {
        const type = "success";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--success"])
        );
    });

    test("renders the correct style for info", () => {
        const type = "info";
        const wrapper = mount(notification, {
            props: { type },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--info"])
        );
    });

    test("slides down when message is not empty", () => {
        const message = "success";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.classes()).toEqual(
            expect.arrayContaining(["notification--slide"])
        );
    });

    test("slides up when message is empty", () => {
        const message = "";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.classes("notification--slide")).toBe(false);
    });

    test("emits event when close button is clicked", async() => {
        const wrapper = mount(notification, {
            data() {
                return {
                    clicked: false,
                };
            },
        });
        const closeButton = wrapper.find("button");
        await closeButton.trigger("click");
        expect(wrapper.emitted()).toHaveProperty("clear-notificatioon");
    });

    test("renders message when message is not empty", () => {
        const message = "Something happened, try again";
        const wrapper = mount(notification, {
            props: { message },
        });
        expect(wrapper.find("p").text()).toBe(message);
    });
});

有几件事需要注意:

  • 我们利用 mount 来存根我们要测试的组件,它是由Vue Test Utils提供的。 (yarn add --dev @vue/test-utils@next)

运行测试

现在已经完成了测试的编写,需要运行它们。要实现这一点,我们去 package.json在我们的scripts 部分添加以下几行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"scripts": {
    "test": "vitest",
    "coverage": "vitest run --coverage"
},

如果在终端运行 yarn vitestyarn test,我们的测试文件就会被运行,我们应该看到测试结果和故障。

到这,我们已经成功地使用Vitest运行了我们的第一次测试。从结果中需要注意的一点是,由于Vitest的智能和即时观察模式,这个命令只需要运行一次,并在我们对测试文件进行更新和修改时被重新运行。

总结

使用 Vitest 对我们的应用程序进行单元测试是无缝的,与Jest等替代品相比,需要更少的步骤来启动和运行。Vitest 还可以很容易地将现有的测试从 Jest 迁移到Vitest,而不需要进行额外的配置。

作者:Timi Omoyeni 译者:前端小智 来源:vuemastery

原文:https://www.vuemastery.com/bl...

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug

交流

本文 GitHub https://github.com/qq44924588... 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
此时会出现类似于 Failed to resolve component: a-button 的报错
一尾流莺
2022/12/10
2.3K0
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
TDesign 在 vitest 的实践
在 tdesign-vue-next 的 CI 流程中,单元测试模块的执行效率太低,每次在单元测试这个环节都需要花费 6m 以上。加上依赖按照,lint 检查等环节,需要花费 8m 以上。
PY
2022/07/17
1.5K3
TDesign 在 vitest 的实践
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/07/03
4.7K0
前端单元测试那些事
React 应用架构实战 0x7:测试
在这一节中,我们将学习如何使用不同的测试方法来测试我们的应用程序。这将使我们有信心对应用程序进行重构、构建新功能和修改现有功能,而不用担心破坏当前的应用程序行为。
Cellinlab
2023/05/17
1.7K0
实例入门 Vue.js 单元测试
作为一个以 文档丰富 而广为人知的前端开发框架, Vue.js 的官方文档中分别在《教程-工具-单元测试》、《Cookbook-Vue组件的单元测试》里对 Vue 组件的单元测试方法做出了介绍,并提供了官方的单元测试实用工具库 Vue Test Utils;甚至在状态管理工具 Vuex 的文档里也不忘留出《测试》一章。
江米小枣
2020/06/15
3.1K0
Vue 应用单元测试的策略与实践 03 - Vue 组件单元测试
2.1 在 Vue 应用的单元测试中,对不同 UI 组件的单元测试有何不同?颗粒度该细到什么样的程度?
JimmyLv_吕靖
2019/09/10
1.4K0
Vue 应用单元测试的策略与实践 03 - Vue 组件单元测试
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
---- 知识点 将 mock 对象断言为特定类型 使用 jest.Mocked<T> 使用 it.only 来指定测试的 case 使用 skip 跳过指定测试的 case 测试内容 触发事件 trigger 方法 测试界面是否更新 特别注意 DOM 更新是个异步的过程 使用 async await 更新表单 setValue 方法 验证事件是否发送 emitted 方法 测试异步请求 模拟第三方库实现 测试准备和结束 可以使用内置的一些钩子来简化一些通用的逻辑,以下钩子用于一次性完成测试准备。 b
一尾流莺
2022/12/10
9790
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
[译] Vue 3 Composition API 之单元测试
原文:https://itnext.io/testing-the-composition-api-fae3bae3f592
江米小枣
2020/06/15
1.7K0
vue中关于测试的介绍
Vue-Cli 推荐两种测试分别是:端到端的测试(E2E) 和 单元测试(Unit Test) 一、端到端(E2E): 端(消费端)到端(产品端)的测试(E2E (End-to-End)), 它用来测试一个应用从头到尾的流程是否和设计时候所想的一样。简而言之,它从一个用户的角度出发,认为整个系统都是黑箱,只有UI会暴露给用户 二、单元测试(Unit Test): 测试驱动开发(TDD: Test-Driven Development), 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。 Vue中的单元测试中有( Jest +Karma+ Mocha(Chai) ) Karma: Karma是一 个基于Node.js的JavaScript测试执行过程管理工具( Test Runner)。该工具在Vue中的主要作用是将项目运行在各种主流Web浏览器进行测试。 换句话说,它是一个测试工具,能让你的代码在浏览器环境下测试。需要它的原因在于,你的代码可能是设计在浏览器端执行的,在node环境下测试可能有些bug暴露不出来;另外,浏览器有兼容问题, karma提供了手段让你的代码自动在多个浏览器( chrome,firefox ,ie等)环境下运行。 如果你的代码只会运行在node端,那么你不需要用karma。 Mocha mocha(摩卡)是一个测试框架,在vue-cli中配合。mocha本身不带断言卡,所以必须先引入断言库,Chai断言库实现单元测试。 Mocha的常用命令和用法不算太多,而Chai断言库可以看Chai.js断言库API中文文档,很简单,多查多用就能很快掌 握。 断言库 所谓“断言” ,就是判断源码的实际执行结果与预期结果是否-致,如果不一致就抛出一个错误。下面这句断言的意思是,调用add(1, 1) ,结果应该等于2. 复制代码
用户9914333
2022/07/21
1.1K0
vue中关于测试的介绍
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
---- 什么是 TDD 的开发方式 TDD(Test-Driven Development) 测试驱动开发 先根据需求写测试用例 测试用例全部是失败的状态 开始写代码实现功能 将所有的测试用例由失败调为成功状态 以 TDD 的思想开发一个颜色选择器组件 需求分析 显示 左侧显示当前颜色 右侧显示十种常用的颜色 右侧最后一个是透明,点击可以清除颜色效果 点击 点击左侧,显示颜色选择器弹框,在颜色选择框中点击,或者修改 input 中的值后,将新的值以事件的形式发射出去。 点击右侧的颜色,将新的值以事件的形
一尾流莺
2022/12/10
4830
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
[day-ui]DButton 组件和 DIcon 组件实现
上一篇中我们已经把组件的基础架构和文档的雏形搭建好了。下面我们从最简单的 button 和 icon 组件入手,熟悉下 vue3 的语法结构和组件的单元测试。看这篇文章前最好了解下 vue3 的语法和 compositionAPI,基本就能了解代码为何如此书写,和 vue2 有哪些不同。
测不准
2021/04/08
6070
[译] Vuex 之单元测试
原文:https://lmiller1990.github.io/vue-testing-handbook/testing-vuex.html
江米小枣
2020/06/15
3.5K0
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
这是一个基于 vue-cli 生成的项目,可以直接使用 vue add xxx 进行插件的安装。
一尾流莺
2022/12/10
8580
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
[译] 对 Vue-Router 进行单元测试
原文:https://medium.com/js-dojo/unit-testing-vue-router-1d091241312
江米小枣
2020/06/15
2.4K0
[译] Vue Router 之单元测试
原文:https://github.com/tonylua/vue-testing-handbook/blob/master/src/zh-CN/vue-router.md
江米小枣
2020/06/15
2.1K0
Vue 框架学习系列十二:Vue 3 单元测试与E2E测试
在Vue 3应用的开发过程中,测试是一个至关重要的环节。它不仅能够确保代码的正确性,还能在后续的代码重构和升级过程中提供安全保障。本文将深入探讨Vue 3的单元测试(Unit Testing)和端到端测试(End-to-End Testing, E2E Testing)的基本概念、常用工具以及实践方法。
china马斯克
2024/10/11
6630
全面掌握 Vue.js 测试体系:单元测试与端到端测试全攻略
测试是软件开发中不可或缺的一部分。在 Vue.js 项目中,通过合理的测试体系可以提升代码的可靠性与可维护性。本文将介绍如何使用 Jest 和 Cypress 在 Vue.js 项目中构建全面的单元测试和端到端测试体系,结合可运行的代码示例,帮助开发者快速上手并应用于实际项目。
Swift社区
2025/01/09
3760
全面掌握 Vue.js 测试体系:单元测试与端到端测试全攻略
Vue 业务系统如何落地单元测试
一直对单测很感兴趣,但对单测覆盖率、测试报告等关键词懵懵懂懂,最近几个月一直在摸索如何在Vue业务系统中落地单元测试,看到慢慢增长的覆盖率,慢慢清晰的模块,对单元测试的理解也比以前更加深入,也有一些心得和收获。
coder_koala
2021/07/12
4.1K0
【Web技术】639- Web前端单元测试到底要怎么写?
随着 Web 应用的复杂程度越来越高,很多公司越来越重视前端单元测试。我们看到的大多数教程都会讲单元测试的重要性、一些有代表性的测试框架 api 怎么使用,但在实际项目中单元测试要怎么下手?测试用例应该包含哪些具体内容呢?
coder_koala
2020/07/15
3.2K0
【Web技术】639- Web前端单元测试到底要怎么写?
【架构师(第三十二篇)】 通用上传组件开发及测试用例
通过 input type="file", 然后触发 form 的 submit 上传。
一尾流莺
2022/12/10
3.1K0
推荐阅读
相关推荐
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验