了解单元测试

一,测试分类

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytest——Fixture夹具的使用

一、什么是Fixture 在测试开展的过程中,会需要考虑到测试前的准备工作,以及测试后的释放操作行为。这些在Pytest中,会通过Fixture的方式来实现。如果说在运行pytest的测试用例的时候,需要调用一些数据来实现测试行为,…

thingsboard规则节点功能记录(自用)

本文是对【ThingsBoard源码级分析规则节点使用第一季】 https://www.bilibili.com/video/BV1CT411e7vt/?p4&share_sourcecopy_web&vd_source9a5ca7ed3cff97385fdab4b6188e485c 学习的一些记录,加深自己的理解,在此声明。 asset profile switch…

五、HTML 标题

在 HTML 文档中&#xff0c;标题很重要。 一、HTML 标题 标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。 <h1>这是一个标题。</h1> <h2>这是一个标题。&l…

微型导轨在设备中起什么作用

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;可以用于电子制造设备、半导体制造设备、医疗设备、光学设备和机器人等各种工业机械设备中&#xff0c;那么微型导轨在设备中起什么作用呢&#xff1f; 1、导向与定位&#xff1a;为机…

Flume基础知识(九):Flume 企业开发案例之复制和多路复用

1&#xff09;案例需求 使用 Flume-1 监控文件变动&#xff0c;Flume-1 将变动内容传递给 Flume-2&#xff0c;Flume-2 负责存储 到 HDFS。同时 Flume-1 将变动内容传递给 Flume-3&#xff0c;Flume-3 负责输出到 Local FileSystem。 2&#xff09;需求分析&#xff1a; 3&…

【论文解读】基于神经辐射场NeRF的像素级交互式编辑(Seal-3D)

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2307.15131 项目主页&#xff1a;https://windingwind.github.io/seal-3d/ 摘要&#xff1a; 随着隐式神经表征或神经辐射场&#xff08;NeRF&#xff09;的普及…

推荐几个免费的HTTP接口Mock网站和工具

在前后端分离开发架构下&#xff0c;经常遇到调用后端数据API接口进行测试、集成、联调等需求&#xff0c;比如&#xff1a; &#xff08;1&#xff09;前端开发人员很快开发完成了UI界面&#xff0c;但后端开发人员的API接口还没有完成&#xff0c;不能进行前后端数据接口对接…

嵌入式开发——电源管理单元PMU

学习目标 了解什么是电池管理单元PMU了解ARM32中的电源域了解几种省电模式学习内容 PMU PMU全称Power Management Unit,电源管理单元。 电源域 总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。 VDD/VDDA域 VDD/VDDA域如下图: 提供PMU 常规电源供应以下模块的供电…

C# 反射的乌云,MethodInfo的Json序列化参数入参问题

文章目录 前言直接运行MethodInfo运行结果 Json解决ParamterInfo实例化运行结果无法实例化问题部分参数的问题 Json反序列化 经过长达一天的研究&#xff0c;我终于完全的解决的了实战思路方法测试用例运行测试运行结果 代码总结总结 前言 我上篇文章已经基本解决了反射的基本…

【SpringCloud】之远程消费(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

python画图工具总结

一、python工具 python运行工具&#xff1a;Anaconda3 Anaconda3运行模式&#xff1a;jupyter notebook 操作系统&#xff1a;window11 二、折线图 from matplotlib import pyplot import matplotlib.pyplot as plt from math import sqrt import pandas as pd from matplot…

ffmpeg.c(4.3.1)源码剖析

文章目录 前言一、FFmpeg 源码结构图二、ffmpeg.h 头文件详解三、main 函数主要流程分析四、ffmpeg_parse_options1、命令行例子①、解析命令行 split_commandline()②、parse_optgroup()③、MATCH_PER_XXX_OPT() 2、vf 选项解析①、filters②、vf 术语③、avfilter_graph_pars…

【LeetCode每日一题】2807. 在链表中插入最大公约数(模拟+求最大公约数的6中写法)

2024-1-6 文章目录 [2807. 在链表中插入最大公约数](https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list/)思路&#xff1a;模拟求最大公约数的几种方法&#xff1a; 1.暴力枚举法2.辗转相除法3.辗转相除法 ---递归调用4.辗转相除法 ---递归调用---…

微服务注册中的负载均衡

背景 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 单体架构&#xff1a;简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目。…

【计算机毕业设计】SSM在线化妆品网站

项目介绍 本项目为前后台项目&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,分类管理,产品管理,用户管理,订单管理等功能。 用户角色包含以下功能&#xff1a; 提交订单,用户登录,用户首页,查看…

MySQL数据库期末知识点总结(复习版)

一、数据库基本知识 数据库中的数据有什么特点 1、数据是按某种结构组织的 2、数据有整体性、共享性和较高的独立性 数据管理技术经历了哪三个阶段 1、手工管理 2、文件管理 3、数据库管理 数据库管理系统的主要功能有哪些 数据库管理系统的主要功能包括数据定义、数据…

欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒

出品&#xff5c;欧科云链研究院 2024年&#xff0c;Web3与AI两个数字科技的巅峰碰撞&#xff0c;欧科云链研究院探索AI与Web3的技术融合&#xff0c;与澎湃科技联合发布2024年展望&#xff0c;原标题为《2024年展望&#xff1a;Web3与AI共振引爆可信数字社会》&#xff0c;共…

Mybatis-Mapper代理开发

Mapper代理开发 目的使用Mapper代理方式入门1.定义与SQL映射文件同名的Mapper接口&#xff0c;并且将Mapper接口和SQL映射文件放置在同一目录下首先新建一个Mapper接口编译mybatis-demo更改sql映射文件路径 2.设置SQL映射文件的namespace属性为Mapper接口全限定名3.在Mapper 接…

数据在内存中的存储之大小端

今天也是努力学编程&#xff0c;敲代码的一天&#xff01; 1.什么是大小端 其实超过一个字节的数据在内存中存储的时候&#xff0c;就有存储顺序的问题&#xff0c;按照不同的存储顺序&#xff0c;我们分为大端字节序 存储和小端字节序存储&#xff0c;下面是具体的概念: &…

吉时利2601A数字源表Keithley 2601A

吉时利2601A源测量单元&#xff08;SMU&#xff09;&#xff0c;也被称为源表&#xff0c;是一种高性能的仪器&#xff0c;能够提供100毫伏至40伏的电压范围&#xff0c;以及100纳至10安的电流范围。这种仪器能够提供的功率高达40.4瓦&#xff0c;使其在台式I-V表征工具或多通道…