首页 > 其他分享 >Jest生命周期方法全解析从入门到精通!

Jest生命周期方法全解析从入门到精通!

时间:2024-11-03 15:20:25浏览次数:5  
标签:生命周期 console 入门 afterAll x1b 测试用例 Jest 执行 log

Jest 中的生命周期方法

在 Jest 测试框架中,生命周期方法用于在测试用例执行前后执行特定的操作。这些方法可以帮助你在测试前设置环境、清理资源等。Jest 提供了两类生命周期方法:

  • 重复性的生命周期方法
    • beforeEach
    • afterEach
  • 一次性的生命周期方法
    • beforeAll
    • afterAll

这些方法都是全局方法,无需引入,直接在测试文件中使用即可。

重复性的生命周期方法

beforeEachafterEach

beforeEachafterEach 方法会在每个测试用例的前后执行。这对于需要在每个测试用例之前设置初始状态或在每个测试用例之后清理资源非常有用。

示例代码
const { sum, sub, mul, div } = require("./tools");

// beforeEach 会在执行每一个测试用例之前被触发
beforeEach(() => {
  console.log("全局的beforeEach");
});

afterEach(() => {
  console.log("全局的afterEach");
});

test("测试加法函数", () => {
  const result = sum(1, 3);
  expect(result).toBe(4);
  console.log("\x1b[31m%s\x1b[0m", "测试加法函数");
});

test("测试减法函数", () => {
  const result = sub(15, 10);
  expect(result).toBe(5);
  console.log("\x1b[31m%s\x1b[0m", "测试减法函数");
});

test("测试乘法函数", () => {
  const result = mul(2, 3);
  expect(result).toBe(6);
  console.log("\x1b[31m%s\x1b[0m", "测试乘法函数");
});

test("测试除法函数", () => {
  const result = div(50, 2);
  expect(result).toBe(25);
  console.log("\x1b[31m%s\x1b[0m", "测试除法函数");
});

执行顺序

  • 每个测试用例执行前,先执行全局的 beforeEach
  • 测试用例执行完毕后,执行全局的 afterEach
    16816946204785

一次性的生命周期方法

beforeAllafterAll

beforeAllafterAll 方法分别在所有测试用例执行之前和之后执行一次。这对于需要在所有测试用例之前进行一次性设置或在所有测试用例之后进行一次性清理非常有用。

示例代码
// ...
// beforeAll 是在整个测试套件的第一个测试用例执行之前执行
beforeAll(() => {
  console.log("全局的beforeAll");
});

// afterAll 会在所有测试用例执行完成之后,然后再执行 afterAll
afterAll(() => {
  console.log("全局的afterAll");
});
// ...

执行顺序

  • 所有测试用例执行之前,先执行全局的 beforeAll
  • 所有测试用例执行完毕后,执行全局的 afterAll
    16816949683970

在分组中添加生命周期方法

如果测试用例较多,可以使用 describe 进行分组。在分组中也可以添加生命周期方法,这些方法仅对该组测试用例有效。

示例代码
// 第二组
describe("第二组", () => {
  beforeEach(() => {
    console.log("\x1b[34m%s\x1b[0m", "分组beforeEach");
  });

  afterEach(() => {
    console.log("\x1b[34m%s\x1b[0m", "分组afterEach");
  });

  beforeAll(() => {
    console.log("\x1b[32m%s\x1b[0m", "分组beforeAll");
  });

  afterAll(() => {
    console.log("\x1b[32m%s\x1b[0m", "分组afterAll");
  });

  test("测试乘法函数", () => {
    const result = mul(2, 3);
    expect(result).toBe(6);
    console.log("\x1b[31m%s\x1b[0m", "测试乘法函数");
  });

  test("测试除法函数", () => {
    const result = div(50, 2);
    expect(result).toBe(25);
    console.log("\x1b[31m%s\x1b[0m", "测试除法函数");
  });
});

16816973539011

执行顺序

  • 全局的 beforeAll 先执行。
  • 分组的 beforeAll 再执行。
  • 每个测试用例执行前,先执行全局的 beforeEach,再执行分组的 beforeEach
  • 每个测试用例执行完毕后,先执行分组的 afterEach,再执行全局的 afterEach
  • 所有测试用例执行完毕后,先执行分组的 afterAll,再执行全局的 afterAll

补充:test.only

test.only 用于只运行特定的测试用例。这对于调试失败的测试用例非常有用。

示例代码
test.only("测试乘法函数", () => {
  const result = mul(2, 3);
  expect(result).toBe(6);
  console.log("\x1b[31m%s\x1b[0m", "测试乘法函数");
});

执行顺序

  • 使用 test.only 时,只会执行标记的测试用例。
  • 对应的生命周期方法也会被执行。

源码解析

在 Jest 的源码中,这些生命周期方法的背后,实际上都是调用的同一个名为 _addHook 的方法。

const beforeEach: THook = (fn, timeout) =>
  _addHook(fn, 'beforeEach', beforeEach, timeout);
const beforeAll: THook = (fn, timeout) =>
  _addHook(fn, 'beforeAll', beforeAll, timeout);
const afterEach: THook = (fn, timeout) =>
  _addHook(fn, 'afterEach', afterEach, timeout);
const afterAll: THook = (fn, timeout) =>
  _addHook(fn, 'afterAll', afterAll, timeout);
const _addHook = (
  fn: Circus.HookFn,
  hookType: Circus.HookType,
  hookFn: THook,
  timeout?: number,
) => {
  const asyncError = new ErrorWithStack(undefined, hookFn);

  if (typeof fn !== 'function') {
    asyncError.message =
      'Invalid first argument. It must be a callback function.';

    throw asyncError;
  }

  dispatchSync({ asyncError, fn, hookType, name: 'add_hook', timeout });
};

_addHook 方法主要负责错误处理,并调用 dispatchSync 方法来调度钩子函数的执行。

总结

  • Jest 中的生命周期方法分为重复性和一次性两种。
  • 重复性的生命周期方法:
    • beforeEach:每个测试用例前执行。
    • afterEach:每个测试用例后执行。
  • 一次性的生命周期方法:
    • beforeAll:所有测试用例前执行一次。
    • afterAll:所有测试用例后执行一次。
  • 在分组中可以添加局部的生命周期方法,但需注意与全局方法的执行顺序。
  • 使用 test.only 可以方便地运行单个测试用例,以便在调试失败的测试用例时进行测试。

标签:生命周期,console,入门,afterAll,x1b,测试用例,Jest,执行,log
From: https://blog.csdn.net/weixin_53961451/article/details/143465833

相关文章

  • PostgreSQL11从入门到精通
    书:pan.baidu.com/s/1IVTI-jQveSb4Cdrio6XkBw?pwd=ijykPostgreSQL11是一个功能强大的开源关系型数据库管理系统,以下是对PostgreSQL11从入门到精通的技术分享:一、PostgreSQL11简介PostgreSQL起源于加利福尼亚的伯克利大学,经历了无数次开发升级,现已成为世界上最先进的开源关......
  • 【JQuery】基础从零入门操作,简单详细
    阿华代码,不是逆风,就是我疯你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你!!目录一:JQuery介绍1:引入依赖2:src3:下载说明4:版本说明二:JQuery使用三:JQuery语法1:起手式2:选中元素四:JQuery选择器五:JQuery事件1:事件的组成六:获取、设置元素内容1:获取元素内......
  • 【NOI】C++函数入门二(自定义函数)
    文章目录前言一、概念1.导入1.1首先什么是函数呢?2.函数分类3.为什么要定义函数呢?4.函数结构5.函数使用注意事项二、例题讲解问题:1137-纯粹素数问题:1258-求一个三位数问题:1140-亲密数对问题:1149-回文数个数三、总结四、感谢前言在这一章节中,我们将深入探......
  • 从递归到递推--入门篇
    从递归到递推–入门篇一.1.什么是递归递归是指一种通过重复将问题分解为子问题而解决问题的方法。具体到使用上来,就是指对函数自身的调用。本文所讨论的递归,都是基于函数对自身的调用。但是,递归并非仅对函数而言,递归是种思想,例如C语言中的链表的实现同样依托递归思想,本文......
  • Lambda表达式从入门到精通
    Lambda表达式一.入门Lambda表达式1.1概述1.2核心原则:1.3基本格式:二.使用Lambda表达式例一例二例三例四例五三.总结一.入门Lambda表达式1.1概述Lambda表达式是JDK8中的一个语法糖,他可以对某些匿名内部类的写法进行化简.它是函数式编程思想的一个重要体......
  • 书生大模型实训营第4期—入门岛第4关:玩转HF/魔搭/魔乐社区
    书生大模型实训营第4期—入门岛第4关:玩转HF/魔搭/魔乐社区任务一:模型下载1.使用HuggingFace平台下载模型1.1HuggingFace平台1.2InternLM模型下载1.3GitHubCodeSpace的使用1.3.1下载internlm2_5-7b-chat的配置文件1.3.2下载internlm2_5-chat-1_8b并打印示例输出......
  • Ubuntu零基础入门到精通【4.4讲】:️ 用户和权限管理
    目录:......
  • Ubuntu零基础入门到精通【4.3讲】:️存储设备与分区管理
    目录:......
  • 【算法-选择排序】挑挑拣拣,排出顺序——选择排序入门
    什么是选择排序?选择排序是一种比较简单直接的排序方式。想象你在打散一副牌,想按照大小顺序从小到大排列这些牌。你会怎么做?可能会先找出最小的那张,放在最前面,然后在剩下的牌里找第二小的,依次类推,这就是选择排序的基本思路!在程序中,选择排序的操作流程也类似:它逐步将未排序......
  • 编程小白如何成为大神?大学新生的最佳入门攻略
    编程小白如何成为大神?大学新生的最佳入门攻略编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学生活和未来职......