ไทย

คู่มือฉบับสมบูรณ์สำหรับ Cypress เฟรมเวิร์กการทดสอบ end-to-end ที่ทรงพลัง ครอบคลุมการติดตั้ง การเขียนเทส การดีบัก การผสานรวม CI/CD และแนวทางปฏิบัติที่ดีที่สุด

Cypress: คู่มือการทดสอบ End-to-End ฉบับสมบูรณ์สำหรับเว็บแอปพลิเคชัน

ในภูมิทัศน์การพัฒนาเว็บที่เปลี่ยนแปลงอย่างรวดเร็วในปัจจุบัน การรับประกันคุณภาพและความน่าเชื่อถือของเว็บแอปพลิเคชันเป็นสิ่งสำคัญยิ่ง การทดสอบแบบ End-to-End (E2E) มีบทบาทสำคัญในการตรวจสอบว่าส่วนประกอบทั้งหมดของแอปพลิเคชันทำงานร่วมกันได้อย่างราบรื่นจากมุมมองของผู้ใช้ Cypress ได้กลายเป็นเฟรมเวิร์กการทดสอบ E2E ชั้นนำที่มอบประสบการณ์ที่เป็นมิตรต่อนักพัฒนา ฟีเจอร์ที่ทรงพลัง และประสิทธิภาพที่ยอดเยี่ยม คู่มือฉบับสมบูรณ์นี้จะแนะนำทุกสิ่งที่คุณต้องรู้เพื่อเริ่มต้นกับ Cypress และทดสอบเว็บแอปพลิเคชันของคุณอย่างมีประสิทธิภาพ

Cypress คืออะไร?

Cypress คือเครื่องมือทดสอบ front-end ยุคใหม่ที่สร้างขึ้นสำหรับเว็บสมัยใหม่ ไม่เหมือนกับเฟรมเวิร์กการทดสอบแบบดั้งเดิมที่รันเทสในเบราว์เซอร์ Cypress ทำงานโดยตรงในเบราว์เซอร์ ทำให้คุณสามารถควบคุมและมองเห็นพฤติกรรมของแอปพลิเคชันได้อย่างที่ไม่เคยมีมาก่อน มันถูกออกแบบมาให้รวดเร็ว เชื่อถือได้ และใช้งานง่าย ทำให้เป็นตัวเลือกที่ได้รับความนิยมในหมู่นักพัฒนาและวิศวกร QA ทั่วโลก Cypress เขียนด้วย JavaScript และทำงานภายในเบราว์เซอร์ ทำให้มีประสิทธิภาพสูงและสามารถเข้าถึงส่วนภายในของแอปพลิเคชันได้อย่างยอดเยี่ยม

ประโยชน์หลักของการใช้ Cypress

การติดตั้งและตั้งค่า

การเริ่มต้นใช้งาน Cypress นั้นตรงไปตรงมา นี่คือวิธีการติดตั้ง:

  1. ข้อกำหนดเบื้องต้น: ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Node.js และ npm (Node Package Manager) บนระบบของคุณแล้ว คุณสามารถดาวน์โหลดได้จากเว็บไซต์อย่างเป็นทางการของ Node.js
  2. ติดตั้ง Cypress: เปิดเทอร์มินัลหรือคอมมานด์พรอมต์ของคุณ ไปยังไดเรกทอรีโปรเจกต์ของคุณ และรันคำสั่งต่อไปนี้:
  3. npm install cypress --save-dev
  4. เปิด Cypress: เมื่อการติดตั้งเสร็จสิ้น คุณสามารถเปิด Cypress Test Runner ได้โดยการรันคำสั่ง:
  5. npx cypress open

    คำสั่งนี้จะเปิด Cypress Test Runner ซึ่งเป็นอินเทอร์เฟซแบบกราฟิกสำหรับการรันและดีบักเทสของคุณ

การเขียน Cypress Test แรกของคุณ

เรามาสร้างเทสง่ายๆ เพื่อตรวจสอบว่าหน้าแรกของเว็บไซต์โหลดอย่างถูกต้อง สร้างไฟล์ใหม่ชื่อ `example.cy.js` ในไดเรกทอรี `cypress/e2e` ของโปรเจกต์ของคุณ


// cypress/e2e/example.cy.js

describe('เทสแรกของฉัน', () => {
  it('เข้าชมเว็บ Kitchen Sink', () => {
    cy.visit('https://example.cypress.io')
    cy.contains('type').click()
    cy.url().should('include', '/commands/actions')

    cy.get('.action-email')
      .type('fake@email.com')
      .should('have.value', 'fake@email.com')
  })
})

มาดูรายละเอียดของเทสนี้กัน:

