Contents

วิธีทดสอบ Express.js REST API โดยใช้ Cypress

Cypress เป็นเฟรมเวิร์กการทดสอบยอดนิยมที่ออกแบบมาสำหรับแอปพลิเคชัน JavaScript แม้ว่าจะได้รับการออกแบบมาเพื่อทดสอบส่วนประกอบ UI และการโต้ตอบกับองค์ประกอบ UI ในเบราว์เซอร์เป็นหลัก แต่ก็ยังเหมาะสำหรับการทดสอบ API อีกด้วย คุณสามารถใช้เฟรมเวิร์กเพื่อทดสอบ RESTful API ผ่านคำขอ HTTP และตรวจสอบการตอบสนอง

Cypress ช่วยให้สามารถสร้างชุดทดสอบที่ครอบคลุมครอบคลุมช่วงการดำเนินงานของเว็บแอปพลิเคชันทั้งหมดตั้งแต่เริ่มต้นจนถึงเสร็จสมบูรณ์

เริ่มต้นใช้งานการทดสอบ API โดยใช้ Cypress

Cypress ช่วยให้สามารถตรวจสอบความถูกต้องของอินเทอร์เฟซการเขียนโปรแกรม (API) ของแอปพลิเคชันเพื่อให้แน่ใจว่าทำงานตามการออกแบบที่ตั้งใจไว้ ในส่วนหนึ่งของกระบวนการนี้ จุดสิ้นสุดของ API พารามิเตอร์อินพุต และการตอบกลับ Hypertext Transfer Protocol (HTTP) จะได้รับการทดสอบ นอกจากนี้ ยังมีการตรวจสอบความเข้ากันได้กับระบบภายนอกใดๆ และฟังก์ชันการทำงานของกลไกการจัดการข้อผิดพลาดได้รับการยืนยันแล้ว

/th/images/cypress-homepage.jpg

การรับรองฟังก์ชันการทำงาน ความน่าเชื่อถือ และความเหมาะสมสำหรับการผสานรวมแอปพลิเคชันของ API ของคุณผ่านการทดสอบถือเป็นสิ่งสำคัญยิ่ง การระบุและแก้ไขปัญหาใดๆ ก่อนกำหนดจะป้องกันไม่ให้ปัญหาที่อาจเกิดขึ้นเกิดขึ้นในสภาพแวดล้อมจริง

Cypress เป็นเครื่องมือทดสอบ UI ที่ยอดเยี่ยม ซึ่งใช้โดยเฟรมเวิร์ก JavaScript ยอดนิยมบางตัว ความสามารถในการสร้างและทดสอบคำขอ HTTP ทำให้มีประสิทธิภาพเท่าเทียมกันในการทดสอบ API

แอปพลิเคชันใช้ประโยชน์จาก Node.js ซึ่งเป็นเทคโนโลยีพื้นฐานในการดำเนินการคำขอ HTTP และจัดการการตอบสนองที่เกี่ยวข้องอย่างมีประสิทธิภาพ

ซอร์สโค้ดสำหรับโปรเจ็กต์นี้สามารถเข้าถึงได้ผ่านพื้นที่เก็บข้อมูล GitHub เฉพาะ

สร้าง Express.js REST API

ในการเริ่มต้นกระบวนการ ให้สร้างเว็บเซิร์ฟเวอร์ Express เป็นพื้นฐาน และรวมแพ็คเกจนี้ไว้ในกรอบงานของโปรเจ็กต์ของคุณ

 npm install cors 

หากต้องการรวมฟังก์ชันการทำงานของ Cypress เข้ากับโปรเจ็กต์ปัจจุบันของคุณ คุณจะต้องทำตามขั้นตอนต่างๆ ที่เกี่ยวข้องกับการติดตั้งและกำหนดค่าการขึ้นต่อกันที่จำเป็น กระบวนการนี้เกี่ยวข้องกับการเพิ่มแพ็คเกจ Cypress เป็นสินทรัพย์ในไฟล์การกำหนดค่าหรือพื้นที่เก็บข้อมูลของโปรเจ็กต์ของคุณ การระบุเวอร์ชันและตำแหน่งบนระบบของคุณ และตรวจสอบให้แน่ใจว่ามีการผสานรวมอย่างเหมาะสมกับส่วนประกอบและโมดูลอื่น ๆ ภายในแอปพลิเคชันของคุณ เมื่อดำเนินการเสร็จสิ้น คุณสามารถเริ่มใช้ Cypress เพื่อทำให้และทดสอบขั้นตอนการพัฒนาซอฟต์แวร์ด้านต่างๆ ของคุณโดยอัตโนมัติ รวมถึงการโต้ตอบของผู้ใช้ การเรียก API และคำขอเครือข่าย

 npm install cypress --save-dev 

สุดท้าย แก้ไขไฟล์ package.json ของคุณเพื่อรวมสคริปต์ทดสอบข้างต้น

 "test": "npx cypress open" 

กำหนดตัวควบคุม API

