Cucumber (P1) - Giới thiệu tổng quan

Cucumber

Cucumber, testing framework hỗ trợ Behavior Driven Development (BDD), cho phép người dùng định nghĩa hành vi hệ thống với ngữ nghĩa tiếng anh thông qua cú pháp Gherkin. Cucumber hướng tới việc viết test “as cool as cucumber” mà bất kỳ ai cũng có thể hiểu cho dù họ không có chuyên môn kĩ thuật. Ví dụ như các nền tảng quen thuộc như Selenium thì thường chỉ người viết test hoặc có kĩ năng lập trình mới hiểu được những gì đang test, còn khác hàng hoặc các bên liên quan thì không đọc ngay code để hiểu mà họ cần hiểu qua tài liệu.

Cucumber ban đầu được thực hiện dành riêng cho ngôn ngữ Ruby và sau đó được mở rộng sang Java, cả Ruby và Java đều sử dụng Junit để chạy test.

Behavior Driven Development

Trong BDD, người dùng (business analysts – người phân tích nghiệp vụ, product owners – người sỡ hửu sản phẩm) sẽ viết kịch bản(scenarios) hoặc acceptance test ( kiểm thử chấp nhận) mô tả hành vi của hệ thống từ quan điểm của khách hàng trước và trong giai đoạn phát triển. Cucumber và BDD giải quyết hạn chế rất hay gặp trong các dự án phần mềm: mỗi người hiểu hệ thống một cách khác nhau.

Wrong Perception

BDD có khả năng tạo ra các kịch bản test dựa trên góc nhìn của bên phát triển cũng như góc nhìn của bên khác hàng. Ngay từ ban đầu, các thành viên dự án sẽ thảo luận để tạo ra các kịch bản trước, sau đó sẽ cài đặt dựa trên kịch bản đó, tất cả kịch bản test gần gũi với ngôn ngữ tiếng Anh, do đó nó đóng luôn vai trò của tài liệu.

Workflow BDD

Workflow - BDD

Sau khi kịch bản test chạy, Cucumber sẽ đọc mã Gherkin từ file feature, sau đó nó sẽ tìm đoạn mã trong file step definition mô tả đúng với hành động trong file feature và thực hiện đoạn code, ở bước chạy code Cucumber có thể kết hợp với các framework khác như Ruby on Rails, Selenium, Spring,...

Lợi ích

  • Gíup cho các bên liên quan đến dự án (stakeholders) có thể follow hoạt động test mà không cần kiến thức kĩ thuật chuyên môn
  • Cucumber tập trung vào trải nghiệm người dùng cuối
  • Style viết mã dễ bảo trì và thực hiện
  • Công cụ hiệu quả cho kiểm thử

So sánh Cucumber với các công cụ khác

Cucumber HP ALM (QTP) Selenium
Miễn phí Trả phí Miễn phí
Công cụ hỗ trợ Behaviour driven development BDD Công cụ hỗ trợ Functional testing Công cụ hỗ trợ Functional and Performance testing
Plugin hoạt động nhanh Plugin hoạt động chậm hơn Cucumber và Selenium Plugin hoạt động chậm hơn Cucumber
Hỗ trợ Java, Scala, Groovy Chỉ hỗ trợ VB script Hỗ trợ Java, .Net, Ruby
Dev, test viết script Chỉ tester viết test script Dev, test viết script
Chỉ support Web app Support ứng dụng Web, desktop, client server app Chỉ support web app

Phần tiếp theo, chúng ta sẽ tìm hiểu thành phần của Cucumber.

Thành phần của Cucumber

Các project Cucumber luôn có một thư mục con tại thư mục gốc (root) project tên "features". Đây là nơi lưu trữ tất cả các features của projects, ngoài ra còn có các thư mục bổ sung (additional directories) và thư mục hỗ trợ (support directories).

Features

Feature có thể được hiểu là một đơn vị hoặc chứng năng độc lập của một dự án. Ví dụ như một trang web thương mại điện tử, một vài tính năng (features) có thể 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 có thể hiểu là mỗi function độc lập của sản phẩm. Trước khi viết test scripts chúng ta nên xác định trước các features cần test để mang lại hiệu quả cao. Các tests xây dựng trong Cucumber được gọi là các feature files và có dạng .feature, mỗi feature cần test nên đặt trong 1 file feature tương ứng.

Features trong Cucumber bao gồm các thành phần sau:

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, phân cách nhau bằng kí hiệu | | Given: Chỉ ra ngữ cảnh để 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: Visit career guide page in career.guru99.com
Scenario : Visit career.guru99.com
Given: I am on career.guru99.com
When: I click on career guide menu
Then: I should see career guide pag

Step Definitions

Mặc dù đã có file feature nhưng Cucumber chưa thực sự biết đoạn mã nào sẽ được thực thi cho từng scenario cụ thể được nêu trong file feature. Nó cần một 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 (/^ I am on career.guru99.com$/) do
Browser.goto "http://career.guru99.com" -This will visit career.guru99 on browser
end

When (/^ click on career guide menu$/) do
Browser.text (:name, " career guide" ).click – This will click "career guide menu"
end

Then (/^ I should see career guide page$/) do
Browser.goto "http://career.guru99.com/category/career-guide/" - It will visit "career guide page"
end

Scenario

Scenario là cấu trúc lõi của Gherkin. Kịch bản test 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 - Login the store at http://store.demoqa.com/ Given user input username and password When user clicks Login Then the Homepage opens

Gỉa sử kịch bản trên bạn cần thực hiện nhiều lần với nhiều quyền (role) người dùng khác nhau. Nếu thực hiện lần lượt thì sẽ rất nhàm chán và không phải là một cách hay. Cucumber cung cấp cấu trúc "Scenario outline" để giải quyết vấn đề này. Cucumber thay thế giá trị đầu vào khác nhau và thực thi loạt hành vi.

Như ví dụ dưới đây, Cucumber sẽ đọc giá trị user1 và pasword1 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 như cũ.

| username | password  | 
| user1    | password1 | 
| user2    | password2 |

Demo

(còn tiếp)

Tham khảo

Tutorial Cucumber Guru99