Cucumber cơ bản- Ngôn ngữ Gherkin

test-automation-cucumber-bdd.png

Cucumber là một công cụ kiểm thử tự động acceptance test dựa trên việc thực thi các functions.

Kịch bản test unit (scenarios) sẽ được viết trước và thể hiện nghiệp vụ, sau đó source code mới được cài đặt để pass qua tất cả các stories đó.

Ngôn ngữ được cucumber sử dụng là “Gherkin”

Gherkin là 1 ngôn ngữ mà Cucumber đọc ngôn ngữ ấy chuyển thành test. Gherkin khá dễ hiểu, người đọc có thể hiểu kịch bản và hành động mà không cần biết chi tiết chúng được cài đặt như thế nào Gherkin thỏa mãn 2 mục đích

  • Cung cấp tư liệu
  • Test tự động

Có 2 quy tắc khi viết Gherkin:

  • Một file Gherkin chỉ mô tả cho một feature.
  • Source file Gherkin là .feature

1zISC.png

Cú pháp Gherkin

  • Giống như Python và YAML, Gherkin là một ngôn ngữ kịch bản được sử dụng để định nghĩa logic theo cấu trúc. Cũng giống như Ruby, nên thay thế kí tự tab bằng các kí tự space, dòng comment sẽ có kí tự # ở đầu dòng.
  • Bắt đầu một file sẽ là Feature, sau đó đến scenarios và steps. Khi chạy file source “.feature” mỗi step sẽ match với một Ruby code block được định nghĩa sẵn trước đó gọi là “Step Definitions”.

File Gherkin thường như sau

11.png

Ngữ pháp của Gherkin chia đầu vào thành các feature, scenario và step

**Feature: **

Tất cả các file "*.feature" được quy ước chỉ bao gồm một feature.

Dòng bắt đầu với từ khóa ”Feature:” theo sau bởi 3 dòng lùi vào

Một Feature thường gồm một list các Scenario. Có thể viết bất cứ bạn muốn cho đến khi bắt đầu Scenario đầu tiên (khi dòng mới bắt đầu bằng từ “Scenario:”)

Có thể sử dụng tags để nhóm các feature và scenario lại với nhau, không lệ thuộc vào file và cấu trúc thư mục.

Mỗi scenario bao gồm một list các Step, các Step bắt đầu bằng các keyword như (Given, When, Then, But hoặc And)

Thêm vào đó, feature có thể bao gồm scenario outline và background

Ví dụ

2.png

Scenario

Scenario là nòng cốt trong cấu trúc Gherkin.

Mọi Scenario đều bắt đầu với từ khóa “Scenario:” theo sau bởi một tiêu đề tùy ý.

Mỗi Feature có thể có một hoặc nhiều Scenario, và mỗi Scenario bao gồm một hay nhiều Step.

Ví dụ

3.png

Background

Background cho phép thêm một vài context vào tất cả các scenario trong một feature.

Một background giống như một Scenario không có tiêu đề, bao gồm số Step.

Sự khác nhau là khi chạy: background chạy trước mỗi scenario, nhưng sau Hook

Ví dụ

background.png

Step

Feature bao gồm Step như (Givens, Whens, Thens…).

bdd-discuss.jpeg

Cucumber không phân biệt giữa 3 loại steps.

Tuy nhiên cần sử dụng cẩn thận và đúng mục đích đối với những từ này.

  • **Given: **

    Được sử dụng để mô tả ngữ cảnh ban đầu của hệ thống.

    Mục đích của Given là đưa hệ thống vào một trạng thái đã biết trước khi sử dụng (hoặc hệ thống bên ngoài) bắt đầu tương tác với hệ thống (trong bước When).

    Nếu bạn đã làm việc với use case, Givens là điều kiện tiên quyết.

    Khi Cucumber thực thi bước Given, nó sẽ cấu hình hệ thống để được một trạng thái rõ ràng như là: tạo, cấu hình các đối tượng hoặc thêm dữ liệu test vào cơ sở dữ liệu.

given.png

Nên sử dụng Given với một table, cách này giúp đọc tất cả các scenario tại cùng một chỗ mà không cần nhảy giữa các file

given_table.png

  • **When: **

    Mục đích của When là để mô tả các sự kiện, hành động chính mà người dùng sử dụng.

when.png

  • **Then: **

    Mục đích của Then là quan sát kết quả. Các quan sát phải được liên quan đến các giá trị kinh doanh / lợi ích trong việc mô tả feature. Các quan sát phải kiểm tra đầu ra của hệ thống (một báo cáo, giao diện người dùng, tin nhắn,...)

then.png

  • **And, But: **

Khi có nhiều Given, When, Then thì có thể viết

and1.png

  • **Comment: **

    Bắt đầu dòng bằng dấu # cho biết dòng đó là dòng comment và không được thực thi

**Step Definition: **

Cucumber không thể biết làm thế nào để thực thi được scenario. Nó cần Step Definition để biên dịch nguyên văn các bước Gherkin thành các hành động cái mà có thể tương tác với hệ thống.

Khi Cucumber thực thi các Step trong Scenario nó sẽ tìm kiếm các Step Definition phù hợp để thực thi.

Một Step Definition là một phần nhỏ của code với một pattern đính kèm.

Pattern được sử dụng để liên kết các Step definition với tất cả các Step phù hợp, và code là cái mà Cucumber sẽ thực thi khi thấy Gherkin Step.

Để hiểu Step Difinition làm việc như thế nào, xem ví dụ sau

std1.png

“I have 48 cukes in my belly” là một phần của Step (text theo sau từ khóa Given) sẽ phù hợp với Step Definition dưới đây

std2.png

cucumber.png

Tham Khảo

https://github.com/cucumber/cucumber/wiki/Gherkin

https://cucumber.io/docs/reference