3.2. Cách sử dụng Behat
3.2.2. Sử dụng Gherkin để viết các tính năng
Gherkin là ngôn ngữ thể hiện nghiệp vụ và c ó miền ngữ nghĩa xác định, nó giúp cho người đọc có thể hiểu kịch bản và hoạt động của hê ̣ thống mà không cần biết chi tiết cài đă ̣t . Gherkinđược sử du ̣ng để mô tả các hành vi của ứng dụng nhằm mu ̣c đích làm tài liê ̣u và làm đầu vào cho kiểm thƣ̉ tƣ̣ đô ̣ng.
Gherkin đƣợc giới thiệu trong Cucumber, các ngôn ngữ khác nhau có thể có cách viết Gherkin khác nhau. Hiện nay Gherkin có khoảng 37 dị bản ngôn ngữ. Khi sƣ̉ du ̣ngGherkin có hai quy tắc nhƣ sau[8]:
Mỗi tâ ̣p tin Gherkin chỉ mô tả cho một tính năng duy nhất.
Tâ ̣p tin này có phần mở rô ̣ng là . feature
Gherkin là phương thức giao tiếp giữa Behat và tâ ̣p yêu cầu nghiê ̣p vu ̣ . Gherkin cung cấp các từ khóa và cấu trúc tựa ngôn ngữ tự nhiên để người dùng
không am hiểu kỹ thuâ ̣t vẫn có thể sƣ̉ du ̣ng để viết tính năng và công cu ̣ Beh at cũngđọc các đi ̣nh nghĩa bước để tự đô ̣ ng chuyển thà nh các phương thức kiểm thƣ̉.
Gherkin là ngôn ngữ hướng dòng (line-oriented language), mỗi lệnh được viết trên một dòng vàngắt dòng để báo hiệu kết thúc câu lệnh. Mỗi dòng lệnh thường bắt đầu bằng một từ khóa[8].
Trong Gherkin các câu lê ̣nh theo cấp bâ ̣c cha – con, mỗi cấp đô ̣ lê ̣nh cách nhau bởi mô ̣t kí tƣ̣ tab , tuy nhiên cũng có thể thay thế chúng bởi các khoảng trắng. Gherkin cũng sƣ̉ du ̣ng chú thích bằng các dấu “ #” đầu mỗi dòng chú
thích.
# this is a comment
Gherkin cung cấp một tập các từ khóa để định nghĩa các tính năng, các từ khóa thường đứng đầu các câu lệnh. Cấu trúc chung của mô ̣t tính năng và tâ ̣p từ
khóa tương ứng như Hình 3-2.
Hình 3-2. Cấu trúc chung của mô ̣t tính năng bằng Gherkin
Gherkin chia tập các từ khóa thành bốn nhóm chính:
Feature:Dùng để định nghĩa một tính năng, theo sau là tên của tính năng đó.Các dòng bên dưới tên tính năng, phía trên từ khoá Scenario (dòng 2,3,4 Hình 3-2) là một số mô tả thêm về các giá trị nghiệp vụ cho tính năng đó, phần này chỉ giúp người đọc hiểu ngữ cảnh sử dụng tính năng chứ không có giá trị sử dụng trong quá trình kiểm thử.
Scenario:Định nghĩa một kịch bản sử dụng của tính năng, kịch bản đƣợc xác định bởi từ khoá Scenario: theo sau là tên hay mô tả kịch bản đó, mỗi mô tả về kịch bản đƣợc định nghĩa trên cùng dòng với từ khoá Scenario:
Given, When, Then: Là các từ khóa xác định các bước trong một kịch bản, mỗi bước có thể là một ngữ cảnh, một hoạt động hoặc một kết quả của hoạt đô ̣ng. Các bước này sẽ làm tiền đề cho việc định nghĩa các phương thức kiểm thử. Để mô tả một ngữ cảnh, Gherkin dùng từ khóa Given, để mô tả hoạt động của bước đó Gherkin sử dụng từ khóa When, còn Then để chỉ kết quả của kịch bản.
And, But: Hai từ khóa này được dùng để kết hợp các bước với nhau. Khi một kịch bản có nhiều ngữ cảnh, nhiều hoạt động hoặc nhiều kết quả để tránh viết lặp đi lặp lại các từ khóa Given, When, Then ta có thể sử dụng And và But
để kết hợp các bước. Việc thay thế nàykhông làm ảnh hưởng đến quá trình xử lý các bước của Behat, nó chỉ nhằm mục đích làm cho tài liệu dễ đọc, dễ hiểu, có ý nghĩa.
Mỗi tính năng có thể có nhiều kịch bản sử dụng, mỗi ki ̣ch bản cùng với các bước của nó sẽ được đi ̣nh nghĩa trên mô ̣t khối.Khi kết thúc ki ̣ch bản thứ nhất thì
mới đi ̣nh nghĩa tiếp ki ̣ch bản thƣ́ hai bằng cách mở đầu một từ khóa Scenario:, công việc đó đƣợc lặp đi lặp lại cho tới khi định nghĩa xong các ki ̣ch bản sƣ̉
dụng cho các tính năng.
Mỗi tâ ̣p tin Gherkin mô tả về một tính năng và các kịch bản sử dụng cũng như các bước thực hiện kịch bản đó. Khi làm việc, mỗi bước đó sẽ tương ứng với một khối mã nguồn. Ví dụ
1: Feature: Some terse yet descriptive text of what is desired 2:In order to realize a named business value
3:As an explicit system actor
4:I want to gain some beneficial outcome which furthers the goal 5:
6:Scenario: Some determinable business situation 7:Given some precondition
9:When some action by the actor 10:And some other action
11:And yet another action
12:Then some testable outcome is achieved 13:And something else we can check happens too 14:
15:Scenario: A different situation
Dòng 1 4 định nghĩa một tính năng.
Dòng 6 nêu một ngữ cảnh của tính năng.
Dòng 713 là các bước của ngữ cảnh này.
Tƣ̀ dòng 1 trở đi tiếp tục với tính năng khác.
Tính năng
Mỗi tê ̣p *.feature chứa một tính năng duy nhất. Mô tả của một tính năng bắt đầu với từ khóa Feature:, tiếp theo là các dòng mô tả tính năng đó[8]. Mỗi tính năng thường bao gồm nhiều kịch bản ứng với các trường hợp sử dụng tính năng đó trong từng điều kiện, mỗi kịch bản đƣợc xác định bởi từ khóa
Scenario: nằm trên một dòng mới.
Mỗi kịch bản sẽ có một dãy các bước thực hiện kịch bản đó, mỗi bước đƣợc xác định bằng các từ khóa Given, When, Then, But hoặc là And. Các từ khóa này sẽ được Behat xử lý để gọi các phương thức kiểm thử tương ứng. Mỗi kịch bản có ba dạng bước là Given, When, Thentùy thuộc vào điều kiện sử dụng mô ̣t ki ̣ch bản có thể khuyết mô ̣t, hai loa ̣i bước.
Given:Để định nghĩa ngữ cảnh sƣ̉ du ̣ng.
When: Để mô tả các hoạt động/thao tác của kịch bản.
Then: Để mô tả kết quả của các hoạt động.
Ví dụ:
Scenario: Wilson posts to his own blog Given I am logged in as Wilson
When I try to post to "Expensive Therapy"
Then I should see "Your article was published."
Scenario: Wilson thất bạis to post to somebody else's blog Given I am logged in as Wilson
When I try to post to "Greg's anti-tax rants"
Then I should see "Hey! That's not your blog!"
Scenario: Greg posts to a client's blog Given I am logged in as Greg
When I try to post to "Expensive Therapy"
Then I should see "Your article was published."
Hình 3-3.Mô tả các tính năng Kịch bản dàn ý
Kịch bản dàn ý (Scenario Outline) là loại kịch bản cho phép viết các đi ̣nh nghĩa bước tương tự nhau thành các mẫu kịch bản. Mỗi kịch bản dàn ý có dạng nhƣ sau:
Scenario Outline: tên kịch bản Given … <ph_1> …
When … < ph_2 > … Then … < ph_3 > …
Examples:
| ph_1 | ph_2| ph_3|
|v11|v13|v13|
|v21|v22|v23|
Trong đó:
Scenario Outline: là từ khoá xác định việc bắt đầu định nghĩa một kịch bản dàn ý theo sau là tên kịch bản.
Given, When, Then là các bước của kịch bản dàn ý, các bước này cũng nhằm mục đích định nghĩa ngữ cảnh, hoạt động và kết quả giống như các bước trong kịch bản thông thường, tuy nhiên trên mỗi bước có thể có chỗ trống (placeholder) để điền các giá trị biến vào cho từng trường hợp sử dụng. Để xác định biến, Gherkin sử dụng cặp dấu <,> (<tên biến>), nhƣ các biến <ph_1>,
<ph_2>, <ph_3>.
Examples: dùng để xác định bảng dữ liệu tương ứng với các biến, trong bảng dữ liệu này, các tên biến được mô tả ở các bước sẽ được dùng để làm tiêu đề cho các cột, có bao nhiêu tên biến sẽ có bấy nhiêu tên cột. Các dòng dữ liệu cho bảng này là dữ liệu tương ứng của mỗi kịch bản cho các biến, mỗi kịch bản sẽ được minh họa trên một dòng của bảng dữ liệu.
Kịch bản dàn ý không đƣợc thực hiện trực tiếp, khi gặp kịch bản dàn ý, Behat sẽ đọc phần các giá trị tương ứng ở mỗi dòng của bảng giá trị và đưa vào kịch bản trước khi thực hiện. Mỗi dòng giá trị tương ứng với một kịch bản, và quá trình đọc - thực hiện đƣợc lặp đi lặp lại cho đến khi thực hiện xong kịch bản cho dòng dữ liệu cuối cùng của bảng.
Ví dụ:
Given there are 12 cucumbers When I eat 5 cucumbers
Then I should have 7 cucumbers
Scenario: Eat 5 out of 20 Given there are 20 cucumbers When I eat 5 cucumbers
Then I should have 15 cucumbers
Hai kịch bản trên đây có các bước khá tương đồng nhau, chỉ khác nhau về giá trị truyền vào trên mỗi bước. Với loại kịch bản này, để tránh nhàm chán ta có thể định nghĩa một kịch bản mẫu gọi là kịch bản dàn ý.
Kịch bản nền (Background)
Kịch bản nền cho phép đi ̣nh nghĩa các ngữ cảnh chung cho tất cả các kịch bản trong cùng một tính năng. Kịch bản nền có dạng nhƣ sau:
Background:
Given định nghĩa ngữ cảnh And […]
Kịch bản nền có cú pháp giống với các kịch bản thông thường, tuy nhiên không xác định tên kịch bản. Kịch bản nền đƣợc định nghĩa bằng từ khoá
Background:. Các dòng sau từ khoá này xác định các ngữ cảnh sử dụng kịch bản đó.Ngữ cảnh được xác định bằng từ khoá Given, ngữ cảnh có nhiều bước thì có thể sử dụng thêm các từ khoá And, But.Trong quá trình Behat thƣ̣c hiê ̣n, nếu gă ̣p ki ̣ch bản nền thì nó sẽ thực hiện kịch bản nền trước mỗi kịch bản thông thường, ngay sau sự kiện BeforeScenario của kịch bản tương ứng.
Các lọai bước của Gherkin để mô tả yêu cầu
Mỗi tính năng bao gồm nhiều bước, có ba dạng là Given, When và Then.
Trong quá trình thực hiện các kịch bản, Behat không phân biệt ba loại bước này.
Tuy nhiên, khi viết kịch bản nên xác định các dạng bướcđể mô tả các kịch bản một cách rõ ràng, có ý nghĩa và theo đúng tinh thần của BDD. Ba loại bước trong Gherkin đƣợc phân biệt nhƣ sau:
Given: Mục đích của loại bước Given là đưa hệ thống vào trạng thái xác định trước khi người dùng bắt đầu các tương tác. Given thường mô tả về ngữ cảnh sử dụng tính năng ở kịch bản đang viết, không quan tâm đến tương tác của người dùng.
When: Mục đích của When là mô tả các hoạt động cơ bản mà người dùng thực hiện trên hệ thống trong kịch bản đó.
Then: Mục đích của Then là đểtheo dõi kết quả trả ra. Việc giám sát nên căn cứ vào các giá trịnghiệp vụ đƣợc mô tả trong tính năng và chỉ kiểm tra kết quả trả về của hệ thống như báo cáo, giao diện người dùng, thông báo, lệnh,…không chi tiết cách thức cài đặt hay là giá trị nghiệp vụ của tính năng đó.
Mục đích của bước Then đảm bảo bước When và bước Then tạo ra hoặc không tạo ra kết quả gì?
Ví dụ
When I call “echo hello”
Then output should be “hello”
Mỗi loại bước có thể có nhiều lê ̣nh kết hợp nhau, và quá trình mô tả kịch bản các bước cùng loại sẽ được viết gần nhau, mỗi bước viết trên một dòng với từ khoá là loại bước tương ứng. Tuy nhiên, để mô tả tính năng rõ ràng và dễ hiểu hơn, trong một kịch bản, các từ khoá Given, When, Then nên đƣợc xác định một lần, và các bước cùng một loại sẽ được định nghĩa thêm bằng từ khoá And hoặc But tuỳ theo ngữ nghĩa kết hợp các bước.