了解单元测试

一,测试分类

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.mzph.cn/news/600562.shtml

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

相关文章

任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC]

文章目录 任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议任我行CRM系统SmsDataList接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关…

C++《异常》

前言:C有一套独立的异常处理机制,今天就来做详细的介绍try,catch这两个词等 在C语言中处理错误的方式和缺陷有: 返回错误码。 缺陷: 1.错误码不好设置,比如:除0操作,就不好返回错误码。如果返回一个数字&…

Flume基础知识(八):Flume 拓扑结构全解

1. 简单串联 这种模式是将多个 flume 顺序连接起来了,从最初的 source 开始到最终 sink 传送的 目的存储系统。此模式不建议桥接过多的 flume 数量, flume 数量过多不仅会影响传输速 率,而且一旦传输过程中某个节点 flume 宕机,会…

LC 2807. 在链表中插入最大公约数

2807. 在链表中插入最大公约数 难度 : 中等 题目大意: 给你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表…

thinkphp学习04-控制器定义

控制器,即 controller,控制器文件存放在 controller 目录下; 如果想改变系统默认的控制器文件目录,可以在 config 下 route.php 配置: 将controller修改为controller123,就会报错,说明这个配置…

Sqlmap参数设置

Sqlmap参数设置 🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈 --------------------------------------------注意---------…

易图讯便携式三维电子沙盘实战应用系统

便携式三维电子沙盘采用军工加固三防高性能笔记本,具有IP65级防尘防水防摔性能,以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑,支持高清卫星影像、DEM高程数据、矢量数据、三维模型、倾斜摄像、BIM、点云、城市白模、等高线、标高…

033 - STM32学习笔记 - TIM定时器(一) - 高级定时器

033 - STM32学习笔记 - TIM定时器(一) - 高级定时器 上节内容学习了基本定时器,其功能比较简单,配置和使用也比较容易,今天在基本定时器的基础上学习一下高级控制定时器的内容。 在F429上一共有两个高级控制定时器和1…

PyTorch|一次画一批图像

想想这样一个场景,我们训练了一个神经网络,输入一些信息,这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张,而是多张,我们想把这些图片一次全部显示出来,而不是一张一张的显示(这…

Python蒸发散物理问题(微积分-线性代数-拉普拉斯和傅立叶变换)

使用Python计算解决土壤物理问题的数值。这里数值过程用于求解微分方程,数值方法将微分转化为代数方程,可以使用传统的线性代数方法求解。 Python拉普拉斯变换求解微分方程示例 假设我们有微分方程 y ′ ′ 2 y ′ 16 y cos ⁡ 4 t y^{\prime \pri…

关于unity的组件VerticalLayoutGroup刷新显示不正常的问题

先说明一下我是如何用到,有哪些处理的 用到这个组件基本上都是将列表进行排版操作的,竖着,或者横着,横着用HorizontalLayoutGroup 还有一个和这个组件搭配的组件叫ContentSizeFitter 先说我是怎么发现这个组件不好用的 //本地读取…

中标麒麟文件系统损坏修复

中标麒麟v5.0桌面版本文件系统损坏修复 1.用系统安装光盘启动到如下图界面,关闭或最小化“安装到硬盘”窗口 2.右击打开命令提示符,执行su – root 3.执行如下图命令,找到除swap格式分区的其他分区 4.按照上图显示的格式执行相关命令&#…

【数据结构】二叉搜索(查找/排序)树

一、二叉搜索树基本概念 1、定义 二叉搜索树,又称为二叉排序树,二叉查找树,它满足如下四点性质: 1)空树是二叉搜索树; 2)若它的左子树不为空,则左子树上所有结点的值均小于它根结…

第十六章 调用Callout Library函数

文章目录 第十六章 调用Callout Library函数使用 $ZF() 访问 iriszf 标注库 第十六章 调用Callout Library函数 Callout 库是一个共享库(DLL 或 SO 文件),其中包含 $ZF Callout 接口的挂钩,允许各种 Z F 函数在运行时加载它并调…

编程笔记 html5cssjs 025 HTML输入类型(1/2)

编程笔记 html5&css&js 025 HTML输入类型(1/2) 输入类型:text输入类型:password输入类型:submit输入类型: radio输入类型: checkbox输入类型: buttonHTML5 输入类型输入类型:number 本节介绍HTML输…

C# .Net学习笔记—— 异步和多线程(await/async)

一、介绍 1、控制台测试await/async 2、C# 5.0 .Net framework4.5 CLR4.0 以后才有,本身是一种语法糖 二、基本测试 1、不加await测试。 private async static Task TestAsync() {Log.Info($"当前主线程id{Thread.CurrentThread.ManagedThreadId}"…

LabVIEW在高级结构监测中的创新应用

LabVIEW在高级结构监测中的创新应用 LabVIEW作为一个强大的系统设计平台,其在基于BOTDA(光时域反射分析)技术的结构监测中发挥着核心作用。利用LabVIEW的高效数据处理能力和友好的用户界面,开发了一个先进的监测系统。该系统专门…

第P9周:YOLOv5-Backbone模块实现

一、 前期准备 1. 设置GPU 我的是笔记本电脑,没有GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,PIL,pathlib,warningswarnings.filterwarni…

OpenSSL provider

提供者 标准提供者默认提供者传统提供者FIPS 提供者基本提供者空提供者加载提供者 标准提供者 提供者是算法实现的容器。每当通过高级别 API 使用加密算法时,都会选择一个提供者。实际上是由该提供者实现执行所需的工作。OpenSSL 自带了五个提供者。在未来&#…

视频智能分析/云存储平台EasyCVR接入海康SDK,通道名称未自动更新该如何解决?

视频监控GB28181平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能…