Ինչպես փորձարկել 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-ը ֆանտաստիկ գործիք է վեբ հավելվածների փորձարկման համար, որը անխափան կերպով ծածկում է թեստերը և՛ առջևի, և՛ հետին մասի համար:

Օգտվողի համար հարմար փորձարկման առանձնահատկություններով դուք կարող եք հեշտությամբ և արագ ստեղծել թեստավորման միջավայր՝ բոլորը մեկ հարթակում: Այնուհետև կարող եք օգտագործել այն՝ ձեր հավելվածի տարբեր ասպեկտները մանրակրկիտ փորձարկելու և բարձրորակ կատարումը երաշխավորելու համար: