mocha单元测试

1. 因为有时候在代码中加了新的东西需要反复测试接口 或者 别人要求 重新跑接口非常的繁琐

2. 所有我们需要一个帮我们重复测试的东西  那就是mocha

3. 先下载 一定不要全局安装 不然后期如果这个模块更新有问题影响的是全部的文件

npm i mocha

4. 因为不是全局安装 没办法通过命令直接获取我们还得去 根目录下找bin文件太繁琐了 所以我们需要配置 pakeage.json文件里的内容  改脚本内的 test 起其他名字也行

{ ---------------------------- 初始化内容
"name": "mocah",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": { // ---------改这里
"test": "mocha"
},--------------------------end
"author": "",
"license": "ISC",
"dependencies": { ----------这个是后面案例需要的 包
"chai": "^4.3.6",
"koa": "^2.13.4",
"mocha": "^10.0.0",
"supertest": "^6.2.4"
}
}

5. 如果执行的话直接 npm  test    如果你不是 test最好加上    npm run  名字 这个会直接找你文件夹下的 test文件  这个和上面的  npm test 没有关联!!!  mocha这个模块会找 名字带有test 文件的名字

6.封装一个方法方便演示

function maxNum(...arr) {
return arr.length ? Math.max(...arr) : 0; //就是取传来的最大值 没有传值就返回0
}
module.exports = maxNum; //导出

7. 编写测试 用的是node 自带的配合mocha 它还提供了describe 和it 方法非常的好用 具体看代码

const maxNum = require("../maxNum");
const assert = require("assert"); describe("第一组测试", () => {
describe("小测试1", () => {
it("sum() 结果 0 ", () => {
// 这个是node 内置的 assert测试 strictEqual表示严格模式下
assert.strictEqual(maxNum(), 0);//断言 在严格模式下maxNum()结果是0
});
});
describe("小的测试2", () => {
it("sum(1) 结果 1", () => {
// 这个是node 内置的 assert测试 strictEqual表示严格模式下
assert.strictEqual(maxNum(1), 2); // 专门写错一个
});
});
});
// 第二组大的测试
describe("第二组大的测试", () => {
it("sum(1,2) 结果 2 ", () => {
// 这个是node 内置的 assert测试 strictEqual表示严格模式下
assert.strictEqual(maxNum(1, 2), 2); //断言在严格模式下 maxNum(1,2)值是2
});
it("sum(1,2,3) 结果 3", () => {
// 这个是node 内置的 assert测试 strictEqual表示严格模式下
assert.strictEqual(maxNum(1, 2, 3), 3);//断言在严格模式下 maxNum(1,2,3)值是3
});
});
-------------------------------------结果---------------------
第一组测试
小测试1
sum() 结果 0
小的测试2
1) sum(1) 结果 1
第二组大的测试
sum(1,2) 结果 2
sum(1,2,3) 结果 3
3 passing (21ms)
1 failing
1) 第一组测试
小的测试2
sum(1) 结果 1:
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
1 !== 2
+ expected - actual
-1
+2
at Context.<anonymous> (test\test.js:14:14)
at processImmediate (node:internal/timers:466:21)

chai 可以更加方便也比node 自带的功能 要更加强大

官网 :https://www.chaijs.com/

1. 它还整合了需要其他模块的风格 比如 expect 风格 assert风格 should 风格等多种风格

2. 下载安装 chai

npm install  chai

3. assert 风格

const maxNum = require("../maxNum"); //导入上面那个函数
const chai = require("chai"); //导入下载好的模块 const assert = chai.assert;// 用这个模块中的assert方法 describe("测试", () => {
it("使用 assert 风格", () => {
assert.equal(maxNum(1, 5, 2), 5);// 表示断言maxNum(1,5,2)结果是 5
assert.typeOf(maxNum(1, 5, 2), "Number");// 断言maxNum(1,5,2)结果应该是个Number
});
});
--------------------------log--------------
测试
使用 assert 风格
1 passing (12ms)

4.should风格 这种链式调用的风格的

const maxNum = require("../app");
const chai = require("chai"); chai.should(); // 调用一下
describe("测试", () => {
it("使用 should 风格", () => {
//这个函数应该存在并且值等于1 并且值是 Number类型
maxNum(1).should.exist.and.equal(1).and.be.a("Number");
// 分开写也行
maxNum(1).should.equal(1); // 值是1
maxNum(1).should.exist; // 应该存在
maxNum(1).should.be.a("Number"); // 应该是Number类型
});
});
-----------------------log---------------------------------
测试
使用 should 风格
1 passing (11ms)

