Xây dƣ̣ng các định nghĩa 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 51 - 56)

BDD hoạt đô ̣ng tƣơng tƣ̣ TDD, trƣớc khi cài đă ̣t mã nguồn cho mỗi tính năng, cần phải viết kiểm thƣ̉ cho các tính năng đó. Behat hỗ trợ viê ̣c tƣ̣ đô ̣ng sinh các kiểm thƣ̉ theo tƣơng ứng một – một từ các định nghĩa bƣớc trong tài liê ̣u mô tả của kịch bản thành các phƣơng thức kiểm thử viết bằng mã nguồn PHP.

Behat cung cấp mô ̣t cơ chế để liên kết mô ̣t bƣớc trong kịch bản và mô ̣t đi ̣nh nghĩa bƣớc, nhờ cơ chế liên kết này Behat biết cần áp dụng phƣơng thƣ́c kiểm thƣ̉ nào tƣơng ứng với mô ̣t tiêu chí kiểm thƣ̉ chấp nhâ ̣n hê ̣ thống. Mỗi đi ̣nh nghĩa bƣớc trong lớp FeatureContext bao gồm hai phần:

 Phần đầu Behat sƣ̉ dụng chú thích khối của PHP để đƣa ra mô ̣t biểu thƣ́c chính quy tƣơng ứng với bƣớc đã đƣợc mô tả.

 Phần thƣ́ hai, Behat sƣ̉ dụng mã nguồn PHP để viết mô ̣t phƣơng thƣ́c kiểm thƣ̉ tƣơng ứng.

Chẳng hạn với bƣớc đƣợc mô tả nhƣ sau:

When I do something with “value”

Sẽ có phƣơng thức kiểm thƣ̉ tƣơng ứng trong lớp FeatureContext là:

/**

*/

publicfunctionsomeMethod($Arg) {

//code }

Phần mã nguồn nằm trong khối chú thích của PHP chính là biểu thƣ́c chính quy mà Behat sƣ̉ du ̣ng để liên kết với mô tả bƣớc. Phần này bao gồm:

 Một từ khoá định nghĩa tƣơng ứng với loại bƣớc trong Gherkin, có ba loại tƣ̀ khóa tƣơng ƣ́ng ba loa ̣i bƣớc là @When, @Then, @Given.

 Sau tƣ̀ khóa, phần (/^I do something with "([^"]*)"$/) là biểu thức chính quy tƣơng ứng với mô tả của ngữ cảnh theo ngôn ngữ Gherkin.

 Mỗi phần"([^"]*)"$/) tƣơng ứng với giá trị kiểm thử đã mô tả ở Gherkin sẽ tƣơng ứng với một tham sốcủa phƣơng thức kiểm thƣ̉.

Đối với một ứng dụng, để viết hết các định nghĩa bƣớc tƣơng ứng với các ngữ cảnh là việc không hề đơn giãn bởi vì có rất nhiều ngữ cảnh cho các tính năng của hệ thống. Tuy nhiên trong quá trình thực hiện, Behat sẽ hỗ trợ sinh ra các định nghĩa bƣớc tƣơng ứng, ngƣời lập trình chỉ cần bổ sung thêm các mã nguồn để kiểm thử thành công.

Quá trình thực hiện , Behatđo ̣c các bƣớc của một kịch bản đƣợc viết bằng ngôn ngữ Gherkin ở tập tin .feature, nó sẽ so khớp với biểu thức chính quy đƣợc định nghĩa trong các lớp ngữ cảnh chứa trong FeatureContext.php để tìm phƣơng thƣ́c kiểm thƣ̉ tƣơng ƣ́ng với bƣớc đó .Tùy thuộc vào ngoại lệ trả về của phƣơng thƣ́c kiểm thƣ̉ và mối quan hê ̣ trƣớc s au với các mô tả bƣớc trong cùng kịch bản, Behat sẽ trả về một trong bảy loại kết quả thực thi khác nhau:

 Bƣớc thành công

