Cucumber là gì? Các thành phần của Cucumber

Bài viết này Anh Tester sẽ giới thiệu Cucumber là gì? Tại sao dùng Cucumber, các thành phần của Cucumber và lợi ích của Cucumber.

Cucumber là gì?

Cucumber là một công cụ kiểm thử hay là một Testing Framework hỗ trợ Behavior Driven Development (BDD), cho phép người dùng định nghĩa hành vi của hệ thống với tiếng anh có ý nghĩa đơn giản bằng cách sử dụng một ngữ pháp được xác định bởi một ngôn ngữ gọi là Gherkin.

Cucumber hướng tới việc viết test case 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ách 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. Sau này là với nhiều ngôn ngữ khác và khung sườn khác như C#, Javascript, Python và cùng với framework như TestNG, specflow,...

Tại sao phải sử dụng Cucumber?

Một số lý do sau nên dùng Cucumber:

  • Selenium và Cucumber là 2 công nghệ phổ biến
  • Hầu hết các dự án sử dụng Selenium để kiểm thử chức năng, họ muốn tích hợp Cucumber vì Cucumber dễ đọc và dễ hiểu luồng ứng dụng hơn.
  • Cucumber dựa trên phát triển hướng hành vi đóng vai trò là cầu nối giữa: Software Engineer và Business Analyst, 
    Manual Tester và Automation Tester, 
    Manual Tester và Developers.

Behavior Driven Development (BDD)

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.

Cucumber là gì? Các thành phần của Cucumber | Anh Tester


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

Cucumber là gì? Các thành phần của Cucumber | Anh Tester


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ư TestNG, Selenium, Spring,...


Lợi ích của Cucumber

  • Giúp cho các bên liên quan đến dự án (stakeholders) có thể theo dõi 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
  • Cách 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, Ruby, Groovy, C#, Python, Javascript Chỉ hỗ trợ VB script Hỗ trợ Java, .Net, Ruby, Javascript, Python, PHP
Dev, Tester viết script Chỉ Tesster viết test script Dev, Tester viết script
Support Web app, Mobile app kết hợp với Testing Framework khác Support ứng dụng Web, desktop, client server app Chỉ support web app

 

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ức 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à còn các thành phần khác nữa. Xem thêm ở cuối bài viết.

Ví dụ:

Feature: Login Page

  Scenario Outline: Login page to HRM
    Given user navigate to url "<url>"
    When user enter username "<username>" and password "<password>"
    And click login button
    Then The user redirect to Dashboard page
    Examples:
      | url                             | username | password |
      | https://hrm.anhtester.com/login | admin01  | 123456   |

 

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 java "features/step_definitions/*_steps.java"

Ví dụ

@Given("user navigate to url {string}")
public void userNavigateToUrl(String url) {
  System.out.println("Driver on Steps class: " + driver);
  driver.get(url);
}

@When("user enter username {string} and password {string}")
public void userEnterUsernameAndPassword(String email, String password) {
  WebUI.sleep(1);
  driver.findElement(By.xpath("//input[@id='iusername']")).sendKeys(email);
  driver.findElement(By.xpath("//input[@id='ipassword']")).sendKeys(password);
}

@And("click login button")
public void clickLoginButton() {
  WebUI.sleep(1);
  driver.findElement(By.xpath("//button[@type='submit']")).click();
}

@Then("The user redirect to Dashboard page")
public void theUserRedirectToDashboardPage() {
  WebUI.sleep(5);
  Assert.assertTrue(true, "Lỗi rồi");
}

 

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: Open menu
Given user navigate to dashboard
When user click "Project"
Then The user redirect to this page

 

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 menu 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 điền tuần tự lần chạy thứ nhất và lần chạy thứ hai tương ứng 2 giá trị "Dự án" "Task" vào biến <menu>. Nó tự động hiểu là chạy 2 lần với 2 giá trị tương ứng. Rất tiện lợi đúng không 😀

  Scenario Outline: Open menu
  Given user navigate to the dashboard
  When user click "<menu>"
  Then the user redirect to this page
  Examples:
    | menu  |
    | Dự án |
    | Task  |


Xem thêm: Cấu trúc của một Gherkin trong Cucumber

Project Cucumber với Selenium: https://github.com/anhtester/CucumberTestNGParallel


Nguồn tham khảo

  • Anh Tester

    Đường dẫu khó chân vẫn cần bước đi
    Đời dẫu khổ tâm vẫn cần nghĩ thấu