0


mocha——单元测试

文章目录

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

单元测试由开发人员执行。

将测试用例放到一个测试模块里,就是一个完整的单元测试。

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,assertassert风格
var chai =require("chai")var assert = chai.assert

describe('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.expect

describe('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.exist
        expect(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 =newkoa()

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()=>{awaitsupertest(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 server
    it('返回html代码片段测试2',async()=>{awaitsupertest(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("每一个测试用例结束后执行")})})

输出:
在这里插入图片描述


本文转载自: https://blog.csdn.net/mantou_riji/article/details/125740354
版权归原作者 _洋 所有, 如有侵权,请联系我们删除。

“mocha——单元测试”的评论:

还没有评论