Khi Behat tìm đƣợc định nghĩa bƣớc tƣơng ứng với mô tả bƣớc, Behat sẽ thực thi chúng . Trong trƣờng hợp phƣơng thức định nghĩa không đƣa ra một ngoại lệ, bƣớc đó sẽ đƣợc đánh dấu là thành công (success). Các kết quả trả về của phƣơng thức định nghĩa ở lệnh return không có ý nghĩa đối với trạng thái thành công hay thất bại của chính định nghĩa đó.

Vd ex.feature

Feature: sample

Scenario: sample define

Given some step with "string" argument And number step with 12

# features/bootstrap/FeatureContext.php <?php

use Behat\Behat\Context\BehatContext; class FeatureContext extends BehatContext {

/** @Given /^some step with "([^"]*)" argument$/ */ public function someStepWithArgument($argument1) {

}

/** @Given /^number step with (\d+)$/ */ public function numberStepWith($argument1) {

} }

Ở ví dụ này, quá trình thực hiện tập tin .feature, Behat tìm các định nghĩa lớp tƣơng ứng trong FeatureContext, và việc thực hiện định nghĩa lớp đó. Mă ̣c dù phƣơng thức định nghĩa không có mã nguồn cho kiểm thử , nhƣng khi thƣ̣c hiê ̣n phƣơng thƣ́c này Behat không thấy tạo ra các ngoại lệ, do đó trƣờng hợp này kiểm thử sẽ thành công. Trạng thái của bƣớc thành công đƣợc đánh dấu màu xanh lá cây.

 Bƣớc chƣa đƣợc định nghĩa

Khi Behat không tìm đƣợc định nghĩa lớp tƣơng ứng với Step đang thực hiện thì bƣớc đó sẽ đƣợc đánh dấu là bƣớc chƣa đƣợc đi ̣nh nghĩa (undefined). Tất cả các bƣớc đƣ́ng sau bƣớc chƣa đi ̣nh nghĩa của kịch bản đó sẽ bị bỏ qua. Trạng thái của các bƣớc chƣa định nghĩa đƣợc đánh dấu màu vàng và Behat sẽ gợi ý một số định nghĩa lớp cho ngƣời dùng cài đặt.

 Bƣớc chƣa đƣợc giải quyết

Khi phƣơng thức định nghĩa của một bƣớc trả ra một ngoại lệ thuộc Behat\Behat\Exception\PendingException, bƣớc đó sẽ đƣợc đánh dấu là bƣớc chƣa giải quyết (pending). Khi gặp một định nghĩa đang ở trạng thái pending, Behat muốn nhắc lâ ̣p trình viên nên viết các lệnh cho định nghĩa bƣớc đó để đƣa kiểm thử về tra ̣ng thái thành công . Tất cả các bƣớc sau bƣớc pending của cùng mô ̣t ki ̣ch bản sẽ bi ̣ bỏ qua.

 Bƣớc thất ba ̣i

Khi một phƣơng thức định nghĩa đƣa ra một ngoại lệ chung (không thuộc PendingException) trong quá trình thực hiện, bƣớc đó sẽ đƣợc đánh dấu là thất bại. Cũng giống nhƣ bƣớc thành công, các kết quả lập trình viên trả ra ở phƣơng

thức định nghĩa không có ý nghĩa quyết định đến trạng thái thành công hay thất bại của bƣớc. Tất cả các bƣớc sau bƣớc thất ba ̣i của cùng mô ̣t ki ̣ch bản sẽ bi ̣ bỏ qua.

 Bƣớc bị bỏ qua

Behat sẽ không bao giờ thực hiện các bƣớc đƣợc đặt sau các bƣớc có trạng thái chƣa đi ̣nh nghĩa , bƣớc chƣa đƣợc giải quyết hoă ̣c bƣớc thất ba ̣i . Các bƣớc này gọi là các bƣớc bị bỏ qua và trạng thái của chúng đƣợc đánh dấu là skipped. Việc cài đặt phƣơng thức định nghĩa lớp không có ý nghĩa trong trƣờng hợp này.

 Bƣớc nhập nhằng

