Ինչպես փորձարկել Express.js REST API-ները Cypress-ի միջոցով
Cypress-ը հիանալի է ճակատային թեստավորման համար, բայց այն կարող է նաև արդյունավետորեն փորձարկել ձեր API-ները:
Cypress-ը հայտնի փորձարկման շրջանակ է, որը հարմարեցված է JavaScript հավելվածների համար: Թեև այն հիմնականում նախագծված է UI բաղադրիչները և փոխազդեցությունները բրաուզերում UI տարրերի հետ փորձարկելու համար, այն նաև հարմար է API-ների փորձարկման համար: Դուք կարող եք օգտագործել շրջանակը՝ RESTful API-ները HTTP հարցումների միջոցով փորձարկելու և պատասխանները վավերացնելու համար:
Cypress-ը թույլ է տալիս գրել համապարփակ թեստեր, որոնք ընդգրկում են ձեր վեբ հավելվածի աշխատանքային հոսքի ողջ սպեկտրը:
Ինչպես սկսել API-ի փորձարկումով Cypress-ի միջոցով
Cypress-ը օգնում է ձեզ ստուգել, որ ձեր API-ներն աշխատում են այնպես, ինչպես դուք ակնկալում եք: Այս գործընթացը սովորաբար ներառում է API-ի վերջնակետերի, մուտքային տվյալների և HTTP պատասխանների փորձարկում: Դուք կարող եք ստուգել ինտեգրումը ցանկացած արտաքին ծառայությունների հետ և հաստատել, որ սխալների հետ աշխատելու մեխանիզմները ճիշտ են աշխատում:
Ձեր API-ների փորձարկումը երաշխավորում է, որ դրանք գործունակ են, հուսալի և բավարարում են դրանցից կախված հավելվածների կարիքները: Այն օգնում է վաղաժամ հայտնաբերել և շտկել սխալները՝ կանխելով արտադրության մեջ խնդիրների առաջացումը:
Cypress-ը UI-ի փորձարկման հիանալի գործիք է, որն օգտագործվում է որոշ հայտնի JavaScript շրջանակների կողմից: HTTP հարցումներ կատարելու և փորձարկելու նրա կարողությունը հավասարապես արդյունավետ է դարձնում API-ների փորձարկումը:
Այն դա անում է՝ օգտագործելով Node.js-ը որպես շարժիչ՝ HTTP հարցումներ կատարելու և դրանց պատասխանները կարգավորելու համար:
Դուք կարող եք գտնել այս նախագծի կոդը նրա GitHub պահոցում:
Ստեղծեք Express.js REST API
Սկսելու համար ստեղծեք Էքսպրես վեբ սերվեր և տեղադրեք այս փաթեթը ձեր նախագծում.
npm install cors
Հաջորդը, ավելացրեք Cypress փաթեթը ձեր նախագծին.
npm install cypress --save-dev
Վերջապես, թարմացրեք ձեր package.json ֆայլը՝ այս թեստային սցենարը ներառելու համար.
"test": "npx cypress open"
Սահմանեք API վերահսկիչները
Իրական կյանքում դուք API-ի զանգեր կանեիք տվյալների բազայից կամ արտաքին API-ից կարդալու և գրելու համար: Այնուամենայնիվ, այս օրինակի համար դուք նմանակելու և փորձարկելու եք նման API զանգեր՝ ավելացնելով և բեռնելով օգտվողի տվյալները զանգվածից:
Ձեր նախագծի թղթապանակի արմատային գրացուցակում ստեղծեք controllers/userControllers.js ֆայլ և ավելացրեք հետևյալ կոդը:
Նախ, սահմանեք registerUser controller ֆունկցիա, որը կկառավարի օգտվողի գրանցման երթուղին: Այն կհանի օգտատիրոջ տվյալները հարցման մարմնից, կստեղծի օգտվողի նոր օբյեկտ և կավելացնի այն օգտատերերի զանգվածում: Եթե գործընթացը հաջող է, այն պետք է պատասխանի 201 կարգավիճակի կոդով և հաղորդագրությամբ, որը ցույց է տալիս, որ գրանցել է օգտվողին:
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!!' });
}
};
Ավելացրե՛ք երկրորդ ֆունկցիան՝getUsers՝ զանգվածից օգտվողի տվյալները առբերելու և որպես JSON պատասխան վերադարձնելու համար:
exports.getUsers = async (req, res) => {
try {
res.json(users);
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Վերջապես, դուք կարող եք նաև մոդելավորել մուտքի փորձերը: Նույն ֆայլում ավելացրեք այս կոդը՝ ստուգելու համար, թե արդյոք տվյալ օգտանունը և գաղտնաբառը համընկնում են օգտատերերի զանգվածի որևէ օգտվողի տվյալների հետ.
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!!' });
}
};
Սահմանեք API-ի երթուղիները
Ձեր Express REST API-ի երթուղիները սահմանելու համար արմատական գրացուցակում ստեղծեք նոր routes/userRoutes.js ֆայլ և ավելացրեք այս կոդը դրան.
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;
Թարմացրեք Server.js ֆայլը
Թարմացրեք server.js ֆայլը՝ API-ն կարգավորելու համար հետևյալ կերպ.
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;
Ստեղծեք փորձարկման միջավայրը
Դեմո API-ի առկայության դեպքում դուք պատրաստ եք կարգավորել փորձարկման միջավայրը: Սկսեք զարգացման սերվերը այս տերմինալի հրամանով.
node server.js
Հաջորդը, գործարկեք թեստային սցենարի հրամանը առանձին տերմինալում.
npm run test
Այս հրամանը կգործարկի Cypress աշխատասեղանի հաճախորդը, որն ապահովում է թեստավորման միջավայրը: Այն բացվելուց հետո սեղմեք E2E Testing կոճակը: End-to-end թեստերը ապահովում են, որ դուք փորձարկեք Express API-ն ամբողջությամբ, ինչը նշանակում է, որ Cypress-ը մուտք կունենա վեբ սերվեր, երթուղիներ և հարակից վերահսկիչի գործառույթներ:
Հաջորդը սեղմեք Շարունակել՝ Cypress-ի կազմաձևման ֆայլեր ավելացնելու համար:
Կարգավորման գործընթացն ավարտվելուց հետո դուք պետք է տեսնեք նոր Cypress թղթապանակ ձեր նախագծում: Cypress-ը նաև կավելացնի cypress.config.js ֆայլ, որը պարունակում է ձեր թեստերի կազմաձևման կարգավորումները:
Շարունակեք և թարմացրեք այս ֆայլը, որպեսզի ներառի ձեր սերվերի բազայի URL-ը հետևյալ կերպ.
const { defineConfig } = require("cypress");
module.exports = defineConfig({
chromeWebSecurity: false,
e2e: {
baseUrl: 'http://localhost:5000',
setupNodeEvents(on, config) {
},
},
});
Գրեք թեստի դեպքերը
Այժմ դուք պատրաստ եք գրել որոշ թեստային դեպքեր: Նախ ընտրեք այն զննարկիչը, որով Cypress-ը կգործարկի թեստերն իրականացնելու համար Cypress հաճախորդի վրա առկա տարբերակներից:
Հաջորդը, սեղմեք Ստեղծել նոր սպեկտր կոճակը՝ ձեր թեստային ֆայլը ստեղծելու համար և անուն տվեք: Այնուհետև սեղմեք Ստեղծել սպեցիֆիկացիա:
Այժմ բացեք cypress/fixtures/example.json ֆայլը և թարմացրեք դրա բովանդակությունը հետևյալ օգտվողի հավատարմագրերով: Հարմարանքները ֆայլեր են, որոնք պարունակում են ստատիկ թեստի տվյալներ, որոնք կարող եք օգտագործել թեստային դեպքերում:
{
"username": "testuser",
"password": "password123"
}
Cypress-ը տրամադրում է cy.request մեթոդ՝ վեբ սերվերին HTTP հարցումներ կատարելու համար: Դուք կարող եք օգտագործել այն՝ փորձարկելու տարբեր տեսակի HTTP վերջնակետեր, որոնք կառավարում են տարբեր գործողություններ՝ ներառյալ GET, POST, PUT և DELETE:
Նախկինում ձեր կողմից սահմանված API-ի երեք երթուղիները փորձարկելու համար սկսեք նկարագրելով ռեգիստրի վերջնակետի փորձնական դեպքը: Այս փորձնական դեպքը պետք է ստուգի, որ վերջնակետը ճիշտ է աշխատում՝ հաջողությամբ գրանցելով նոր օգտվող և հաստատելով պնդումները:
Բացեք cypress/e2e/user.routes.spec.cy.js ֆայլը և թարմացրեք դրա բովանդակությունը հետևյալ կոդով։
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');
});
});
});
Այս թեստում Cypress-ը կբեռնի թեստի տվյալները հարմարանքների ֆայլում և POST հարցումներ կկատարի նշված վերջնակետին՝ հարցման մարմնի տվյալների հետ: Եթե բոլոր պնդումները անցնեն, ապա թեստը կանցնի։ Հակառակ դեպքում այն կձախողվի։
Հարկ է նշել, որ Cypress թեստերի շարահյուսությունը շատ նման է Mocha թեստերում օգտագործվող շարահյուսությանը, որն ընդունել է Cypress-ը:
Այժմ նկարագրեք թեստը օգտագործողների երթուղու համար: Թեստը պետք է ստուգի, որ պատասխանը պարունակում է օգտվողի տվյալներ, երբ հարցումներ են արվում այս վերջնական կետին: Դրան հասնելու համար ավելացրեք հետևյալ կոդը նկարագրել թեստային բլոկում:
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);
});
});
});
Վերջապես, ներառեք փորձնական դեպք, որը կփորձարկի մուտքի վերջնակետը և կհաստատի, որ պատասխանի կարգավիճակը 200 է, ինչը ցույց է տալիս մուտքի հաջող փորձ:
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);
});
});
});
});
Թեստերը գործարկելու համար վերադարձեք Cypress-ի կողմից կառավարվող բրաուզերի տարբերակին և ընտրեք կոնկրետ թեստային ֆայլը, որը ցանկանում եք գործարկել:
Cypress-ի փորձարկման վազորդը կանցկացնի թեստերը և կգրանցի դրանց արդյունքները՝ ցույց տալով յուրաքանչյուր թեստային դեպքի անցած կամ ձախողման կարգավիճակը:
Վերոնշյալ օրինակները ցույց են տալիս, թե ինչպես կարող եք փորձարկել տարբեր երթուղիներ և դրանց համապատասխան կարգավորիչի գործառույթները՝ ապահովելու դրանց ֆունկցիոնալությունը և սպասվող վարքը: Թեև անհրաժեշտ է ստուգել API-ների ֆունկցիոնալությունը, դուք չպետք է սահմանափակեք թեստավորման շրջանակը միայն այս առումով:
API-ի փորձարկման համապարփակ ռազմավարությունը պետք է ներառի նաև կատարողականի, ծանրաբեռնվածության և այլ ծառայությունների հետ ինտեգրման թեստեր: Ձեր ռազմավարության մեջ ներառելով տարբեր տեսակի փորձարկման մեթոդներ՝ դուք կարող եք հասնել մանրակրկիտ թեստային ծածկույթի և համոզվել, որ ձեր API-ները և՛ ֆունկցիոնալ, և՛ հուսալի են՝ նախքան ձեր ծածկագիրը արտադրության մեջ տեղակայելը:
Փորձարկելով ձեր ամբողջ վեբ փորձը Cypress-ի միջոցով
Cypress-ը ֆանտաստիկ գործիք է վեբ հավելվածների փորձարկման համար, որը անխափան կերպով ծածկում է թեստերը և՛ առջևի, և՛ հետին մասի համար:
Օգտվողի համար հարմար փորձարկման առանձնահատկություններով դուք կարող եք հեշտությամբ և արագ ստեղծել թեստավորման միջավայր՝ բոլորը մեկ հարթակում: Այնուհետև կարող եք օգտագործել այն՝ ձեր հավելվածի տարբեր ասպեկտները մանրակրկիտ փորձարկելու և բարձրորակ կատարումը երաշխավորելու համար: