了解单元测试

news2025/1/17 2:52:07

一,测试分类

1.1 E2E测试(end to end端到端测试)

属于黑盒测试。

主要通过测试框架,站在用户测试人员的角度,模拟用户的操作进行页面功能的验证,不管内部实现机制,完全模拟浏览器的行为。(但对于前端开发,E2E测试用的不多,通常都是做单元测试)

常用的框架有 Puppeteer、Cypress、Playwright、Selenium 、cucumber、TestCafe等

1.2 单元测试

属于白盒测试。

单元测试是最小可测试单元,针对方法、函数、类等单个功能。他主要是为了测试自己写的代码,包括各种函数、组件、模块等。

常用的框架有 Jest、Jasmine、Mocha等

单元测试的优势

代替了测试的一部分工作,减少手动测试时间;

保证了代码的各个部分能够独立、正确的工作;

提高了代码的质量和可维护性;

减少了迭代新特性时产生的Bug;

有利于重构。

1.3 集成测试

集成测试主要应用在耦合度高的函数或组件。他的目的主要是测试经过单元测试后的各个模块组合在一起作为一个整体是否能正常工作。

常用的框架有Vue-Test-Utils 、ReactTestUtils、Enzyme、React-Testing-Library等

二,单元测试详解

2.1 主流单元测试框架对比

Mocha:生态最好,应用最多,但是需要很多配置来实现他的高扩展性。

Jasmine:单元测试框架的“元老”,开箱即用,但是异步测试支持较差。

Jest:基于Jasmine,做了大量修改并添加了很多特性,同样开箱即用,但异步测试支持良好。语法与Mocha也比较像。

后续均以Jest为例,详细的学习可以查看官网

2.2 项目环境配置

安装依赖:npm install --save-dev jest

增加启动命令(package.json文件):"test": "jest"        // 即npm run test即可执行

jest配置文件:jest.config.js文件的相关配置 // 对于jest的一些基本配置,可参考官网配置

babel配置文件:babel.config.js  // jest执行会将将文件交给babel处理,因此也需要配置

2.3 常用语法

2.3.1 Expect(断言)

概念expect通常都是配合匹配器一起使用,结合不同的匹配器去断言不同类型的值。

应用:

expect(value) - 断言value值满足一定条件,后面链式调用匹配器 (eg:expect(value).toBe(4); )

2.3.2 匹配器

概念:jest的匹配器是核心语法,他的机制可以让我们使用各种方法进行测试。其中包含数字、字符串、数组、对象等。

分类

数值

  • .toBe(number) - 判断是否严格相等。expect(value).toBe(4);
  • .toEqual(number) - 判断值是否相等
  • .toBeCloseTo(number) -  判断浮点数是否相等
  • .toBeLessThan(number) - 判断是否小于期望值
  • .toBeGreaterThan(number) - 判断是否大于期望值
  • .toBeLessThanOrEqual(number) - 判断是否小于等于期望值
  • .toBeGreaterThanOrEqual(number) - 判断是否大于等于期望值
  • .toBeNaN(number)
  • ... ... 

真假值

  • .toBeNull() - 判断是否为null
  • .toBeDefined() - 判断是否被定义
  • .toBeUndefined() - 判断是否未定义(与上面相反)
  • .toBeTruthy() - 判断是否为真值(true、非0数字、非空字符串、对象/数组等)
  • .toBeFalsy() - 判断是否为假值(false、0、空字符串、null、undefined等)
  • ... ...

字符串

  • .toMatch(str) - 可以检查对具有toMatch正则表达式的字符串

                              eg:expect('Christoph').toMatch(/stop/);

数组/可迭代对象

  • .toContain(value) - 判断数组或者对象是否包含value值

取反

  • .not - 取反 (eg:expect(value).not.toBe(4);)

异常:

  • .toThrow(error?) - 判断是否抛出了一个异常(参数可以为Error对象、抛出异常的文本)

       eg:function codeSth() {
                        throw new Error('param is wrong!');
               }
                test('compiling codeSth as expected', () => {
                        expect(() => codeSth()).toThrow();
                        expect(() => codeSth()).toThrow(Error);

                        expect(() => codeSth()).toThrow(/^param is wrong!$/);
                });

  • ... ...更多匹配器可查看官方API

2.3.3 异步代码测试

解读:测试一段异步代码,返回一个Promise时,Jest会等待Promise的resove状态,如果Promise的状态变为rejected,,测试将会失败。

应用

1,通过名为fetchData的promise对象来进行断言

