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.
Mục Lục
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ố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 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ư:
- Đăng nhập bằng tài khoản hệ thống hoặc mạng xã hội
- Lựa chọn hàng hóa
- Thanh toán
- Đă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ị user1 và password1 cho lần chạy đầu tiên. Sau khi chạy xong, Cucumber sẽ thay thế bằng giá trị user2 và password2 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
