【node.js】学习篇:jest单元测试
【node.js】学习篇:jest单元测试
单元测试以及其意义
-
单个功能或接口,给定输入,得到输出。看输出是否符合要求;
-
需要手动编写测试用例,然后统一执行;
-
意义:能一次性执行所有单元测试,短时间内验证所有功能是否正常。
如何在koa2项目中使用jest
-
文件后缀必须是 *.test.js 只有这类文件层能被使用
-
常用的断言
-
测试http接口
下载 jest 依赖
npm i jest --save-dev
配置 package.json
--runInBand 在当前进程中连续运行所有测试,也就是 一个一个来不要拥挤。
--forceExit 在所有测试完成运行后强制 Jest 退出。
--colors 测试结果输出突出显示。
更多启动配置可以查看官方文档。
...
"scripts": {
"start": "node bin/www",
"dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
"prd": "cross-env NODE_ENV=production pm2 start bin/www",
+ "test": "cross-env NODE_ENV=test jest --runInBand --forceExit --colors"
},
...
简单的使用
我们在 src 目录下新建一个 test 文件夹,然后在 test 文件夹下新建 demo.test.js 文件,编写如下代码:
/**
* @description test demo
* @author mosaic
*/
const sum = (a, b) => a + b
test('10 + 20 is 30', () => {
const res = sum(10, 20)
expect(res).toBe(30)
})
随后使用 npm run test
运行项目
> deep-search-backend@0.1.0 test /Users/mosaic/Desktop/projectFolder/my.nosync/BackendDemo/search-backend
> cross-env NODE_ENV=test jest --runInBand --forceExit --colors
PASS src/test/demo.test.js
✓ 10 + 20 is 30 (1 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.306 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?
可以看到测试用例正常通过!!!
测试 HTTP 接口
首先需要先为项目安装一个 supertest
插件;
npm i supertest --save-dev
随后我们就可以在 test 文件夹下新建 server.js 文件,编写如下代码:
这一步,是为让我们的测试用例能正常的向服务器发送请求。
/**
* @description 为测试用例 启动 server 发送请求
* @author mosaic
*/
const request = require('supertest')
const server = require('../app').callback()
module.exports = request(server)
然后,在同样的目录下,新建一个 json.test.js 的测试用例文件,写入如下代码:
/**
* @description json路由的测试用例
* @author mosaic
*/
const server = require('./server')
// 网络接口相关的测试用例 要注意使用异步操作
test('json 接口返回数据格式测试', async () => {
const res = await server.get('/json')
// toEqual 用来断言对象是否相等;toBe 用来断言值是否相等
expect(res.body).toEqual({
title: 'koa2 json',
viewNum: 1
})
})
这段代码运行的时候,会向 /json
路径发送请求,随后拿到反悔的值,再将该值与测试用例的值做比对;
> deep-search-backend@0.1.0 test /Users/mosaic/Desktop/projectFolder/my.nosync/BackendDemo/search-backend
> cross-env NODE_ENV=test jest --runInBand --forceExit --colors
PASS src/test/json.test.js
● Console
console.log
<-- GET /json
at printFunc (node_modules/koa-logger/index.js:52:17)
console.log
--> GET /json 200 9ms 33b
at printFunc (node_modules/koa-logger/index.js:52:17)
PASS src/test/demo.test.js
Test Suites: 2 passed, 2 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 0.734 s, estimated 1 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?
可以看到这里发送请求并且成功通过了测试用例。
上面演示的是get请求,如果是post请求,我们就需要项目服务器send相应的数据,然后再根据需要对返回的数据进行相应的断言即可!
/**
* @description json路由的测试用例
* @author mosaic
*/
const server = require('./server')
// 网络接口相关的测试用例 要注意使用异步操作
test('json 接口返回数据格式测试', async () => {
const res = await server.post('/json').send({
pasword:123
})
...
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?