5.expect 风格的 这种期望风格的

const maxNum = require("../app");
const chai = require("chai"); const expect = chai.expect;
describe("测试", () => {
it("使用 expect 风格", () => {
// 期望这个值是 存在的
expect(maxNum(1)).to.exist;
//期望它是个Number类型
expect(maxNum(1)).to.be.a("Number");
// 期望它的值是1
expect(maxNum(1)).to.equal(1);
});
});
-----------------------------------------log -----------------
使用 expect 风格
1 passing (12ms)

异步测试

1.  在好多情况下 比如接口 去操作数据库  去读取文件都是异步在上面那些异步就不好用了

2. 可以使用回调函数  不管演示的 是promise 用async await 方法实现异步测试

3. 异步读取文件

const chai = require("chai");
// 引入fs 模块 把他改装为promises对象来处理异步 或者你可以写成回调函数
const fs = require("fs").promises;
const assert = chai.assert;
// 异步读取文件
describe("测试异步", () => {
it("读取文件", async () => {
// 异步读取文件 等待文件读取成功才能进行抛出判断
let data = await fs.readFile("./my.text");
assert.equal(data, "111");//断言这个文件中的数据是111
});
});
----------------------------------------log
测试异步
读取文件
1 passing (14ms)

4.异步测试接口 这里我们用到是 supertest 这个小模块

4.1 下载安装supertest

npm  install supertest

4.2 这个模块可以发送网络请求还有集成的断言  非常的好用

const koa = require("koa"); //引入koa模块
const app = new koa();
// 发get 请求就发送 json {ok:1}
app.use((ctx, next) => {
ctx.body = { ok: 1 };
});
// 把ap导出去
module.exports = app;
-----------------------------------上面是创建服务器模块 不在同一个文件夹------------
const supertest = require("supertest"); // 导入模块
const app = require("../app"); //引入app describe("接口测试", () => {
let server;
it("测试get接口", async () => {
await supertest(server) // 用async await 等待测试结果
.get("/")//发起get 请求
.expect(200, { ok: 1 }); // 进行判断看是ok:1吗
});
// 钩子函数在所有测试跑之前执行
before(() => {
// 开启服务器
server = app.listen(3000);
});
// 钩子函数在所有测试跑完之后执行
after(() => {
// 关闭服务器
server.close();
});
});

钩子函数

1. 在一个大 的describe作用域中 before是所有测试之前 after 是所有请求之后

2. beforeEach是 每一个小的测试之前 afterEach是每一个小的测试之后

3. 这个就可以很方便的 比如 开启数据库 打开服务器等等 在不同的地方干不同的事件

  after(() => {
// 关闭服务器
server.close();
});
});
钩子函数
const assert = require("chai").assert;
const str = "test"; describe("测试钩子函数1", () => {
it("测试它的数据类型是不是 string", () => {
assert.typeOf(str, "string");
});
it("测试它值是不是 test", () => {
assert.equal(str, "test");
});
// 定义钩子函数
beforeEach(() => {
console.log("我是每一个函数1测试之前的");
});
afterEach(() => {
console.log("我是每一个函数1测试之后的");
});
// 全部测试之前和之后
before(() => {
console.log("我是函数1之前的");
});
after(() => {
console.log("我是函数1之后的 ");
});
});
describe("测试钩子函数2", () => {
it("测试它的数据类型是不是 存在呀", () => {
assert.exists(str);
});
it("断言它值不是 数字 ", () => {
assert.isNotNumber(str);
});
// 定义钩子函数
beforeEach(() => {
console.log("我是每一个函数2测试之前的");
});
afterEach(() => {
console.log("我是每一个函数2测试之后的");
});
// 全部测试之前和之后
before(() => {
console.log("我是函数2之前的");
});
after(() => {
console.log("我是函数2之后的 ");
});
});
-------------------------------log------------------

测试钩子函数1
我是函数1之前的
我是每一个函数1测试之前的
测试它的数据类型是不是 string
我是每一个函数1测试之后的
测试它值是不是 test
我是函数1之后的


测试钩子函数2
我是函数2之前的
我是每一个函数2测试之前的
测试它的数据类型是不是 存在呀
我是每一个函数2测试之后的
我是每一个函数2测试之前的
断言它值不是 数字
我是每一个函数2测试之后的
我是函数2之后的

4 passing (37ms)