เพื่อสาธิตการทำงานของแอปพลิเคชันของเราในสถานการณ์จริง เราจะจำลองกระบวนการทำการเรียก API เพื่อโต้ตอบกับฐานข้อมูลหรือ API ภายนอก แม้ว่าการใช้งานจริงจะเกี่ยวข้องกับการโต้ตอบดังกล่าว เพื่อความชัดเจน เราจะใช้อาร์เรย์เพื่อจัดเก็บและดึงข้อมูลผู้ใช้ภายในขอบเขตของตัวอย่างนี้

ในไดเร็กทอรีหลักของโครงสร้างโฟลเดอร์ของโปรเจ็กต์ของคุณ ให้สร้างไดเร็กทอรีย่อย"controllers"และภายในไดเร็กทอรีนั้น ให้สร้างไฟล์"userControllers.js"ภายในไฟล์นี้ ให้รวมเนื้อหาที่ตามมา

อันที่จริง ให้เราเริ่มต้นด้วยการประดิษฐ์

 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!!' });
  }
};

แก้ไขฟังก์ชัน getAllUsers ที่มีอยู่เพื่อรวมฟังก์ชันเพิ่มเติมที่ดึงข้อมูลผู้ใช้จากอาร์เรย์และส่งกลับในรูปแบบของการตอบสนอง JSON ฟังก์ชันใหม่นี้เรียกว่า getUsers

 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

เพื่อสร้างการกำหนดค่าการกำหนดเส้นทางสำหรับแอปพลิเคชัน RESTful ที่ใช้ Express คุณควรสร้างไฟล์ใหม่ชื่อ “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 โดยการปรับการกำหนดค่าตามข้อกำหนดต่อไปนี้:

 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;

ตั้งค่าสภาพแวดล้อมการทดสอบ

เพื่อสร้างสภาพแวดล้อมการทดสอบสำหรับการสาธิต Application Programming Interface (API) ให้เริ่มการเริ่มต้นเซิร์ฟเวอร์การพัฒนาโดยดำเนินการคำสั่งเทอร์มินัลที่กล่าวมาข้างต้น

 node server.js 

จากนั้น รันสคริปต์ทดสอบโดยใช้ไฟล์เรียกทำงาน"test"จากภายในหน้าต่างเทอร์มินัลหรือคอนโซลอื่น:

 npm run test 

การดำเนินการตามคำสั่งนี้จะเริ่มต้นการใช้งานแอปพลิเคชันเดสก์ท็อป Cypress ซึ่งทำหน้าที่เป็นแพลตฟอร์มประเมินผล เมื่อติดตั้งสำเร็จ ให้ไปที่แท็บ"การทดสอบ E2E"และเปิดใช้งานโดยคลิกที่ปุ่มที่กำหนด การประเมินแบบ end-to-end ครอบคลุมการประเมินที่ครอบคลุมของ Express API ทั้งหมด รวมถึงเว็บเซิร์ฟเวอร์ การกำหนดค่าเส้นทาง และโมดูลฟังก์ชันตัวควบคุมที่เกี่ยวข้อง

/th/images/cypress-testing-ui-client.jpg

โปรดดำเนินการต่อโดยคลิกที่"ดำเนินการต่อ"เพื่อรวมไฟล์การกำหนดค่า Cypress

/th/images/cypress-configuration-files.jpg

เมื่อเสร็จสิ้นขั้นตอนการตั้งค่าเริ่มต้นแล้ว ผู้ใช้ควรสังเกตการมีอยู่ของไดเร็กทอรี Cypress ที่สร้างขึ้นใหม่ภายในโปรเจ็กต์ของตน นอกจากนี้ Cypress จะสร้างไฟล์ cypress.config.js ที่ครอบคลุมพารามิเตอร์การกำหนดค่าของชุดทดสอบโดยอัตโนมัติ

คุณสามารถแก้ไขเอกสารนี้ได้โดยการรวมที่อยู่ฐานของเซิร์ฟเวอร์ของคุณไว้ในลักษณะต่อไปนี้:

 const { defineConfig } = require("cypress");

module.exports = defineConfig({
  chromeWebSecurity: false,
  e2e: {
    baseUrl: 'http://localhost:5000',
    setupNodeEvents(on, config) {
     },
  },
}); 

เขียนกรณีทดสอบ

หากต้องการเริ่มเขียนกรณีทดสอบโดยใช้ Cypress ให้เริ่มต้นด้วยการเลือกเว็บเบราว์เซอร์ที่ต้องการสำหรับการทดสอบจากตัวเลือกที่มีให้ภายในอินเทอร์เฟซ Cypress

/th/images/testing-browsers-options.jpg

เมื่อคลิกที่ปุ่ม"สร้างข้อมูลจำเพาะใหม่"โปรดระบุชื่อสำหรับกรณีทดสอบของคุณ ตามด้วยการคลิกที่ตัวเลือก"สร้างข้อมูลจำเพาะ"

/th/images/new-spec-file.jpg