2,通过async、await、resolves、rejects等互相配合链式调用进行断言

应用示例

1,通过fetchData()断言

// 假设fetchData()这个promise成功后会返回"operation success"字符串,则断言
test('the data is operation success', () => {
  return fetchData().then((data) => {
    expect(data).toBe('operation success');
  });
});

2,通过async、await、resolves、rejects配合链式调用进行断言

​
// 将test的回调设置成异步,通过await等待断言fetchData返回的promise值链式调用期望值
test('the data is operation success', async () => {
  return fetchData().then((data) => {
    await expect(fetchData()).resolves().toBe('operation success');
  });
});

​
// 断言异步函数测试失败,返回了error
test('the data operation with an error', async () => {
  await expect(fetchData()).rejects.toMatch('error');
});

2.4 生命周期钩子

  • test(name, func [, timeout]) - 运行测试的方法(别名:it(name, func [, timeout])
  • beforeAll(func [, timeout]) - 文件内 所有测试开始前执行的钩子函数
  • afterAll(func [, timeout]) - 文件内 所有测试完成后执行的钩子函数
  • beforeEach(func [, timeout]) - 文件内 每个测试开始前执行的钩子函数
  • afterEach(func [, timeout]) - 文件内 每个测试完成后执行的钩子函数
  • describe(name, func) - 将多个test测试组合到一起,成为一个块,每个块中都拥有自己的一套生命周期钩子,就像vue的子组件。

示例:

beforeAll(() => {
    console.log('全局beforeAll');
});

afterAll(() => {
    console.log('全局afterAll');
});

describe('test truthy and falsy', () => {
    beforeAll(() => {
        console.log('局部beforeAll');
    });
    afterAll(() => {
        console.log('局部afterAll');
    });
    test('is truthy', () => {
        expect(1).toBeTruthy();
    });

    test('is falsy', () => {
        expect(0).toBeFalsy();
    });
});

三,官网地址

细节的编写问题可查看官方API:

全局设定 · JestJest会将这些方法和对象注入到测试文件的全局环境里, 所以你在使用的时候不再需要进行require或者import。 如果你习惯编写明确的导入,你可以在测试文件顶部添加 import {describe, expect, test} from '@jest/globals'。icon-default.png?t=N7T8https://jestjs.io/zh-Hans/docs/api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1358149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化—pytest命令行操作

学习目标: 1、pytest的不同的运行方法 2、pytest常见的命令行参数 3、如何添加自定义的pytest命令行参数 学习内容: 1、pytest的不同的运行方法 1.1主要有三种情况的运行方式: 1.1.1没有使用pytest框架,但是要运行包含test…

微信多功能投票小程序源码系统:送礼物+在线充值+票数汇总+创建活动+完整的代码安装包 附带完整的搭建教程

微信已成为人们日常生活中不可或缺的一部分。因此,微信小程序也受到了广大用户的欢迎。在这个背景下,多功能投票小程序应运而生,为各种活动提供了方便快捷的投票方式。本文将介绍一款微信多功能投票小程序源码系统,该系统具有送礼…

Python | Iter/genartor | 一文了解迭代器、生成器的含义\区别\优缺点

前提 一种技术的出现,需要考虑: 为了实现什么样的需求;遇到了什么样的问题;采用了什么样的方案;最终接近或达到了预期的效果。 概念 提前理解几个概念: 迭代 我们经常听到产品迭代、技术迭代、功能迭代…

Apache Doris (六十一): Spark Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Spark Doris Connector…

开发者必备的 Github 加速工具(截至2024年01月)

开始闲聊前,我要感谢大神小青龍总结的博文:作为程序员不得不知道的几款Github加速神器,给我们介绍了常用(较为合规😄)的加速方法。毕竟 github 是开发者绕不过的宝库。 背景 我用 Github 将近12年&#x…

drf知识--11

补充 # 研究simple-jwt提供的Token类: 1、RefreshToken:生成refresh token的类 2、AccessToken:生成refresh token的类 3、Token:他们俩的父类 4、str(RefreshToken的对象)---得到字符串 refresh token,Token类写了 …

【linux学习】linux概述

1. linux概述 操作系统主要的功能有两个部分,一是更有效率的控制计算机硬件资源(主要通过核心来控制),二是为程序设计师提供更容易开发软件的环境(系统呼叫提供软件开发环境)。linux就是一套操作系统&…

台灯学生用哪个牌子最好?学生护眼台灯最好的品牌推荐

如今的家长对教育十分重视,不仅给孩子提供了各种别致的文具,为了孩子有更好的学习光线,还会购买各种护眼台灯,但各种选择五花八门。从无蓝光、无频闪到柔和光,各种宣传亮点层出不穷……为了为孩子选购一款优质的学习护…

P3704数字表格(莫比乌斯反演)

题目背景 Doris 刚刚学习了 fibonacci 数列。用 fi​ 表示数列的第 i 项,那么 00,11f0​0,f1​1 fn​fn−1​fn−2​,n≥2 题目描述 Doris 用老师的超级计算机生成了一个 nm 的表格, 第 i 行第 j 列的格子中的数是 gcd(i,j)​,其中gcd(…

企业数据治理的三个阶段:从起步到成熟的数据管理之旅

随着数字化时代的到来,企业数据已经成为企业的重要资产和驱动业务发展的重要力量。然而,要想充分利用数据的价值,企业需要对其数据进行有效的管理和治理。本文将对企业数据治理的三个阶段进行详细的探讨,以帮助企业了解其在数据治…

5600U PVE安装WIN10后直通核显

修改PVE系统配置 请先安装相同版本的PVE系统,其他版本如果存在问题请自行查找。 安装过程比较简单,具体方法请自行百度 1. 修改grub启动参数: 修改文件 /etc/default/grub 中 GRUB_CMDLINE_LINUX_DEFAULT 配置: GRUB_CMDLINE_LI…

七款人体感应报警器电路图

人体感应报警器电路图(一) 人体发出的红外线波长在9~10um之间,属远红外线区。我们利用热释电红外传感器及信号处理集成电路,组装成一个人体红外线感应开关电路报警器,它能依靠人体发出的微量红外线进行开关…

一键减低PNG像素,轻松优化图片质量!

在数字时代,我们每天都要处理大量的图片文件,从网站设计、广告素材到社交媒体图片等。PNG作为一种常用的无损压缩格式,在保证图片质量的同时,也占用了较大的存储空间。为了优化存储空间和提高加载速度,我们需要对PNG图…

获取小红书笔记详情API调用说明(含请求示例参数说明)

前言 小红书,是一个引领全球时尚潮流的社交电商平台。在这里,你可以发现世界各地的优质好物,从美妆护肤、穿搭时尚,到家居生活、旅行美食,一切应有尽有。同时,这里也是一个分享生活点滴的平台,…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了,经过几个月的研发,在原有的视频流分析的基础上,我们终于支持大家都非常期待的图片分析功能了,图片分析的功能加上,能有利于很多场景的展开,比如在烟火、明厨亮…

蓝牙技术在智能交通系统中的革新与应用

随着科技的不断进步,蓝牙技术已经成为智能交通系统中的一项关键技术。其无线连接和低功耗的特性为交通管理和车辆通信提供了新的解决方案。本文将深入探讨蓝牙技术在智能交通系统中的应用,以及其对交通效率、安全性和用户体验的积极影响。 1. 蓝牙技术在…

5G工业物联网网关:连接未来的智能工业

在当今数字化时代,工业物联网正迅速崛起,并引领着全球工业的数字转型。而5G工业物联网网关作为实现IIoT的关键基础设施,在连接未来的智能工业中发挥着举足轻重的作用。 什么是5G工业物联网网关 5G工业物联网网关是连接工业设备和5G网络的关键…

“晨曦记账本:筛选特定时间段内的借款信息,管理更轻松!“

晨曦记账本,为您的财务记录带来前所未有的便捷!现在,我们推出了一项新功能,让您能够轻松筛选特定时间段内的借款信息。这不仅让您更轻松地管理借款记录,还能确保您的财务数据一目了然。 首先,我们要打开晨…

YOLOv8独家原创改进:新颖的Shape IoU结合 Inner-IoU,基于辅助边框的IoU损失的同时关注边界框本身的形状和尺度,小目标实现高效涨点

💡💡💡本文改进:一种新的Shape IoU方法结合 Inner-IoU,基于辅助边框的IoU损失的同时,更加关注边界框本身的形状和尺度来计算损失 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/ca…

2024年您应该知道的 12个绝佳且免费的 AI 工具

2024年,人工智能的世界会继续让我们着迷。 这里收集了12 个免费的 AI 工具,其中大多数易于使用,还有一些复杂的。无论如何,AI 将会给我们的工作和生活带来巨大的改变,了解并掌握最适合自己的工作至关重要。 1、Adobe …