วิธีใช้ Cucumber สำหรับการทดสอบแบบ BDD

Ashley Goolam

Ashley Goolam

23 December 2025

วิธีใช้ Cucumber สำหรับการทดสอบแบบ BDD

Behavior-Driven Development (BDD) ได้เปลี่ยนแปลงวิธีการที่ทีมงานคิดเกี่ยวกับคุณภาพซอฟต์แวร์โดยทำให้การทดสอบสามารถอ่านได้สำหรับทุกคน! การใช้ Cucumber สำหรับการทดสอบ BDD เป็นทักษะที่เชื่อมช่องว่างระหว่างความต้องการทางธุรกิจและการนำไปใช้ทางเทคนิค สร้างเอกสารที่มีชีวิตที่สามารถเรียกใช้งานได้จริง หากคุณเคยประสบปัญหาเกี่ยวกับกรณีทดสอบที่ล้าสมัยทันทีที่เขียน คู่มือนี้จะแสดงวิธีที่ดีกว่าให้คุณ

ปุ่ม

Cucumber และ BDD คืออะไร?

Cucumber เป็นเครื่องมือโอเพนซอร์สที่ใช้รันการทดสอบอัตโนมัติซึ่งเขียนด้วยภาษาธรรมดา โดยจะนำ Behavior-Driven Development (BDD) มาใช้ ซึ่งเป็นระเบียบวิธีที่นักพัฒนา ผู้ทดสอบ และผู้มีส่วนได้ส่วนเสียทางธุรกิจทำงานร่วมกันเพื่อกำหนดพฤติกรรมของซอฟต์แวร์โดยใช้ตัวอย่างที่เป็นรูปธรรม

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

Cucumber จะอ่านไฟล์ .feature ที่มีสถานการณ์การทดสอบที่เขียนด้วยไวยากรณ์ Gherkin และดำเนินการกับ step definitions ซึ่งเป็นโค้ดที่ทำการทำงานอัตโนมัติจริง การแยกส่วนนี้หมายความว่าผู้มีส่วนได้ส่วนเสียทางธุรกิจสามารถตรวจสอบสถานการณ์การทดสอบได้โดยไม่ต้องอ่านโค้ด ในขณะที่นักพัฒนาจะนำรายละเอียดทางเทคนิคไปใช้งานแยกต่างหาก

Cucumber

การติดตั้ง Cucumber สำหรับ JavaScript

การตั้งค่า Cucumber ในโปรเจกต์ Node.js ใช้เพียงไม่กี่คำสั่ง:

ข้อกำหนดเบื้องต้น:

ตรวจสอบว่า npm และ node ติดตั้งอยู่ในเครื่องของคุณหรือไม่
# Create a new project directory
mkdir cucumber-bdd-demo && cd cucumber-bdd-demo

# Initialize npm
npm init -y

# Install Cucumber and testing dependencies
npm install --save-dev @cucumber/cucumber chai axios
ตั้งค่า Cucumber ในโปรเจกต์

ไฟล์ package.json ของคุณควรรวมสคริปต์การทดสอบดังนี้:

{
  "scripts": {
    "test": "cucumber-js"
  }
}

สร้างโครงสร้างไดเรกทอรีนี้:

project/
├── features/
│   └── user-management.feature
├── step-definitions/
│   └── user-steps.js
├── package.json
└── cucumber.json

คู่มือปฏิบัติ: การเขียน BDD Test ครั้งแรกของคุณ

มาสร้างการทดสอบสำหรับ User Management API เพื่อสาธิต วิธีการใช้ Cucumber สำหรับการทดสอบ BDD ในทางปฏิบัติกัน

ขั้นตอนที่ 1: เขียนไฟล์ Feature

สร้างไฟล์ features/user-management.feature:

Feature: User Management API
  As an API client
  I want to manage users
  So that I can integrate user functionality into my application

  Scenario: Create a new user successfully
    Given I have a valid user payload
    When I send a POST request to "/api/users"
    Then the response status should be 201
    And the response should contain a user ID

  Scenario: Attempt to create user with invalid email
    Given I have a user payload with invalid email
    When I send a POST request to "/api/users"
    Then the response status should be 400
    And the response should contain "Invalid email format"

ขั้นตอนที่ 2: ใช้ Step Definitions

สร้างไฟล์ step-definitions/user-steps.js:

const { Given, When, Then } = require('@cucumber/cucumber');
const { expect } = require('chai');
const axios = require('axios');

let requestPayload;
let response;

Given('I have a valid user payload', function() {
  requestPayload = {
    name: 'Test User',
    email: 'test@example.com',
    password: 'ValidPass123'
  };
});

Given('I have a user payload with invalid email', function() {
  requestPayload = {
    name: 'Test User',
    email: 'invalid-email',
    password: 'ValidPass123'
  };
});

When('I send a POST request to {string}', async function(endpoint) {
  try {
    response = await axios.post(`http://localhost:3000${endpoint}`, requestPayload);
  } catch (error) {
    response = error.response;
  }
});

Then('the response status should be {int}', function(statusCode) {
  expect(response.status).to.equal(statusCode);
});