โปรดแก้ไขเนื้อหาของไฟล์ “cypress/fixtures/example.json” โดยรวมข้อมูลรับรองผู้ใช้ที่ให้ไว้ ไฟล์ฟิกซ์เจอร์ทำหน้าที่เป็นที่เก็บข้อมูลการทดสอบแบบอยู่กับที่ซึ่งสามารถนำไปใช้ภายในชุดทดสอบได้

 {
  "username": "testuser",
  "password": "password123"
} 

Cypress นำเสนอแนวทางที่หลากหลายสำหรับการดำเนินการคำขอ HTTP ผ่านคำสั่ง cy.request ในตัว คุณลักษณะนี้ช่วยให้นักพัฒนาโต้ตอบกับตำแหน่งข้อมูล HTTP ประเภทต่างๆ ที่จัดการฟังก์ชันการทำงานที่หลากหลาย เช่น GET, POST, PUT และ DELETE

เพื่อตรวจสอบการทำงานของจุดสิ้นสุด API ที่ใช้งานก่อนหน้านี้ทั้งสามจุด เราต้องเริ่มต้นด้วยการกำหนดสถานการณ์ทดสอบสำหรับกระบวนการลงทะเบียน วัตถุประสงค์หลักของสถานการณ์การทดสอบนี้คือเพื่อยืนยันว่าจุดสิ้นสุดทำงานตามที่ตั้งใจไว้โดยการสร้างบัญชีผู้ใช้ใหม่อย่างมีประสิทธิภาพและตรวจสอบการยืนยันที่เกี่ยวข้อง

โปรดเปิดไฟล์ “cypress/e2e/user.routes.spec.cy.js” และแทนที่เนื้อหาที่มีอยู่ด้วยข้อมูลโค้ดที่ให้มาด้านล่าง:javascriptdescribe(‘User Routes’, ()=> {it(‘should have a suitable) แถบนำทางบนอุปกรณ์มือถือ’, (เสร็จสิ้น)=> {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({ บังคับ: จริง });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');
      });
    });
  }); 

ในระหว่างการดำเนินการประเมินนี้ 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);
      });
    });
  }); 

สุดท้าย รวมสถานการณ์การทดสอบเพื่อประเมินจุดสิ้นสุดการเข้าสู่ระบบและยืนยันว่าสถานะการตอบสนอง HTTP คือ 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 และเลือกสคริปต์ทดสอบที่คุณต้องการดำเนินการจากที่มีอยู่

/th/images/spec-files-on-cypress-client.jpg

การดำเนินการทดสอบ Cypress จะต้องส่งผลให้มีการทดสอบและจัดทำเอกสารผลลัพธ์สำหรับกรณีทดสอบแต่ละกรณี โดยแสดงให้เห็นว่าผ่านหรือไม่ผ่าน

/th/images/user-routes-test-cases-1.jpg

เพื่อประเมินประสิทธิภาพและความน่าเชื่อถือของ API อย่างครอบคลุม การขยายขอบเขตการทดสอบนอกเหนือจากการตรวจสอบลักษณะการทำงานของ API เป็นสิ่งสำคัญ ด้วยการสำรวจการโต้ตอบเพิ่มเติมระหว่างอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันและส่วนประกอบอื่น ๆ ที่เกี่ยวข้องกับการประมวลผลคำขอหรือการตอบกลับ การประเมินประสิทธิภาพและประสิทธิผลโดยรวมของระบบที่ครอบคลุมมากขึ้นสามารถทำได้

แนวทางการทดสอบ API ที่รอบรู้ไม่เพียงแต่ครอบคลุมฟังก์ชันการทำงานเท่านั้น แต่ยังรวมไปถึงแง่มุมต่างๆ เช่น ประสิทธิภาพ ความสามารถในการปรับขนาด และการผสานรวมกับระบบภายนอก ด้วยเหตุนี้ การผสมผสานวิธีการทดสอบที่หลากหลายไว้ในกลยุทธ์การทดสอบของคุณจึงเป็นสิ่งจำเป็นสำหรับการบรรลุผลการทดสอบที่ครอบคลุมครบถ้วน และรับประกันความน่าเชื่อถือและความเสถียรของ API ของแอปพลิเคชันของคุณก่อนที่จะปรับใช้ในสภาพแวดล้อมจริง

ทดสอบประสบการณ์เว็บทั้งหมดของคุณโดยใช้ Cypress

Cypress เป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการประเมินแอปพลิเคชันบนเว็บได้อย่างง่ายดาย ครอบคลุมการประเมินที่ครอบคลุมทั้งส่วนต่อประสานผู้ใช้และส่วนประกอบฝั่งเซิร์ฟเวอร์

การใช้เครื่องมือทดสอบที่ใช้งานง่ายของเราช่วยให้สร้างสภาพแวดล้อมการทดสอบที่ครอบคลุมภายในแพลตฟอร์มเดียวได้อย่างง่ายดาย ช่วยให้สามารถประเมินแง่มุมต่างๆ ของซอฟต์แวร์ของคุณได้อย่างกว้างขวาง เพื่อให้มั่นใจถึงฟังก์ชันการทำงานที่เหมาะสมที่สุดและประสิทธิภาพที่ยอดเยี่ยม