在前端开发中,测试是不可或缺的,使得开发者可以保证代码的质量和可靠性。集成测试是其中一种测试类型,可以确保多个组件协同工作的正确性。Node.js 下的 Jest 和 SuperTest 是两个流行的测试工具,可以方便地进行集成测试,本文将介绍它们的使用。
什么是 Jest 和 SuperTest
Jest 是 Facebook 开发的 JavaScript 测试框架,能够支持基于 Babel、TypeScript 和 Node.js 等多种技术栈的测试。在单元测试和集成测试方面都有深入的支持和丰富的功能,能够进行快照测试、覆盖率统计、并发测试等操作。
SuperTest 是 SuperAgent 的测试库,能够对 Express 和 Connect 等 Web 应用进行测试。它提供了链式调用 API,方便构建 HTTP 请求和断言响应数据,也支持表单、JSON 等多种请求实体类型。
集成测试示例
假设我们有以下一个 RESTful API:提供获取一篇博客文章 /blogs/:id、新建博客文章 /blogs 和修改博客文章 /blogs/:id,使用了 MongoDB 数据库存储数据。现在需要对其进行集成测试,验证接口的正确性。
安装 Jest 和 SuperTest
进入项目文件夹,使用 npm 安装相应模块。
npm install jest supertest --save-dev
编写测试用例
在项目根目录下新建 tests 文件夹,创建 blogs.test.js 文件。此处通过 beforeAll 和 afterAll 函数分别启动和关闭测试用的 MongoDB 数据库,保证测试用例之间不互相影响。
// javascriptcn.com 代码示例 const request = require('supertest'); const app = require('../app'); const mongoose = require('mongoose'); const Blog = require('../models/Blog'); beforeAll(async () => { await mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true }); }); afterAll(async () => { await mongoose.connection.close(); }); describe('blogs', () => { const blog1 = { title: 'Blog 1', content: 'Content 1' }; let blog1Id = ''; const blog2 = { title: 'Blog 2', content: 'Content 2' }; let blog2Id = ''; const blog3 = { title: 'Blog 3', content: 'Content 3' }; beforeAll(async () => { const res1 = await request(app).post('/blogs').send(blog1); blog1Id = res1.body._id; const res2 = await request(app).post('/blogs').send(blog2); blog2Id = res2.body._id; }); afterAll(async () => { await Blog.deleteMany({}); }); it('gets a blog', async () => { const res = await request(app).get(`/blogs/${blog1Id}`); expect(res.status).toEqual(200); expect(res.body.isLive).toBe(true); expect(res.body.title).toEqual(blog1.title); expect(res.body.content).toEqual(blog1.content); }); it('creates a blog', async () => { const res = await request(app).post('/blogs').send(blog3); expect(res.status).toEqual(201); expect(res.body.isLive).toBe(true); expect(res.body.title).toEqual(blog3.title); expect(res.body.content).toEqual(blog3.content); }); it('updates a blog', async () => { const res = await request(app) .put(`/blogs/${blog2Id}`) .send({ ...blog2, content: 'New Content' }); expect(res.status).toEqual(200); expect(res.body.isLive).toBe(true); expect(res.body.title).toEqual(blog2.title); expect(res.body.content).toEqual('New Content'); }); });
运行测试
在 package.json 文件中配置 Jest 的测试命令:
{ "scripts": { "test": "jest --coverage" } }
在命令行中执行 npm test 命令,将会运行 tests 文件夹中的所有测试用例,并报道测试结果和覆盖率统计信息。例如:
// javascriptcn.com 代码示例 PASS tests/blogs.test.js blogs ✓ gets a blog (116 ms) ✓ creates a blog (75 ms) ✓ updates a blog (81 ms) ----------------------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------|---------|----------|---------|---------|------------------- models/ | 100 | 100 | 100 | 100 | Blog.js | 100 | 100 | 100 | 100 | routes/ | 100 | 100 | 100 | 100 | blogs.js | 100 | 100 | 100 | 100 | app.js | 100 | 100 | 100 | 100 | ----------------------|---------|----------|---------|---------|------------------- All files | 100 | 100 | 100 | 100 | ----------------------|---------|----------|---------|---------|------------------- Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total
分析测试用例
测试用例中可以看出,通过请求 /blogs/:id 获取博客文章、请求 /blogs 新建博客文章、请求 /blogs/:id 修改博客文章,然后对响应的状态码和数据进行断言,以验证 API 是否按照预期运行。
对于 SuperTest,request 函数构成了请求的核心。所有请求操作,如 GET、POST、PUT 等都可以通过该函数建立请求。在本例中,设置了博客文章的测试数据和 ID,先对博客文章进行新建操作,然后再通过 ID 进行获取和修改。此外,还使用了 async / await 异步操作,保证了函数的执行顺序。
总结
Jest 和 SuperTest 作为前端开发中流行的测试工具,具有丰富的功能和易用性。本文从一个示例出发,介绍了如何使用它们进行集成测试,并详细地解释了 API 的使用方法和实现原理。相信读者可以通过本文的学习,更好地掌握测试技术,提高代码质量和效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653dfad27d4982a6eb795179