12/08/2018, 17:13

Hello Cucumber

Khi bắt đầu tìm hiểu một kĩ thuật mới, chúng ta thường có một ví dụ kinh điển là "Hello World", ở bài viết này mình cũng xin giới thiệu một ví dụ đơn giản "Hello Cucumber" để làm quen với Cucumber Cucumber cho phép người dùng định nghĩa hành vi hệ thống với ngữ nghĩa tiếng anh thông qua cú pháp ...

Khi bắt đầu tìm hiểu một kĩ thuật mới, chúng ta thường có một ví dụ kinh điển là "Hello World", ở bài viết này mình cũng xin giới thiệu một ví dụ đơn giản "Hello Cucumber" để làm quen với Cucumber

Cucumber cho phép người dùng định nghĩa hành vi hệ thống với ngữ nghĩa tiếng anh thông qua cú pháp Gherkin.

Cucumber hướng tới việc viết test mà bất kỳ ai cũng có thể hiểu cho dù họ không có chuyên môn kĩ thuật.

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 và nhiều ngôn ngữ khác

Ở đây mình chỉ xin trình bày ví dụ để các bạn có thể thấy được cách Cucumber hoạt động trong thực tế, từ đó xem xét có áp dụng vào các dự án của mình hay không.

Còn phần cài đặt và cú pháp có rất nhiều bài viết trên viblo, các bạn có thể tham khảo thêm!

Để bắt đầu, chúng ta sẽ xem xét một ví dụ khá đơn giản, để bạn có thể tự làm quen với cú pháp và cấu trúc tập tin cơ bản:

#features/hello/hello_cucumber.feature

Feature: Hello Cucumber
As a product manager
I want our users to be greeted when they visit our site
So that they have a better experience

Scenario: User sees the welcome message
When I go to the homepage
Then I should see the welcome message

Phần đầu tiên bắt đầu bằng từ khoá Feature được gọi là mô tả tính năng. Nó cần phải có một tiêu đề tính năng, ở đây đó là "Hello Cucumber"

Nó cũng có thể có một mô tả tùy chọn (bên dưới tiêu đề), nhằm giúp người đọc hiểu được tính năng và bối cảnh của nó.

Khi viết mô tả các tính năng của Cucumber , tốt nhất nên thực hiện theo phong cách user-story, giống như sau:

Feature: <feature title>
As a <persona|role>
I want to <action>
So that <outcome>

Một Feature thường gồm một list các 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.

Feature bao gồm Step như (Given, When, Then…)

Scenario: User sees the welcome message
When I go to the homepage
Then I should see the welcome message

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.

Tính năng Cucumber đã viết có thể đọc được, nhưng làm thế nào để chúng ta có thể thực thi chúng?

Những hướng dẫn kịch bản này được gọi là các bước, và chúng ta sẽ sử dụng chúng để thực hiện các kiểm tra.

Cách hoạt động là, đối với từng bước trong kịch bản, chúng ta sẽ cung cấp một khối mã Ruby để được thực hiện.

Chúng ta sẽ đặt các định nghĩa bước của chúng ta (các khối mã) trong một tệp có tên hello_steps.rb.

#features/step_definitions/hello/hello_steps.rb

When(/^I go to the homepage$/) do
  visit root_path
end

Then(/^I should see the welcome message$/) do
  expect(page).to have_content("Hello Cucumber")
end

Như bạn thấy, chúng ta chỉ đơn giản liên kết mỗi dòng trong tệp tin Cucumber feature, được gọi là bước kịch bản, với định nghĩa bước tương ứng của nó, kết hợp chuỗi định nghĩa bước với việc sử dụng regular expression.

Trong bước đầu tiên định nghĩa, chúng ta đang nói rằng, để vào trang chủ, người dùng sẽ truy cập root_path.

Đối với bước mong đợi, chúng ta sẽ kiểm tra xem trang chủ có chứa văn bản "Hello Cucumber".

Một vài cài đặt nhỏ:

#config/routes.rb

Rails.application.routes.draw do
  root 'welcome#index'
end

#app/controllers/welcome_controller.rb

class WelcomeController < ApplicationController
  def index
  end
end

#app/views/welcome/index.html.erb

<h1>Hello Cucumber</h1>

Trên đây là một ví dụ rất cơ bản để làm quen với Cucumber, hẹn gặp lại các bạn ở các bài viết sau.

Tham khảo:

  • https://semaphoreci.com/community/tutorials/introduction-to-writing-acceptance-tests-with-cucumber
  • https://viblo.asia/p/cucumber-co-ban-ngon-ngu-gherkin-jamoG8ndRz8P
0