Cucumber và Behavior Driven Development (BDD): Giải pháp Test Tự Động Dễ Đọc Cho Dự Án Phần Mềm

Cucumber là một framework kiểm thử mạnh mẽ, hỗ trợ Behavior Driven Development (BDD), cho phép người dùng mô tả hành vi của hệ thống bằng ngôn ngữ tiếng Anh dễ hiểu thông qua cú pháp Gherkin. Mục tiêu của Cucumber là giúp việc viết test trở nên đơn giản và dễ tiếp cận, ngay cả với những người không có kiến thức kỹ thuật sâu về lập trình. Trong khi các framework như Selenium thường yêu cầu người viết test hoặc lập trình viên hiểu rõ mã nguồn để biết chính xác những gì đang được kiểm tra, thì Cucumber cho phép khách hàng và các bên liên quan khác dễ dàng hiểu được quy trình kiểm thử thông qua tài liệu được viết bằng ngôn ngữ tự nhiên.

Ban đầu, Cucumber được phát triển cho ngôn ngữ Ruby, sau đó được mở rộng sang Java. Cả hai phiên bản Ruby và Java đều sử dụng JUnit để thực thi các bài kiểm tra.

Behavior Driven Development (BDD)

BDD cho phép người dùng (bao gồm các nhà phân tích nghiệp vụ và chủ sở hữu sản phẩm) viết các kịch bản (scenarios) hoặc kiểm thử chấp nhận (acceptance tests) mô tả hành vi của hệ thống từ góc độ của khách hàng, trước và trong suốt quá trình phát triển. Cucumber và BDD giải quyết một vấn đề phổ biến trong các dự án phần mềm: sự khác biệt trong cách hiểu hệ thống giữa các thành viên.

Nhận thức sai lệch về hệ thốngNhận thức sai lệch về hệ thống

BDD có khả năng tạo ra các kịch bản kiểm thử dựa trên cả góc độ của nhà phát triển và khách hàng. Ngay từ giai đoạn đầu của dự án, các thành viên sẽ thảo luận và xây dựng các kịch bản, sau đó triển khai dựa trên những kịch bản này. Vì các kịch bản kiểm thử được viết bằng ngôn ngữ gần gũi với tiếng Anh, chúng đồng thời đóng vai trò là tài liệu tham khảo hữu ích.

Quy trình làm việc của BDD

Quy trình làm việc BDDQuy trình làm việc BDD

Khi các kịch bản kiểm thử được thực thi, Cucumber sẽ đọc mã Gherkin từ các file feature. Sau đó, nó sẽ tìm kiếm đoạn mã trong file step definition tương ứng với hành động được mô tả trong file feature và thực thi đoạn mã đó. Trong quá trình thực thi, Cucumber có thể tích hợp với các framework khác như Ruby on Rails, Selenium, và Spring.

Ưu điểm của Cucumber và BDD

  • Dễ tiếp cận: Cho phép các bên liên quan (stakeholders) theo dõi quá trình kiểm thử mà không cần kiến thức kỹ thuật chuyên sâu.
  • Tập trung vào người dùng: Cucumber tập trung vào trải nghiệm của người dùng cuối.
  • Dễ bảo trì và thực hiện: Phong cách viết mã dễ bảo trì và thực hiện.
  • Hiệu quả: Công cụ hiệu quả cho kiểm thử.

So sánh Cucumber với các công cụ kiểm thử khác

Tính năng Cucumber HP ALM (QTP) Selenium
Chi phí Miễn phí Trả phí Miễn phí
Mô hình phát triển BDD Functional Functional and Performance testing
Hiệu suất plugin Nhanh Chậm hơn Chậm hơn
Ngôn ngữ hỗ trợ Java, Scala, Groovy VB script Java, .Net, Ruby
Đối tượng viết script Dev, test Tester Dev, test
Ứng dụng hỗ trợ Web Web, desktop, client server app Web

Phần tiếp theo sẽ giới thiệu các thành phần chính của Cucumber.

Các thành phần của Cucumber

Trong một dự án Cucumber, thư mục gốc (root) luôn chứa một thư mục con tên là “features”. Đây là nơi lưu trữ tất cả các features của dự án, cùng với các thư mục bổ sung và thư mục hỗ trợ khác.

Features