Nếu trong quá trình thực hiện Behat tìm thấy nhiều định nghĩa cho cùng một bƣớc thì bƣớc đó sẽ định đánh dấu trạng thái là bƣớc nhập nhằng. Chẳng hạn:

<?php

use Behat\Behat\Context\BehatContext; class FeatureContext extends BehatContext {

/** @Given /^.* step with .*$/ */ public function someStepWithArgument() {

}

/** @Given /^number step with (\d+)$/ */ public function numberStepWith($argument1) {

} }

Khi bắt gặp các bƣớc nhập nhằng, Behat đƣa ra các thông báo gợi ý cho ngƣời lập trình định nghĩa phƣơng thức lớp, Behat không tự lựa chọn định nghĩa bƣớc phù hợp cho bƣớc đó.

 Các định nghĩa bƣớc dƣ thừa

Behat chỉ cho phép mỗi biểu thức chính quy tƣơng ứng với một định nghĩa bƣớc đƣợc viết một lần duy nhất. Khi khai báo trong FeatureContext, nếu ngƣời lập trình sử dụng các biểu thức chính quy giống nhau Behat sẽ thông báo lỗi dƣ thừa định nghĩa bƣớc.Ví dụ:

<?php

use Behat\Behat\Context\BehatContext; class FeatureContext extends BehatContext {

/** @Given /^number step with (\d+)$/ */ public function workWithNumber($number1)

{ }

/** @Given /^number step with (\d+)$/ */

public function workDifferentlyWithNumber($number1) {

} }

Ở ví dụ này, khi đọc FeatureContext, Behat tìm thấy biểu thức /** @Given /^number step with (\d+)$/ */ đƣợc định nghĩa hai lần, mặc dù hai phƣơng thức có tên khác nhau nhƣng Behat vẫn sẽ báo lỗi, bởi quá trình so sánh chỉ diễn ra ở phầnmô tả bƣớc và biểu thức chính quy viết trên mỗi phƣơng thức định nghĩa bƣớc.

Biến đổi tham số bƣớc

Biến đổi tham số bƣớc cho phép ngƣời lập trình trừu tƣợng việc thực hiện các thao tác thông thƣờng trên các tham số định nghĩa bƣớc vào các phƣơng thức có thể tái sử dụng. Hơn nữa, các phƣơng thức này cũng có thể đƣợc sử dụng để chuyển từ một tham số xâu thông thƣờng đƣợc dùng nhƣ tham số cho phƣơng thức định nghĩa bƣớc thành một loại dữ liệu hoặc đối tƣợng cụ thể.

Mỗi phƣơng thức chuyển đổi phải trả ra một giá trị mới, giá trị này thay thế cho giá trị chuỗi ban đầu và nó đƣợc sử dụng nhƣ một tham số cho phƣơng thức định nghĩa bƣớc.Phƣơng thức chuyển đổi đƣợc định nghĩa bằng cách sử dụng kiểu chú thích giống nhƣ các phƣơng thức định nghĩa bƣớc kèm với từ khoá @Transform, theo sau đó là biểu thức chính quy của bƣớc đó.

Ví dụ: Tự động chuyển một tham số kiểu số sang một tham số số nguyên.

<?php

use Behat\Behat\Context\BehatContext; class FeatureContext extends BehatContext {

/**

* @Transform /^(\d+)$/ */

public function castStringToNumber($string) {

return intval($string); }

/**

* @Then /^a user '([^']+)', should have (\d+) followers$/ */

public function assertUserHasFollowers($name, $count) {

if ('integer' !== gettype($count)) { throw new Exception('Integer expected'); }

}

}

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 51 - 56)

Tải bản đầy đủ (PDF)

(112 trang)