mocha、chai和supertest单元测试的更多相关文章

  1. 带你入门带你飞Ⅱ 使用Mocha + Chai + SuperTest测试Restful API in node.js

    目录 1. 简介 2. 准备开始 3. Restful API测试实战 Example 1 - GET Example 2 - Post Example 3 - Put Example 4 - Del ...

  2. 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试

    一. 前端自动化测试 大多数前端开发者对测试相关的知识是比较缺乏的,一来是开发节奏很快,来不及写,另一方面团队里也配备了"人肉测试机",完全没必要自己来.但随着项目体量的增大,许多 ...

  3. #单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(二)

    学习对vue组件进行单元测试,先参照官网编写组件和测试脚本. 1.简单的组件 组件无依赖,无props 对于无需导入任何依赖,也没有props的,直接编写测试案例即可. /src/testSrc/si ...

  4. #单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(一)

    目标: 为已有的vue项目搭建 karma+mocha+chai 测试框架 编写组件测试脚本 测试运行通过 抽出共通 一.初始化项目 新建项目文件夹并克隆要测试的已有项目 webAdmin-web 转 ...

  5. 使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)

    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频) 使用 TypeScript & mocha & chai 写测试代码实战 #1 ...

  6. 带你入门带你飞Ⅰ 使用Mocha + Chai + Sinon单元测试Node.js

    目录 1. 简介 2. 前提条件 3. Mocha入门 4. Mocha实战 被测代码 Example 1 Example 2 Example 3 5. Troubleshooting 6. 参考文档 ...

  7. 基于Grunt&Mocha 搭建Nodejs自动化单元测试框架(含代码覆盖率统计)

    Introduction Grunt 是一个基于任务的JavaScript 世界的构建工具 Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异 ...

  8. nodejs 中使用 mocha + should + jscoverage 生成 单元测试覆盖率报告

    最近一直在做nodejs,而关于js的单元测试覆盖率网上资料比较少而且吧比较零散,我从网上找来一些资料整理一下分析给大家,希望大家可以少走弯路. 首先我是从windows环境下测试的,用到的工具有 m ...

  9. should + mocha 搭建简单的单元测试环境

    快速搭建测试环境,详细用法请百度和访问两者的github mocha: http://mochajs.org/ should: https://github.com/shouldjs/should.j ...

随机推荐

  1. 基于springBoot项目如何配置多数据源

    前言 有时,在一个项目中会用到多数据源,现在对自己在项目中多数据源的操作总结如下,有不到之处敬请批评指正! 1.pom.xml的依赖引入 <dependency> <groupId& ...

  2. Min-max 容斥与 kth 容斥

    期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...

  3. jvm jni 及 pvm pybind11 大批量数据传输及优化

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. 干货 |《2022B2B新增长系列之企服行业橙皮书》重磅发布

    企服行业面临的宏观环境和微观环境已然发生了明显的变化.一方面,消费级互联网成为过去式,爆发式增长的时代结束.资本.媒体的目光已经悄然聚焦到以企服行业所代表的产品互联网身上,B2B企业正稳步走向C位. ...

  5. WPS前骨干历时10年打造新型软件,Excel用户:我为此改用WPS

    办公软件本质是降本增效,我们常见的金山WPS软件.微软office Excel.仓库管理WMS.生产管理MES等都是如此,但是有一款软件却让人变得更"懒惰",而且还是针对于有进取心 ...

  6. 跟我读论文丨Multi-Model Text Recognition Network

    摘要:语言模型往往被用于文字识别的后处理阶段,本文将语言模型的先验信息和文字的视觉特征进行交互和增强,从而进一步提升文字识别的性能. 本文分享自华为云社区<Multi-Model Text Re ...

  7. 2022-07-21 第四组 java之继承

    目录 一.继承 1.概念 2.语法 3.父类成员访问 3.1 子类访问父类的成员变量 3.1.1 子类和父类中不存在同名的成员变量 3.1.2 子类和父类中不存在同名的成员变量 3.2 子类中访问父类 ...

  8. 【每天学一点-05】使用umi.js代理,解决跨域问题(前端)

    一.user.ts 前端请求接口 import request from 'umi-request'; const getAway = '/user'; // 获取用户列表 export const ...

  9. ZooKeeper3.4.10集群安装配置-Docker

    一. 服务器规划 主机 IP 端口 备注 b-mid-24 172.16.0.24 2181, 2888, 3888 2181:对cline端提供服务 3888:选举leader使用 2888:集群内 ...

  10. linux学习之selinux安全处理

    linux在默认情况下会开启selinux,如果软件开放的端口不是selinux默认的协议端口会导致防火墙端口开放后还是无法访问.以下是解决办法. [root@localhost ~]# semana ...