Sử dụng Gherkin để viết các tính năng

Một phần của tài liệu Nghiên cứu phát triển phần mềm hướng hành vi ứng dụng công cụ behat (Trang 45 - 51)

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.

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 713 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ụ: (adsbygoogle = window.adsbygoogle || []).push({});

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

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 đó. (adsbygoogle = window.adsbygoogle || []).push({});

 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.

Một phần của tài liệu Nghiên cứu phát triển phần mềm hướng hành vi ứng dụng công cụ behat (Trang 45 - 51)