Cách kiểm tra API REST Express.js bằng Cypress
Cypress là một khung thử nghiệm phổ biến được thiết kế riêng cho các ứng dụng JavaScript. Mặc dù nó được thiết kế chủ yếu để kiểm tra các thành phần giao diện người dùng và tương tác với các thành phần giao diện người dùng trong trình duyệt, nhưng nó cũng rất phù hợp để kiểm tra API. Bạn có thể sử dụng khung này để kiểm tra API RESTful thông qua các yêu cầu HTTP và xác thực các phản hồi.
Cypress cho phép tạo ra các bộ thử nghiệm mở rộng bao gồm toàn bộ phạm vi hoạt động của ứng dụng web, từ khi bắt đầu đến khi hoàn thành.
Bắt đầu kiểm tra API bằng Cypress
Cypress cho phép xác thực giao diện lập trình (API) của ứng dụng để đảm bảo rằng nó hoạt động theo thiết kế dự định. Là một phần của quy trình này, các điểm cuối, tham số đầu vào và phản hồi giao thức truyền siêu văn bản (HTTP) của API đều được kiểm tra. Ngoài ra, khả năng tương thích với bất kỳ hệ thống bên ngoài nào cũng được xác minh và chức năng của cơ chế xử lý lỗi được xác nhận.
Việc đảm bảo chức năng, độ tin cậy và sự phù hợp cho việc tích hợp ứng dụng API của bạn thông qua thử nghiệm là điều tối quan trọng. Việc xác định sớm và khắc phục mọi vấn đề sẽ ngăn chặn các vấn đề tiềm ẩn phát sinh trong môi trường sống.
Cypress là một công cụ kiểm tra giao diện người dùng tuyệt vời, được sử dụng bởi một số khung JavaScript phổ biến. Khả năng tạo và kiểm tra các yêu cầu HTTP giúp nó có hiệu quả tương đương trong việc kiểm tra API.
Ứng dụng này tận dụng Node.js làm công nghệ cơ bản để thực hiện các yêu cầu HTTP và quản lý các phản hồi tương ứng một cách hiệu quả.
Mã nguồn của dự án này có thể truy cập được thông qua kho lưu trữ GitHub chuyên dụng của nó.
Tạo API REST Express.js
Để bắt đầu quá trình, hãy thiết lập máy chủ web Express làm nền tảng và kết hợp gói này trong khuôn khổ dự án của bạn.
npm install cors
Để kết hợp chức năng của Cypress vào dự án hiện tại của bạn, bạn sẽ cần làm theo một loạt các bước liên quan đến việc cài đặt và định cấu hình các phần phụ thuộc cần thiết. Quá trình này bao gồm việc thêm gói Cypress làm nội dung trong tệp cấu hình hoặc kho lưu trữ của dự án, chỉ định phiên bản và vị trí của nó trên hệ thống của bạn và đảm bảo rằng nó được tích hợp đúng cách với các thành phần và mô-đun khác trong ứng dụng của bạn. Khi điều này đã hoàn thành, bạn có thể bắt đầu sử dụng Cypress để tự động hóa và kiểm tra các khía cạnh khác nhau trong quy trình phát triển phần mềm của mình, bao gồm tương tác của người dùng, lệnh gọi API và yêu cầu mạng.
npm install cypress --save-dev
Cuối cùng, sửa đổi tệp pack.json
của bạn để kết hợp tập lệnh thử nghiệm nói trên.
"test": "npx cypress open"
Xác định Bộ điều khiển API
Để thể hiện chức năng của ứng dụng của chúng tôi trong một tình huống thực tế, chúng tôi sẽ mô phỏng quá trình thực hiện lệnh gọi API để tương tác với cơ sở dữ liệu hoặc API bên ngoài. Mặc dù việc triển khai thực tế sẽ liên quan đến các tương tác như vậy nhưng để rõ ràng, chúng tôi sẽ sử dụng một mảng để lưu trữ và truy xuất dữ liệu người dùng trong phạm vi của ví dụ này.
Trong thư mục chính trong cấu trúc thư mục dự án của bạn, hãy thiết lập thư mục con “controllers” và trong đó, tạo tệp “userControllers.js”. Trong tệp này, bao gồm nội dung tiếp theo.
Thật vậy, chúng ta hãy bắt đầu bằng việc tạo ra một
const users = [];
exports.registerUser = async (req, res) => {
const { username, password } = req.body;
try {
const newUser = { username, password };
users.push(newUser);
res.status(201).send({ message: 'User registered successfully' });
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Sửa đổi hàm getAllUsers
hiện có để bao gồm một chức năng bổ sung truy xuất dữ liệu người dùng từ mảng và trả về dưới dạng phản hồi JSON. Hàm mới này được gọi là getUsers
.
exports.getUsers = async (req, res) => {
try {
res.json(users);
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Tóm lại, người ta có thể thực hiện các nỗ lực đăng nhập mô phỏng bằng cách kết hợp một đoạn mã cụ thể trong tập lệnh được cung cấp. Chức năng bổ sung này cho phép xác thực xem một bộ thông tin xác thực nhất định có tương ứng chính xác với thông tin được lưu trữ trong mảng “người dùng” hay không.
exports.loginUser = async (req, res) => {
const { username, password } = req.body;
try {
const user = users.find((u) =>
u.username === username && u.password === password);
if (user) {
res.status(200).send({ message: 'Login successful' });
} else {
res.status(401).send({ message: 'Invalid credentials' });
}
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Xác định các tuyến API
Để thiết lập cấu hình định tuyến cho ứng dụng RESTful dựa trên Express, bạn nên tạo một tệp mới có tên “routes/userRoutes.js” nằm trong thư mục chính của dự án. Tệp cụ thể này sẽ chứa nội dung sau:
const express = require('express');
const router = express.Router();
const userControllers = require('../controllers/userControllers');
const baseURL = '/v1/api/';
router.post(baseURL \+ 'register', userControllers.registerUser);
router.get(baseURL \+ 'users', userControllers.getUsers);
router.post(baseURL \+ 'login', userControllers.loginUser);
module.exports = router;
Cập nhật tệp Server.js
Sửa đổi nội dung của tệp server.js
bằng cách điều chỉnh cấu hình của nó theo các thông số kỹ thuật sau:
const express = require('express');
const cors = require('cors');
const app = express();
const port = 5000;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());
const userRoutes = require('./routes/userRoutes');
app.use('/', userRoutes);
app.listen(port, () => {
console.log(`Server is listening at http://localhost:${port}`);
});
module.exports = app;
Thiết lập môi trường thử nghiệm
Để thiết lập môi trường thử nghiệm cho giao diện lập trình ứng dụng trình diễn (API), hãy bắt đầu khởi tạo máy chủ phát triển bằng cách thực hiện lệnh đầu cuối nói trên.
node server.js
Tiếp theo, thực thi tập lệnh kiểm tra bằng cách sử dụng tập lệnh thực thi “kiểm tra” từ bên trong cửa sổ đầu cuối hoặc bảng điều khiển khác:
npm run test
Việc thực thi hướng dẫn này sẽ bắt đầu triển khai ứng dụng máy tính để bàn Cypress, ứng dụng này đóng vai trò như một nền tảng đánh giá. Sau khi cài đặt thành công, hãy điều hướng đến tab “Thử nghiệm E2E” và kích hoạt nó bằng cách nhấp vào nút được chỉ định. Đánh giá toàn diện bao gồm đánh giá toàn diện toàn bộ API Express, bao gồm máy chủ web, cấu hình tuyến đường và các mô-đun chức năng bộ điều khiển liên quan.
Vui lòng tiếp tục bằng cách nhấp vào “Tiếp tục” để kết hợp các tệp cấu hình Cypress.
Sau khi hoàn tất thành công quy trình thiết lập ban đầu, người dùng sẽ quan sát thấy sự hiện diện của thư mục Cypress mới được tạo trong dự án của họ. Ngoài ra, Cypress tự động tạo tệp cypress.config.js bao gồm các tham số cấu hình của bộ thử nghiệm.
Vui lòng sửa đổi tài liệu này bằng cách kết hợp địa chỉ cơ sở máy chủ của bạn theo cách sau:
const { defineConfig } = require("cypress");
module.exports = defineConfig({
chromeWebSecurity: false,
e2e: {
baseUrl: 'http://localhost:5000',
setupNodeEvents(on, config) {
},
},
});
##Viết ca kiểm thử
Để bắt đầu viết trường hợp kiểm thử bằng Cypress, hãy bắt đầu bằng cách chọn trình duyệt web mong muốn để kiểm thử trong số các tùy chọn có sẵn trong giao diện Cypress.
Khi nhấp vào nút “Tạo thông số kỹ thuật mới”, vui lòng cung cấp tiêu đề cho trường hợp thử nghiệm của bạn, sau đó nhấp vào tùy chọn “Tạo thông số kỹ thuật”.
Vui lòng chỉnh sửa nội dung của tệp “cypress/fixtures/example.json” bằng cách kết hợp thông tin xác thực người dùng được cung cấp. Các tệp cố định đóng vai trò là kho lưu trữ dữ liệu thử nghiệm cố định có thể được sử dụng trong bộ thử nghiệm.
{
"username": "testuser",
"password": "password123"
}
Cypress cung cấp một cách tiếp cận linh hoạt để thực hiện các yêu cầu HTTP thông qua lệnh cy.request
được tích hợp sẵn. Tính năng này cho phép các nhà phát triển tương tác với nhiều loại điểm cuối HTTP khác nhau xử lý các chức năng đa dạng như GET, POST, PUT và DELETE.
Để xác thực chức năng của ba điểm cuối API đã triển khai trước đó, chúng tôi phải bắt đầu bằng việc xây dựng kịch bản thử nghiệm cho quy trình đăng ký. Mục tiêu chính của kịch bản thử nghiệm này là xác nhận rằng điểm cuối hoạt động như dự kiến bằng cách tạo tài khoản người dùng mới một cách hiệu quả và xác minh các xác nhận liên quan.
Vui lòng mở tệp “cypress/e2e/user.routes.spec.cy.js” và thay thế nội dung hiện có của nó bằng đoạn mã được cung cấp bên dưới:javascriptdescribe(‘User Routes’, ()=> {it(’nên có một mã thích hợp thanh điều hướng trên thiết bị di động’, (done)=> {cy.visit(’/’)cy.get(’#app-title’). Should(‘have.text’,‘My Website’);cy.get (’.burger’).click();cy.get(’#menu-toggle’). Should(‘be.visible’);cy.get(’#profile-btn’).click({ Force: true });cy.url(). Should(‘include’,’/dashboard’);cy.get(’#nav-links li:nth-child(1) a’).
describe('User Routes', () => {
it('registers a new user', () => {
cy.fixture('example').then((testUser) => {
cy.request({
method: 'POST',
url: `${baseUrl}/v1/api/register`,
body: testUser,
}).then((response) => {
expect(response.status).to.eq(201);
expect(response.body.message).to.eq('User registered successfully');
});
});
});
Trong quá trình thực hiện đánh giá này, Cypress sẽ sử dụng thông tin được cung cấp trong tệp lịch thi đấu để tạo ra một loạt yêu cầu POST hướng tới điểm cuối được chỉ định, kèm theo các chi tiết có trong nội dung yêu cầu. Nếu mỗi xác nhận được xác nhận là chính xác thì phiên bản thử nghiệm sẽ được coi là thành công và được coi là đã đạt. Ngược lại, nếu bất kỳ xác nhận nào không đáp ứng được tiêu chí đã thiết lập thì trường hợp kiểm thử tổng thể sẽ được coi là không thành công và bị đánh dấu là không thành công.
Các bài kiểm tra Cypress được cấu trúc bằng cú pháp tương tự như cú pháp được sử dụng bởi các bài kiểm tra Mocha, vì Cypress đã tích hợp khung kiểm tra này.
Để xác thực rằng phản hồi do điểm cuối người dùng
tạo ra mang lại thông tin người dùng thích hợp khi nhận được yêu cầu tại vị trí đã nói, bắt buộc phải kết hợp các biện pháp sau trong bộ thử nghiệm mô tả
bao gồm.
it('gets users data and the username matches test data', () => {
cy.fixture('example').then((expectedUserData) => {
cy.request({
method: 'GET',
url: `${baseUrl}/v1/api/users`,
}).then((response) => {
expect(response.status).to.eq(200);
const username = response.body[0].username;
expect(username).to.eq(expectedUserData.username);
});
});
});
Cuối cùng, kết hợp một kịch bản thử nghiệm để đánh giá điểm cuối đăng nhập và xác nhận rằng trạng thái phản hồi HTTP là 200, biểu thị một lần đăng nhập thành công.
it('logs in a user', () => {
cy.fixture('example').then((loginData) => {
cy.request({
method: 'POST',
url: `${baseUrl}/v1/api/login`,
body: loginData,
}).then((response) => {
expect(response.status).to.eq(200);
});
});
});
});
Để thực hiện kiểm tra, hãy điều hướng quay lại ứng dụng web đang được Cypress giám sát và chọn tập lệnh kiểm tra cụ thể mà bạn muốn thực thi trong số những tập lệnh có sẵn.
Việc thực thi trình chạy thử nghiệm Cypress sẽ dẫn đến việc thử nghiệm và ghi lại kết quả cho từng trường hợp thử nghiệm riêng lẻ, hiển thị xem chúng đã đạt hay không đạt.
Để đánh giá toàn diện hiệu suất và độ tin cậy của API, điều quan trọng là phải mở rộng phạm vi thử nghiệm ngoài việc chỉ kiểm tra các khía cạnh chức năng của nó. Bằng cách khám phá các lớp tương tác bổ sung giữa giao diện lập trình ứng dụng và các thành phần khác liên quan đến việc xử lý yêu cầu hoặc phản hồi, có thể đạt được đánh giá toàn diện hơn về hiệu suất và hiệu suất tổng thể của hệ thống.
Một cách tiếp cận toàn diện để kiểm thử API không chỉ bao gồm chức năng mà còn bao gồm các khía cạnh như hiệu suất, khả năng mở rộng và tích hợp với các hệ thống bên ngoài. Để đạt được mục đích này, việc kết hợp nhiều phương pháp thử nghiệm đa dạng trong chiến lược thử nghiệm của bạn là điều cần thiết để đạt được phạm vi thử nghiệm toàn diện và đảm bảo độ tin cậy cũng như tính ổn định của API ứng dụng của bạn trước khi triển khai chúng trong môi trường trực tiếp.
Kiểm tra toàn bộ trải nghiệm web của bạn bằng Cypress
Cypress là một nguồn tài nguyên đặc biệt để đánh giá các ứng dụng dựa trên web một cách dễ dàng, bao gồm các đánh giá toàn diện về cả giao diện người dùng và các thành phần phía máy chủ.
Việc sử dụng các công cụ kiểm tra trực quan của chúng tôi cho phép dễ dàng tạo ra một môi trường kiểm tra toàn diện trong một nền tảng duy nhất. Điều này cho phép đánh giá sâu rộng các khía cạnh khác nhau của phần mềm, đảm bảo chức năng tối ưu và hiệu suất vượt trội.