Cách kiểm tra API REST của Node.js bằng Mocha, Chai và Chai-HTTP
Phát triển phần mềm hiện đại sử dụng rất nhiều API. Chúng phục vụ như một liên kết quan trọng giữa các ứng dụng phía máy khách và ứng dụng phụ trợ, cũng như giữa các ứng dụng nội bộ hoặc bên ngoài khác nhau.
API cho phép giao tiếp và trao đổi dữ liệu trơn tru, cho phép các thành phần phần mềm tương tác liền mạch với nhau. Việc đảm bảo độ tin cậy, chức năng và hiệu suất của các API này là vô cùng quan trọng để mang lại trải nghiệm người dùng liền mạch và duy trì tính toàn vẹn tổng thể của hệ thống.
Do đó, điều quan trọng là phải kiểm tra kỹ lưỡng các API của bạn để gắn cờ và khắc phục lỗi trong quá trình phát triển nhằm ngăn chặn lỗi hệ thống tiềm ẩn trong môi trường sản xuất.
Mục Lục
Kiểm tra API Node.js bằng Mocha, Chai và Chai-HTTP
Mocha là một khung thử nghiệm được sử dụng rộng rãi, tương thích với các khung JavaScript khác nhau. Một trong những tính năng chính của nó là trình chạy thử nghiệm linh hoạt giúp đơn giản hóa quy trình quản lý và thực hiện các trường hợp thử nghiệm một cách hiệu quả.
Nó cũng hỗ trợ các kiểu thử nghiệm khác nhau, bao gồm cả thử nghiệm đồng bộ và không đồng bộ, cho phép thực hiện nhiều tình huống thử nghiệm khác nhau.
Mặt khác, Chai và Chai-HTTP là các thư viện xác nhận mà bạn có thể sử dụng cùng với Mocha. Chai cung cấp một loạt các giao diện xác nhận rõ ràng và dễ đọc như nên, mong đợi và khẳng định. Trong khi, Chai-HTTP, một phần mở rộng của Chai, cung cấp giao diện được thiết kế đặc biệt để kiểm tra các yêu cầu HTTP và xác nhận phản hồi của chúng.
Bằng cách sử dụng Mocha kết hợp với Chai và Chai-HTTP, bạn có thể kiểm tra các API một cách hiệu quả. Quy trình kiểm thử bao gồm:
- Thực hiện các yêu cầu HTTP tới các điểm cuối API được chỉ định.
- Xác định các câu trả lời dự kiến.
- Xác thực dữ liệu đã nhận từ nguồn được chỉ định, mã trạng thái HTTP, v.v.
Bạn cũng có thể mô phỏng các tình huống kiểm tra lỗi API có thể phát sinh trong các tình huống như vậy và những hành động nào sẽ kích hoạt trong trường hợp chúng xảy ra.
Thiết lập Dự án Express.js và Cơ sở dữ liệu MongoDB
Để bắt đầu, hãy tạo một máy chủ web Express và cài đặt các gói sau:
npm install cors dotenv mongoose mongodb
Tiếp theo, tạo cơ sở dữ liệu MongoDB hoặc định cấu hình cụm MongoDB trên đám mây. Sau đó sao chép URL kết nối cơ sở dữ liệu, tạo một .env tệp trong thư mục gốc và dán vào chuỗi kết nối cơ sở dữ liệu:
CONNECTION_STRING="connection string"
Để hoàn tất quá trình thiết lập, bạn cần định cấu hình kết nối cơ sở dữ liệu và xác định mô hình dữ liệu cho dữ liệu người dùng của mình. Tham khảo mã trong kho lưu trữ GitHub của dự án này để:
Xác định chức năng xử lý cho các tuyến API
Các chức năng của bộ điều khiển sẽ quản lý việc thêm và lấy dữ liệu của người dùng trong cơ sở dữ liệu. Để đảm bảo chức năng của các hàm xử lý này, bạn sẽ kiểm tra xem chúng có thể đăng và tìm nạp dữ liệu từ cơ sở dữ liệu thành công hay không.
Trong thư mục gốc, tạo một bộ điều khiển/userControllers.js tập tin và thêm đoạn mã sau:
const User = require('../models/user.model');exports.registerUser = async (req, res) => {
const { username, password } = req.body;
try {
await User.create({ username, password});
res.status(201).send({ message: 'User registered successfully' });
} catch (error) {
console.log(error);
res.status(500).send({ message: 'An error occurred!! ' });
}
};
exports.getUsers = async (req, res) => {
try {
const users = await User.find({});
res.json(users);
} catch (error) {
console.log(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Xác định các tuyến API
Tạo một cái mới tuyến/userRoutes.js tập tin trong thư mục gốc và thêm mã sau đây.
const express = require('express');
const router = express.Router();
const userControllers = require('../controllers/userControllers');router.post('/api/register', userControllers.registerUser);
router.get('/api/users', userControllers.getUsers);
module.exports = router;
Xác định điểm vào máy chủ của bạn
cập nhật của bạn máy chủ.js tập tin với mã sau đây.
const express = require('express');
const cors = require('cors');
const app = express();
const port = 5000;
require('dotenv').config();
const connectDB = require('./utils/db');connectDB();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());
const userRoutes = require('./routes/userRoutes');
app.use("https://www.smartreviewaz.com/", userRoutes);
app.listen(port, () => {
console.log(`Server is listening at http://localhost:${port}`);
});
module.exports = app;
Viết và thực hiện các trường hợp thử nghiệm với Mocha
Khi đã có API người dùng, hãy tiếp tục và định cấu hình môi trường thử nghiệm. Đầu tiên, cài đặt các gói này dưới dạng phần phụ thuộc của nhà phát triển.
npm install mocha chai chai-http --save-dev
Bây giờ, hãy thêm đoạn mã sau vào tệp pack.json của bạn.
"scripts": {
"test": "mocha --timeout 10000"
},
Lệnh này sẽ thực thi các trường hợp thử nghiệm—việc thêm thuộc tính thời gian chờ với một giá trị thích hợp cho phép bạn kiểm soát thời gian tối đa được phép thực hiện đối với các trường hợp thử nghiệm riêng lẻ.
Điều này có thể hữu ích để ngăn các bài kiểm tra chạy vô thời hạn hoặc hoàn thành quá nhanh trước khi các trường hợp kiểm tra kết thúc.
Kiểm tra điểm cuối API
Trong thư mục gốc, tạo một thư mục mới và đặt tên cho nó Bài kiểm tra. Trong thư mục này, tạo một thư mục mới người dùng.tests.js tệp và thêm đoạn mã sau cho trường hợp kiểm tra điểm cuối POST.
const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../server'); chai.use(chaiHttp);
const expect = chai.expect;
describe('User API', () => {
describe('POST /api/register', () => {
it('should handle user registration', (done) => {
chai.request(app)
.post('/api/register')
.send({ username: 'testUser', password: 'testpassword' })
.end((err, res) => {
if (err) {
expect(res).to.have.status(500);
expect(res.body).to.have.property('message').that.is.equal('An error occurred!!');
} else {
expect(res).to.have.status(201);
expect(res.body).to.have.property('message').equal('User registered successfully');
}
done();
});
});
});
});
Mã này xác định trường hợp thử nghiệm sử dụng Chai và Chai HTTP để kiểm tra chức năng đăng ký người dùng của API người dùng.
Nó gửi một yêu cầu POST đến điểm cuối đã chỉ định và đưa ra các xác nhận về phản hồi API dự kiến, xác minh xem chức năng đăng ký người dùng có thành công hay có xảy ra lỗi hay không.
Dưới đây là bảng phân tích các thành phần chính của trường hợp thử nghiệm:
- trông chờ -Đối tượng này cho phép bạn sử dụng các phương thức xác nhận Chai để đưa ra xác nhận về phản hồi dự kiến từ API.
- mô tả – Nó mô tả các test case liên quan với nhau, trong trường hợp này là các test liên quan đến API người dùng. Khối mô tả lồng nhau nhóm các trường hợp thử nghiệm liên quan với nhau, trong trường hợp này, ĐĂNG /api/đăng ký. Điều này giúp tổ chức các trường hợp thử nghiệm liên quan cụ thể đến một chức năng cụ thể.
- Nó – Chức năng này mô tả hành vi dự kiến của điểm cuối API.
- kết thúc – Hàm này gửi yêu cầu và cung cấp hàm gọi lại để xử lý phản hồi. Hàm gọi lại thực hiện các xác nhận bằng cách sử dụng trông chờ để kiểm tra phản hồi nhận được từ API.
- xong – Chức năng này chạy để đánh dấu kết thúc test case.
Cuối cùng, thêm mã cho trường hợp kiểm tra điểm cuối GET ngay sau trường hợp kiểm tra điểm cuối POST.
describe('GET /api/users', () => {
it('should fetch all user data', (done) => {
chai.request(app)
.get('/api/users')
.end((err, res) => {
if (err) {
expect(res).to.have.status(500);
expect(res.body).to.have.property('message').that.is.equal('An error occurred while fetching user data');
} else {
expect(res).to.have.status(200);
expect(res.body).to.be.an('array');
} done();
});
});
});
Hãy tiếp tục và chạy tập lệnh thử nghiệm trên thiết bị đầu cuối của bạn để thực hiện hai trường hợp thử nghiệm.
npm test
Nếu việc thực hiện các trường hợp thử nghiệm không gặp phải bất kỳ lỗi nào, bạn sẽ thấy đầu ra tương tự cho biết rằng các thử nghiệm đã vượt qua thành công.
Lỗi thử nghiệm có thể xảy ra do nhiều lý do, chẳng hạn như sự cố kết nối mạng trong khi yêu cầu HTTP tới cơ sở dữ liệu, thiếu dữ liệu bắt buộc, lỗi logic và các sự cố khác.
Mocha thực hiện tốt việc xác định và đánh dấu các lỗi như vậy, cung cấp các báo cáo kiểm tra rõ ràng và chi tiết trong nhật ký hiển thị trên cửa sổ đầu cuối. Điều này cho phép bạn dễ dàng xác định và chẩn đoán các sự cố cụ thể gây ra lỗi thử nghiệm.
Mocha không cho bạn lý do gì để không kiểm tra API của mình
Mặc dù kiểm tra thủ công chức năng của các API của bạn bằng các công cụ như Postman là một phương pháp kiểm tra hợp lệ, nhưng việc tận dụng Mocha và các khung kiểm tra khác để kiểm tra tự động sẽ đưa nó lên một tầm cao mới.
Với các công cụ kiểm tra này, bạn có thể nhanh chóng và dễ dàng tự động hóa các kiểm tra để bao quát nhiều tình huống và trường hợp cạnh. Điều này cho phép bạn nhanh chóng phát hiện lỗi và giải quyết chúng trước khi triển khai API của mình, đảm bảo bạn vận chuyển phần mềm chất lượng cao vào sản xuất.