文章目录

  • mocha介绍
    • mocha的特点主要有
  • 编写测试
    • 直接测试
    • 使用内置断言
    • 使用mocha
      • 配置
      • 基本使用方法
      • chai断言库
      • 异步测试
      • http测试
      • 钩子函数

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
单元测试由开发人员执行。
将测试用例放到一个测试模块里,就是一个完整的单元测试。
mocha是单元测试的一个框架

mocha介绍

mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行。
使用mocha,我们就只需要专注于编写单元测试本身,然后,让mocha去自动运行所有的测试,并给出测试结果。

mocha的特点主要有

1.既可以测试简单的avaScript函数,又可以测试异步代码,因为异步是JavaScript的特性之一 ;
2.可以自动运行所有测试,也可以只运行特定的测试;
3.可以支持before. after、 beforeEach和afterEach来编写初始化代码。

编写测试

测试代码:
sum.js

module.exports = function (...rest) {var sum = 0;for (var i of rest) {sum+=i}return sum
}

直接测试

text.js

var sum = require("./sum")
console.log(sum(1,2,3))

输出 6,结果正确

使用内置断言

  • 如果测试用例通过,正常运行不会报错;如果测试用例出错,就会报错
  • 如果一个测试用例出错,之后的测试用例就不会再执行了
  • 无法自动运行
var sum = require("./sum")
// 内置断言
var assert = require("assert")// 断定不传参结果为0
assert.strictEqual(sum(), 0)assert.strictEqual(sum(1, 3), 4)assert.strictEqual(sum(1,2,3),6)

使用mocha

配置

  • 安装:npm i mocha
  • 这里没有使用全局安装,所以在终端直接输入mocha会报错,所以做如下更改
    package.json
{"name": "mocha","version": "1.0.0","description": "","main": "sum.js","scripts": {"test": "mocha"},"author": "","license": "ISC","dependencies": {"mocha": "^10.0.0"}
}

这样每次执行 npm test 就可以运行mocha了。
mocha会自动查找text文件夹 ,并且执行text文件夹下的全部测试文件。

基本使用方法

  • describe("",()=>{}) 一组测试,可以嵌套

  • it("",()=>{}) 一个测试
    他们的 第一个属性可以显示在测试报告中

  • 无论测试正确与错误,测试结果都会显示在测试报告中

  • 前面的测试不正确不会影响后面的测试
    eg:

var sum = require("../sum")
// 内置断言
var assert = require("assert")// 断定不传参结果为0
assert.strictEqual(sum(), 0)
assert.strictEqual(sum(1, 3), 4)
assert.strictEqual(sum(1, 2, 3), 6)// describe 一组测试,嵌套
// it 一个测试
// 第一个属性可以显示在测试报告中
describe("大的组1测试", () => {describe("小的组1测试", () => {it("sum()结果应该返回0", () => {assert.strictEqual(sum(), 0)})it("sum(1)结果应该返回10", () => {assert.strictEqual(sum(1), 10)})it("sum(1,2)结果应该返回3", () => {assert.strictEqual(sum(1,2), 3)})it("sum(1,2,3)结果应该返回6", () => {assert.strictEqual(sum(1,2,3), 6)})})describe("小的组2测试", () => {})
})
describe("大的组2测试", () => {})

测试结果:

chai断言库

  • 下载: npm i chai
  • chai 有三种风格:shoule,expect,assert
    assert风格