Feature có thể được hiểu là một đơn vị hoặc chức năng độc lập của một dự án. Ví dụ, đối với một trang web thương mại điện tử, một số tính năng (features) có thể được xác định như:

  1. Đăng nhập bằng tài khoản hệ thống hoặc mạng xã hội
  2. Lựa chọn hàng hóa
  3. Thanh toán
  4. Đăng xuất

Trong Cucumber, mỗi feature tương ứng với một chức năng độc lập của sản phẩm. Trước khi viết test scripts, bạn nên xác định trước các features cần kiểm thử để đạt được hiệu quả cao nhất. Các tests được xây dựng trong Cucumber được gọi là các feature files và có định dạng .feature. Mỗi feature cần kiểm tra nên được đặt trong một file feature riêng.

Các thành phần của Features trong Cucumber:

  • Feature: Mô tả test script hiện tại sẽ được chạy.
  • Scenario: Mô tả các bước thực hiện và kết quả đầu ra mong muốn cho một test case cụ thể.
  • Scenario Outline: Scenario thực hiện nhiều tập dữ liệu (sets of data). Dữ liệu được lưu dưới dạng cấu trúc bảng, phân cách nhau bằng ký hiệu |.
  • Given: Chỉ ra ngữ cảnh ban đầu để thực thi.
  • When: Chỉ ra hành động đã được thực hiện.
  • Then: Kết quả đầu ra mong muốn của một test.

Ví dụ:

Feature: Truy cập trang hướng nghiệp trên sentayho.com.vn
  Scenario: Truy cập sentayho.com.vn
    Given: Tôi đang ở trang sentayho.com.vn
    When: Tôi click vào menu hướng nghiệp
    Then: Tôi thấy trang hướng nghiệp

Step Definitions

Mặc dù đã có file feature, Cucumber vẫn cần biết đoạn mã nào sẽ được thực thi cho từng scenario cụ thể. Để làm được điều này, Cucumber sử dụng file trung gian Step Definition. File này ánh xạ các bước thực hiện (step), features (Given, When, Then) trong scenario với đoạn mã (code) chức năng cần thực thi. Step được định nghĩa trong file ruby “features/step_definitions/*_steps.rb”.

Ví dụ:

Given(/^Tôi đang ở trang sentayho.com.vn$/) do
  visit "https://sentayho.com.vn" # Điều hướng đến trang sentayho.com.vn
end

When(/^Tôi click vào menu hướng nghiệp$/) do
  click_link "Hướng nghiệp" # Click vào liên kết "Hướng nghiệp"
end

Then(/^Tôi thấy trang hướng nghiệp$/) do
  expect(page).to have_content("Cẩm nang hướng nghiệp") # Kiểm tra xem trang có nội dung "Cẩm nang hướng nghiệp"
end

Scenario và Scenario Outline

Scenario là cấu trúc cốt lõi của Gherkin. Kịch bản kiểm thử được khai báo với từ khóa “Scenario:” và theo sau là tên kịch bản. Mỗi tính năng có thể có một hoặc nhiều scenarios, mỗi scenario bao gồm một hoặc nhiều steps.

Ví dụ:

Scenario: Đăng nhập vào cửa hàng tại sentayho.com.vn
  Given Người dùng nhập tên đăng nhập và mật khẩu
  When Người dùng click vào nút Đăng nhập
  Then Trang chủ sẽ mở ra

Giả sử bạn cần thực hiện kịch bản trên nhiều lần với nhiều vai trò (role) người dùng khác nhau. Việc thực hiện lần lượt từng kịch bản sẽ rất tẻ nhạt và không hiệu quả. Cucumber cung cấp cấu trúc “Scenario outline” để giải quyết vấn đề này. Cucumber sẽ thay thế các giá trị đầu vào khác nhau và thực thi chuỗi hành vi.

Ví dụ:

Scenario Outline: Đăng nhập với các vai trò khác nhau
  Given Người dùng nhập tên đăng nhập "<username>" và mật khẩu "<password>"
  When Người dùng click vào nút Đăng nhập
  Then Trang chủ sẽ mở ra

  Examples:
    | username | password |
    | user1    | password1|
    | user2    | password2|

Trong ví dụ trên, Cucumber sẽ đọc giá trị user1password1 cho lần chạy đầu tiên. Sau khi chạy xong, Cucumber sẽ thay thế bằng giá trị user2password2 với các step tương tự.

Demo

(tiếp tục cập nhật)

Tài liệu tham khảo

  • Tutorial Cucumber Guru99