รันเทสนี้ใน Cypress Test Runner เพื่อดูการทำงาน คุณจะเห็นเบราว์เซอร์นำทางไปยังเว็บไซต์ Cypress Kitchen Sink คลิกที่ลิงก์ "type" และตรวจสอบ URL

คำสั่งของ Cypress

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

นี่เป็นเพียงส่วนหนึ่งของคำสั่งที่มีอยู่มากมายใน Cypress โปรดดูเอกสารประกอบของ Cypress สำหรับรายการคำสั่งทั้งหมดและตัวเลือกต่างๆ

Assertions ใน Cypress

Assertions ใช้เพื่อตรวจสอบพฤติกรรมที่คาดหวังของแอปพลิเคชันของคุณ Cypress มีชุด assertions ในตัวที่หลากหลายซึ่งคุณสามารถใช้เพื่อตรวจสอบสถานะขององค์ประกอบ, URL, title และอื่นๆ Assertions จะถูกเชื่อมต่อตามหลังคำสั่งของ Cypress โดยใช้เมธอด `.should()`

นี่คือตัวอย่าง assertion ทั่วไปบางส่วน:

คุณยังสามารถสร้าง assertions แบบกำหนดเองเพื่อให้เหมาะกับความต้องการเฉพาะของคุณได้อีกด้วย

แนวทางปฏิบัติที่ดีที่สุดสำหรับการเขียน Cypress Tests

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

เทคนิค Cypress ขั้นสูง

การทำ Stubbing และ Mocking

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

หากต้องการสกัดกั้นการร้องขอของเครือข่าย คุณสามารถใช้คำสั่ง `cy.intercept()` ตัวอย่างเช่น โค้ดด้านล่างจะสกัดกั้นคำขอ GET ไปยัง `/api/users` และส่งคืนการตอบสนองจำลอง:


cy.intercept('GET', '/api/users', {
  statusCode: 200,
  body: [
    { id: 1, name: 'John Doe' },
    { id: 2, name: 'Jane Doe' }
  ]
}).as('getUsers')

จากนั้นคุณสามารถรอการร้องขอที่ถูกสกัดกั้นโดยใช้ `cy.wait('@getUsers')` และตรวจสอบว่าแอปพลิเคชันของคุณจัดการกับการตอบสนองจำลองอย่างถูกต้อง

การทำงานกับ Local Storage และ Cookies

Cypress มีคำสั่งสำหรับโต้ตอบกับ local storage และ cookies คุณสามารถใช้คำสั่งเหล่านี้เพื่อตั้งค่า, รับค่า และล้าง local storage และ cookies ในเทสของคุณ

หากต้องการตั้งค่ารายการใน local storage คุณสามารถใช้คำสั่ง `cy.window()` เพื่อเข้าถึงอ็อบเจกต์ window แล้วใช้เมธอด `localStorage.setItem()` ตัวอย่างเช่น:


cy.window().then((win) => {
  win.localStorage.setItem('myKey', 'myValue')
})

หากต้องการรับค่ารายการใน local storage คุณสามารถใช้คำสั่ง `cy.window()` แล้วใช้เมธอด `localStorage.getItem()` ตัวอย่างเช่น:


cy.window().then((win) => {
  const value = win.localStorage.getItem('myKey')
  expect(value).to.equal('myValue')
})

หากต้องการตั้งค่า cookie คุณสามารถใช้คำสั่ง `cy.setCookie()` ตัวอย่างเช่น:


cy.setCookie('myCookie', 'myCookieValue')

หากต้องการรับค่า cookie คุณสามารถใช้คำสั่ง `cy.getCookie()` ตัวอย่างเช่น:


cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')

การจัดการกับการอัปโหลดไฟล์

Cypress มีปลั๊กอินที่เรียกว่า `cypress-file-upload` ที่ช่วยให้การอัปโหลดไฟล์ในเทสของคุณง่ายขึ้น หากต้องการติดตั้งปลั๊กอิน ให้รันคำสั่งต่อไปนี้:

npm install -D cypress-file-upload

จากนั้น เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ `cypress/support/commands.js` ของคุณ:


import 'cypress-file-upload';

จากนั้นคุณสามารถใช้คำสั่ง `cy.uploadFile()` เพื่ออัปโหลดไฟล์ได้ ตัวอย่างเช่น:


cy.get('input[type="file"]').attachFile('example.txt')

การทำงานกับ IFrame

การทดสอบ IFrame อาจเป็นเรื่องยุ่งยาก แต่ Cypress มีวิธีโต้ตอบกับมัน คุณสามารถใช้คำสั่ง `cy.frameLoaded()` เพื่อรอให้ IFrame โหลด แล้วใช้คำสั่ง `cy.iframe()` เพื่อรับอ็อบเจกต์ document ของ IFrame


cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()