var chai = require("chai")
var assert = chai.assertdescribe('assert Demo',function (){it('use assert lib', function () {//   模拟函数的返回值var value = "hello"assert.typeOf(value, 'string')assert.equal(value, 'hello')assert.lengthOf(value,5)})
})

should风格

var chai = require("chai")
chai.should()describe('should Demo',function (){it('use should lib', function () {//   模拟函数的返回值var value = "hello"value.should.be.a('string')value.should.equal('hello')value.should.not.equal('hello2')value.should.have.length(5)// 可以合并写value.should.exist.and.equal('hello').and.have.length(5).and.be.a('string')})
})


expect风格

var chai = require("chai")
var expect = chai.expectdescribe('expect Demo',function (){it('use expect lib', function () {//   模拟函数的返回值var value = "hello"var number = 3expect(number).to.be.at.most(5)//小于等于5expect(number).to.be.at.least(3)//大于等于3expect(number).to.be.within(1, 4)//大于等于1,小于等于4expect(value).to.existexpect(value).to.be.a('string')expect(value).to.equal('hello')expect(value).to.not.equal('您好')expect(value).to.have.length(5)})
})

异步测试

两种写法: done写法 和 await写法

const fs = require("fs")
const fsp = fs.promises
var assert = require("assert")describe('异步测试', () => {it("异步的去文件", (done) => {// ./1.txt是按测试的文件路径写的,而不是相对于当前文件写的fs.readFile("./1.txt", "utf-8", (err, data) => {if (err) {done(err)} else {assert.strictEqual(data, "hello,hello")// done表示测试用例调用结束之后再判断测试是否正确done()}})})})describe('异步测试2', () => {it("异步的去文件2",async () => {// ./1.txt是按测试的文件路径写的,而不是相对于当前文件写的var data = await fsp.readFile("./1.txt", "utf-8")assert.strictEqual(data,"hello,hello")})
})

http测试

app.js:

const koa = require("koa")
const app = new koa()app.use((ctx) => {ctx.body = "<h1>hello</h1>"
})// app.listen(3000)module.exports = app

text.js:

var axios = require("axios")
var assert = require("assert")
var supertest = require("supertest")
var app = require("../app")// 手动启动故服务器的测试
// describe('测试接口1', () => {//     it('返回html代码片段测试1', async() => {//         // axios,后端也有 npm i axios
//         var res = await axios.get("http://localhost:3000/")
//         assert.strictEqual(res.data,"<h1>hello</h1>")
//     })
// })// 自动启动服务器的测试
describe('测试接口2', () => {let server = app.listen(3000)it('返回html代码片段测试2', async() => {await supertest(server).get("/").expect("Content-type", /text\/html/).expect(200, "<h1>hello</h1>")})// 钩子函数,执行完所有测试用例之后,执行该函数after(() => {server.close()})})

测试:

钩子函数

四种钩子函数

 before(() => {console.log("执行所有测试用例之前,执行该函数")})after(() => {console.log("执行完所有测试用例之后,执行该函数")})beforeEach(() => {console.log("每一个测试用例开始前执行")})afterEach(() => {console.log("每一个测试用例结束后执行")})

eg:

var axios = require("axios")
var assert = require("assert")
var supertest = require("supertest")
var app = require("../app")// 自动启动服务器的测试
describe('测试接口2', () => {let serverit('返回html代码片段测试2', async() => {await supertest(server).get("/").expect("Content-type", /text\/html/).expect(200, "<h1>hello</h1>")})// 钩子函数,执行所有测试用例之前,执行该函数before(() => {console.log("执行所有测试用例之前,执行该函数")server = app.listen(3000)})// 钩子函数,执行完所有测试用例之后,执行该函数after(() => {console.log("执行完所有测试用例之后,执行该函数")server.close()})// beforeEach(() => {console.log("每一个测试用例开始前执行")})afterEach(() => {console.log("每一个测试用例结束后执行")})})

输出:

mocha——单元测试相关推荐

  1. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    -------------------------------------- 单元测试Express/NodeJs 个人理解, 1,如果不是测试http请求的单元测试,用Mocha, Chai等基本够 ...

  2. 软件测试nodejs面试题,nodejs单元测试和性能测试

    好算法理应正确.可读.健壮和效率高与低存储量:为保证正确性,多组输入数据测试这是必须条件:效率高和低存储这涉及了接口代码的性能测试.测试驱动开发TDD以实现有效和高效的算法代码. 一.安装配置 确保已 ...

  3. JavaScript对象中的构造方法

    JavaScript类/对象可以具有构造函数吗? 它们是如何创建的? #1楼 这是一个构造函数: function MyClass() {} 当你做 var myObj = new MyClass() ...

  4. 记一次.net core 集成vue 实践

    简介 以前我们总是喜欢用服务端渲染前端(虽然也有html+ajax这种做法),后来node诞生了,前端工具链(不如说生态)诞生了,大家都开始了前端的重构之路,本文将以一简单案例介绍下我们是如何在.ne ...

  5. 前端架构 IMVC 实时热更新模式

    Backbone 框架的逐渐衰退,前端 MVC 发展缓慢,有被 MVVM/Flux 所取代的趋势 React/Vue 和 Redux/Vuex 分别在 MVC 中的 View 层和 Model 层大施 ...

  6. e2e 测试 出现的错误

    每次开始学习vue的新知识时,总在环境这一块出现很多坑.这次我来记录一下,我在搭建vue e2e测试框架是踏过的坑吧. 我们都只知道,使用vue init webpack 项目名字<项目名字不能 ...

  7. ts 打开sourcemap_使用ts-node和vsc来调试TypeScript代码

    我之前写过一篇用vsc gulp来自动编译ts并重启程序的文章,不过后来发现这样做的工作比较多而且有很多不足,比如 运行或者调试需要等待编译完成,项目大了之后编译这一步还是需要一定的时间的 难以调试测 ...

  8. 整理web前端架构师应会必会的技术栈

    "Web前端架构师"所有的应会必会技术栈 脚手架-创建项目 包管理:lerna 环境变量:dotenv 命令行:commander log定制:npmlog 版本检查:semver ...

  9. 【前端面试题】—53道常见NodeJS基础面试题(附答案)

    说到前端就不得不提到后端,我们给用户展示页面所需的数据正是从后端获取的,所以了解后端的运行原理和技术的实现很有必要. Node. js是一个不错的选择,它是基于JavaScript语法的一套服务器端( ...

  10. 53道常见NodeJS基础面试题(附答案)

    点击下方"前端开发博客"关注公众号 回复"2"加入前端群 说到前端就不得不提到后端,我们给用户展示页面所需的数据正是从后端获取的,所以了解后端的运行原理和技术的 ...

最新文章

  1. 那个14岁上大学、17岁读博、24岁成教授的天才神童,如今怎样了?
  2. java最大子方阵_Java实验(5) 最大子方阵
  3. 如何查看SAP云平台哪些地域支持哪些服务
  4. 织梦同步静态文件到服务器,某猫织梦插件-织梦dedecms静态文件生成速度的区块插件...
  5. python 相对导入_python 相对导入与绝对导入
  6. discuz插件开发新手入门 超详细[转载]
  7. 改了两天的bug,一个JWT解决了。。。
  8. paip.提升用户体验---文件查找
  9. 腾讯X5内核浏览器的使用
  10. 后端开发面试自我介绍_Java后端面试总结
  11. 有哪些实用的电脑软件值得推荐?2021电脑装机必备便签软件
  12. 只有1kb的清理软件_教您清理1kb快捷方式病毒
  13. c语言打包游戏补丁,C语言实现的系统补丁自动安装工具.doc
  14. 大唐之路(4)一号店入驻要求
  15. Android 版本更新,支持增量更新
  16. html radio 默认选中
  17. 石膏板GCC认证床垫GCC认证亚马逊美国
  18. 使用 gomonkey Mock 函数及方法时遇到 panic: permission denied 的问题及解决方法
  19. 网络安全(一) 了解什么是黑客
  20. 2019年繁星屠龙1-8窍门_狂打一星,新版《倚天屠龙记》就那么烂?

热门文章

  1. 史上最全的 SQL 注入资料
  2. 详解节省计划,一文了解最云原生的成本优化方式
  3. python web 数据可视化框架_利用django框架,手把手教你搭建数据可视化系统(一)...
  4. 往事如烟 - 父亲母亲的居木子豆腐
  5. 【软件测试基础知识】SDK是什么?
  6. exe制作成安装包,Inno Setup软件使用教程
  7. php session fixation,Session Fixation 原理与防御
  8. Java使用IP代理突破IP限制进行投票
  9. CSS 权威指南 读书笔记(二)
  10. jQuery制作手风琴图片切换效果