Then('the response should contain a user ID', function() {
  expect(response.data).to.have.property('userId');
  expect(response.data.userId).to.match(/^[0-9a-fA-F]{24}$/);
});

Then('the response should contain {string}', function(message) {
  expect(response.data.message).to.include(message);
});

ขั้นตอนที่ 3: แก้ไขไฟล์ Cucumber.json

สร้างไฟล์ "cucumber.json" ในไดเรกทอรีรากของโปรเจกต์ของคุณและเพิ่มโค้ดต่อไปนี้:

{
    "default": {
        "formatOptions": {
            "snippetInterface": "synchronous"
        }
    }
}

ขั้นตอนที่ 4: รันการทดสอบ

รันการทดสอบของคุณด้วย:

npm test

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

กฎสำหรับการเขียน BDD Scenarios ที่ดี

การเรียนรู้ วิธีการใช้ Cucumber สำหรับการทดสอบ BDD อย่างมีประสิทธิภาพจำเป็นต้องปฏิบัติตามกฎที่ได้รับการพิสูจน์แล้วเหล่านี้:

1. โครงสร้าง Given-When-Then

ทุกสถานการณ์จะต้องมีสามส่วนนี้ตามลำดับ:

2. เขียนในเชิงประกาศ ไม่ใช่เชิงคำสั่ง

ไม่ดี:

Given I open the browser
And I navigate to "/login"
And I type "test@example.com" in the email field
And I type "password" in the password field
And I click the login button

ดี:

Given I am on the login page
When I log in with valid credentials
Then I should see the dashboard

มุ่งเน้นไปที่สิ่งที่คุณกำลังทดสอบ ไม่ใช่วิธีการทดสอบ

3. หนึ่งสถานการณ์ หนึ่งวัตถุประสงค์

แต่ละสถานการณ์ควรทดสอบพฤติกรรมเดียว สถานการณ์ที่รวมกันจะซ่อนความล้มเหลวและทำให้การดีบักเป็นเรื่องยาก

4. ใช้ภาษานักธุรกิจ

เขียนสถานการณ์ที่ผู้มีส่วนได้ส่วนเสียทางธุรกิจสามารถเข้าใจได้ หลีกเลี่ยงศัพท์เฉพาะทางเทคนิคและรายละเอียดการใช้งาน

5. ทำให้สถานการณ์เป็นอิสระ

สถานการณ์ไม่ควรพึ่งพาซึ่งกันและกัน แต่ละสถานการณ์ควรกำหนดข้อมูลของตัวเองและล้างข้อมูลหลังจากนั้น

คุณสมบัติขั้นสูงของ Cucumber: Data Tables และ Scenario Outlines

Data Tables สำหรับข้อมูลอินพุตที่ซับซ้อน

เมื่อคุณต้องการทดสอบด้วยข้อมูลหลายจุด ให้ใช้ตาราง:

Scenario: Create users with different roles
  Given I have the following user data:
    | name     | email             | role    |
    | Alice    | alice@example.com | admin   |
    | Bob      | bob@example.com   | user    |
  When I send a POST request to "/api/users"
  Then all users should be created successfully

Step definition:

Given('I have the following user data:', function(dataTable) {
  requestPayload = dataTable.hashes();
});

Scenario Outlines สำหรับการทดสอบที่ขับเคลื่อนด้วยข้อมูล

เมื่อคุณต้องการรันสถานการณ์เดียวกันด้วยข้อมูลที่แตกต่างกัน ให้ใช้ outlines:

Scenario Outline: Login with various credentials
  Given I am on the login page
  When I enter "<email>" and "<password>"
  Then I should see "<result>"

  Examples:
    | email             | password   | result          |
    | test@example.com  | validPass  | Dashboard       |
    | test@example.com  | wrongPass  | Invalid password|
    | invalid@email.com | validPass  | Invalid email   |

สิ่งนี้สร้างสถานการณ์การทดสอบสามสถานการณ์แยกกันโดยอัตโนมัติ

การจัดระเบียบการทดสอบด้วยแท็ก

แท็กช่วยให้คุณจัดหมวดหมู่และกรองสถานการณ์ได้:

@smoke @regression
Scenario: User login
  Given I am on the login page
  When I log in with valid credentials
  Then I should see the dashboard

@api @critical
Scenario: API health check
  Given the API is running
  When I request "/health"
  Then the response status should be 200

รันเฉพาะแท็กที่ระบุ:

npm test -- --tags "@smoke"

Apidog ช่วยในการทดสอบ API ในเวิร์กโฟลว์ BDD ได้อย่างไร

ในขณะที่ Cucumber มีความโดดเด่นในการกำหนดพฤติกรรม Apidog ก็ทำให้การสร้างและดำเนินการทดสอบ API เป็นไปโดยอัตโนมัติ ทำให้การใช้ Cucumber สำหรับการทดสอบ BDD มีประสิทธิภาพมากยิ่งขึ้น

การสร้างกรณีทดสอบ API ที่ขับเคลื่อนด้วย AI