Cypress และ Continuous Integration/Continuous Deployment (CI/CD)

การผสานรวม Cypress เข้ากับ CI/CD pipeline ของคุณเป็นสิ่งจำเป็นสำหรับการรับประกันคุณภาพของแอปพลิเคชันของคุณ คุณสามารถรันเทส Cypress ในโหมด headless ในสภาพแวดล้อม CI/CD ของคุณได้ นี่คือวิธีการ:

  1. ติดตั้ง Cypress: ตรวจสอบให้แน่ใจว่า Cypress ได้รับการติดตั้งเป็น dependency ในโปรเจกต์ของคุณ
  2. กำหนดค่า CI/CD: กำหนดค่า CI/CD pipeline ของคุณให้รันเทส Cypress หลังจากการ build ทุกครั้ง
  3. รัน Cypress แบบ Headless: ใช้คำสั่ง `cypress run` เพื่อรันเทส Cypress ในโหมด headless

ตัวอย่างการกำหนดค่า CI/CD (โดยใช้ GitHub Actions):


name: Cypress Tests

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  cypress-run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16
      - name: Install dependencies
        run: npm install
      - name: Cypress run
        uses: cypress-io/github-action@v5
        with:
          start: npm start
          wait-on: 'http://localhost:3000'

การกำหนดค่านี้จะรันเทส Cypress ทุกครั้งที่มีการ push โค้ดไปยังสาขา `main` หรือมีการสร้าง pull request ไปยังสาขา `main` โดย `cypress-io/github-action` จะช่วยให้กระบวนการรันเทส Cypress ใน GitHub Actions ง่ายขึ้น

การดีบัก Cypress Tests

Cypress มีเครื่องมือดีบักที่ยอดเยี่ยมเพื่อช่วยคุณระบุและแก้ไขปัญหาในเทสของคุณ นี่คือเคล็ดลับบางประการสำหรับการดีบักเทส Cypress:

Cypress เปรียบเทียบกับเฟรมเวิร์กการทดสอบอื่นๆ

ในขณะที่ Cypress เป็นเฟรมเวิร์กการทดสอบ end-to-end ที่ทรงพลัง สิ่งสำคัญคือต้องเข้าใจว่ามันเปรียบเทียบกับตัวเลือกยอดนิยมอื่นๆ อย่างไร นี่คือภาพรวมโดยย่อ:

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

ตัวอย่างการใช้งาน Cypress ในสถานการณ์จริง

ลองมาดูตัวอย่างการใช้งานจริงสองสามตัวอย่างว่า Cypress สามารถใช้ทดสอบเว็บแอปพลิเคชันประเภทต่างๆ ได้อย่างไร:

การทดสอบแอปพลิเคชัน E-commerce

คุณสามารถใช้ Cypress เพื่อทดสอบโฟลว์ต่างๆ ของผู้ใช้ในแอปพลิเคชัน e-commerce เช่น:

นี่คือตัวอย่างเทสของ Cypress ที่ตรวจสอบว่าผู้ใช้สามารถเพิ่มสินค้าลงในตะกร้าได้สำเร็จ:


it('เพิ่มสินค้าลงในตะกร้า', () => {
  cy.visit('/products')
  cy.get('.product-card').first().find('button').click()
  cy.get('.cart-count').should('have.text', '1')
})

การทดสอบแอปพลิเคชันโซเชียลมีเดีย

คุณสามารถใช้ Cypress เพื่อทดสอบการโต้ตอบของผู้ใช้ในแอปพลิเคชันโซเชียลมีเดีย เช่น:

นี่คือตัวอย่างเทสของ Cypress ที่ตรวจสอบว่าผู้ใช้สามารถสร้างโพสต์ใหม่ได้สำเร็จ:


it('สร้างโพสต์ใหม่', () => {
  cy.visit('/profile')
  cy.get('#new-post-textarea').type('สวัสดีชาวโลก!')
  cy.get('#submit-post-button').click()
  cy.get('.post').first().should('contain', 'สวัสดีชาวโลก!')
})

การทดสอบแอปพลิเคชันธนาคาร

สำหรับแอปพลิเคชันธนาคาร สามารถใช้ Cypress เพื่อทดสอบฟังก์ชันที่สำคัญ เช่น:

เทสเพื่อตรวจสอบการโอนเงินอาจมีลักษณะดังนี้ (พร้อมกับการทำ stubbing ที่เหมาะสมเพื่อความปลอดภัย):


it('โอนเงินสำเร็จ', () => {
  cy.visit('/transfer')
  cy.get('#recipient-account').type('1234567890')
  cy.get('#amount').type('100')
  cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
  cy.get('#transfer-button').click()
  cy.wait('@transfer')
  cy.get('.success-message').should('be.visible')
})

สรุป

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

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