แทนที่จะเขียน step definitions สำหรับการเรียก API ด้วยตนเอง Apidog จะสร้างสิ่งเหล่านี้จาก OpenAPI specification ของคุณโดยใช้ AI:

# Your API spec
paths:
  /api/users:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name: string
                email: string
      responses:
        '201':
          description: User created

Apidog จะสร้างสถานการณ์การทดสอบพร้อมใช้งานโดยอัตโนมัติ:

ปุ่ม
การสร้างกรณีทดสอบใน Apidog

คำถามที่พบบ่อย

คำถามที่ 1: ฉันจำเป็นต้องรู้การเขียนโปรแกรมเพื่อเขียน Cucumber tests หรือไม่?

คำตอบ: การเขียนสถานการณ์ Gherkin ไม่จำเป็นต้องเขียนโค้ด เพียงแค่คิดอย่างชัดเจนเกี่ยวกับพฤติกรรม อย่างไรก็ตาม การใช้ step definitions ต้องมีความรู้ด้าน JavaScript (หรือภาษาอื่นๆ) เครื่องมืออย่าง Apidog ช่วยลดภาระนี้โดยการสร้างโค้ด step definition โดยอัตโนมัติ

คำถามที่ 2: Cucumber แตกต่างจากเฟรมเวิร์กการทดสอบแบบดั้งเดิมอย่างไร?

คำตอบ: เฟรมเวิร์กแบบดั้งเดิม (Jest, Mocha) มุ่งเน้นไปที่การนำไปใช้ทางเทคนิค ในขณะที่ Cucumber มุ่งเน้นไปที่พฤติกรรมทางธุรกิจ สถานการณ์ Cucumber เดียวกันสามารถขับเคลื่อนการทดสอบ UI บนเว็บ (Selenium), การทดสอบ API (Axios) หรือการทดสอบบนมือถือ (Appium) ได้โดยไม่ต้องเปลี่ยนข้อความ Gherkin

คำถามที่ 3: Cucumber สามารถแทนที่เครื่องมือทดสอบ API ได้หรือไม่?

คำตอบ: Cucumber มีโครงสร้างการทดสอบให้ แต่คุณยังคงต้องการเครื่องมือเพื่อเรียกใช้ API (Axios, Supertest) และตรวจสอบการตอบสนอง Apidog เติมเต็ม Cucumber โดยการจัดการเลเยอร์การเรียกใช้ API ในขณะที่ Cucumber จัดการเวิร์กโฟลว์ BDD

คำถามที่ 4: อะไรคือสิ่งที่ทำให้สถานการณ์ Cucumber เป็นสิ่งที่ดี?

คำตอบ: สถานการณ์ที่ดีต้องเป็นอิสระ ใช้ภาษานักธุรกิจ เป็นไปตามโครงสร้าง Given-When-Then และทดสอบพฤติกรรมเดียวในแต่ละครั้ง ควรเป็นสิ่งที่ผู้มีส่วนได้ส่วนเสียที่ไม่ใช่สายเทคนิคสามารถอ่านเข้าใจได้ และมุ่งเน้นไปที่สิ่งที่ระบบทำ ไม่ใช่วิธีการทำ

คำถามที่ 5: Apidog จัดการการยืนยันตัวตนในการทดสอบ BDD อย่างไร?

คำตอบ: Apidog จัดการโทเค็นการยืนยันตัวตนโดยอัตโนมัติ คุณสามารถกำหนดขั้นตอน "Given I am authenticated" ที่ใช้การจัดการข้อมูลประจำตัวของ Apidog เพื่อดึงโทเค็นที่ถูกต้อง ซึ่งช่วยลดการจัดการโทเค็นด้วยตนเองใน step definitions ของคุณ

สรุป

การใช้ Cucumber สำหรับการทดสอบ BDD จะเปลี่ยนกระบวนการพัฒนาของคุณได้อย่างมีประสิทธิภาพ โดยการสร้างความเข้าใจร่วมกันระหว่างทีมเทคนิคและทีมธุรกิจ ไวยากรณ์ Gherkin บังคับให้เกิดความชัดเจน ในขณะที่การแยกสถานการณ์และ step definitions ทำให้การทดสอบสามารถบำรุงรักษาได้เมื่อแอปพลิเคชันของคุณพัฒนาขึ้น

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

เริ่มต้นจากเล็กๆ เลือก API endpoint หนึ่งจุด เขียนสามสถานการณ์: สำเร็จ, ล้มเหลว และกรณีขอบ (edge case) นำ step definitions ไปใช้งาน รันการทดสอบ แสดงผลลัพธ์ให้เจ้าของผลิตภัณฑ์ของคุณดู เมื่อพวกเขาเห็นข้อกำหนดทางธุรกิจถูกนำไปใช้เป็นการทดสอบ คุณก็จะได้รับการสนับสนุนในการขยาย BDD ไปทั่วทั้งโปรเจกต์ของคุณ นั่นคือเมื่อการใช้ Cucumber สำหรับการทดสอบ BDD หยุดเป็นเพียงการปฏิบัติทางเทคนิค และกลายเป็นการเคลื่อนไหวเพื่อคุณภาพทั้งทีม

ปุ่ม

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API