Thực chiến cùng Cucumber

cucumber

Trước khi bắt đầu phần thực chiến này, hãy chắc chắn rằng các bạn đã cài đặt môi trường đầy đủ và chính xác để chúng ta vừa đọc vừa thực hành phần tiếp theo nhé.

Yêu cầu: Cài đặt Ruby và Cucumber

Tạo danh mục dự án

Các bước thực hiện:

$ mkdir calculator
$ cd calculator
$ cucumber
No such file or directory - features. You can use `cucumber --init` to get started.

Cucumber sẽ tìm và quét folder có tên ‘features’ sau khi các bạn gõ lệnh cucumber trên terminal, nếu không tìm thấy folder, bạn sẽ nhận được thông báo như trên.

Tạo danh mục features

Để fix lỗi trên, các bạn chỉ việc sử dụng command line: ‘cucumber –init’ để khởi tạo cấu trúc các folder mà cucumber hỗ trợ

$ cucumber --init

cucumber

Tiếp theo các bạn có thể dùng bất kì một IDE nào mà các bạn yêu thích để mở folder mà cucumber vừa mới tạo cho các bạn lên nào, tôi thì dùng quen Sublime Text rồi, các bạn có thể dùng Rubymine hoặc Komodo edit hoặc không dùng gì cũng chẳng sao, chỉ có điều cực hơn xíu thôi.

Tạo mới feature

Các bước thực hiện:

$ cd features

$ touch adding.feature

Ta vào folder features sau đó tạo một file feature ‘adding.feature’, sau đó thêm nội dung vào file với nội dung như sau:

cucumber

Nội dung đã có rồi, giờ thì chạy lại xem cucumber cho ra kết quả như thế nào

Đầu tiên, chúng ta có thể thấy rằng Cucumber đã tìm thấy feature của chúng ta vừa tạo và đang cố chạy nó. Một scenario (1 scenario (1 undefined)) đã tìm thấy trong feature của chúng ta nhưng Cucumber chẳng biết làm thế nào để chạy nó cả.

Tiếp theo, Cucumber đã in ra 3 steps (3 steps (3 undefined)), 3 đoạn code mẫu cho step definitions, được viết bằng ngôn ngữ Ruby. Đọc tới đây rồi các bạn đã hình dung ra điều gì rồi chứ? Vâng, hãy copy đoạn code màu vàng vàng (bắt đầu bằng chữ Given nhé.) mà Cucumber xuất ra, và chúng ta cùng bắt đầu tạo step definitions để fix lỗi cho Cucumber.

Tạo Step Definition

Bây giờ các bạn hãy tìm tới folder step_definitions mà Cucumber đã tạo cho bạn ở bước #2, và tạo ra một file ruby đặt tên ‘calculator_steps.rb’ với nội dung chính là đoạn code mà bạn đã copy ở bước trước.

Vậy là mọi việc sắp xong rồi, giờ thì hãy xem qua cấu trúc lớp của Cucumber như thế nào nhé.

Nhìn sơ qua cấu trúc trên là đã hiểu rồi đúng không các bạn, Cucumber cũng đơn giản phải không nào, tới đây nếu bạn nào vẫn chưa làm được hãy để lại comment bên dưới nhé.

Nào, mở terminal lên và chạy lại lệnh cucumber với step definitions vừa tạo để xem có gì mới

Cucumber đã tìm đã chạy step đầu tiên trong scenario và đã gọi đến đoạn code step definitions mà chúng ta vừa tạo rồi. Việc của chúng ta bây giờ là fix lỗi pending nữa là xong. Hai steps màu xanh bị skipped  trên đó chính là cơ chế hoạt động của Cucumber, Cucumber sẽ tự bỏ qua các bước sau nếu như phát hiện có bước nào bị failed hoặc pending, Cucumber cũng sẽ dừng luôn scenario đang chạy và bỏ qua hết các bước tiếp theo.

Triển khai thực hiện Step Definition

Trong ví dụ đơn giản trên, hệ thống sẽ nhận 2 giá trị nhập vào từ phía người dùng thông qua command-line và công việc của step definition “Given the input “2+2”” là ghi nhớ những giá trị người dùng nhập vào để sau đó chuyển giao cho những bước tính toán tiếp theo.

Hãy mở file calculator_steps.rb trong thư mục step_definition của bạn lên và chỉnh sửa lại:

Và thế là chúng ta đã xử lý xong việc lưu trữ giá trị input từ feature bằng các dùng biến thực thể của Ruby. Biến @input này sẽ được lưu trữ quanh quẩn trong khi scenario đang chạy, nó sẽ tự động bị xóa ngay sau khi scenario dừng chạy, do đó chúng ta sẽ sử dụng nó để chạy cho những bước tiếp theo.

Giờ thì hãy ra lệnh cho cucumber chạy lại xem kết quả ra sao.

Giờ thì chúng ta cùng đi xử lý step definition thứ 2.

Với đoạn code trên, hệ thống sẽ mở một ứng dụng có tên là ‘calc.rb’, truyền vào đó giá trị đã được nhập vào ở step definition đầu tiên và sau đó lưu lại với biến thực thể có tên @output. Sau đó, chúng ta sẽ kiểm tra biến $? Xem liệu command chạy có thành công hay không, nếu không thì quăng ra lỗi với thông báo “Command failed!”

Lưu ý: Nếu muốn cucumber quăng ra lỗi tại bước nào, hãy kiểm tra và đặt ‘raise’ tại bước đó.

Lỗi, bởi vì hệ thống không tìm thấy tập tin nào có tên calc.rb cả. Hãy tạo ra một tập tin với tên ‘calc.rb’ ở ngoài thư mục calculator và gọi cucumber chạy lại xem kết quả như thế nào bạn nhé.

Chỉnh sửa lại step definition thứ 3 của bạn và chạy lại cucumber xem kết quả ra sao.

Chúng ta verify giá trị @output trả về từ calc.rb giống như giá trị chúng ta mong đợi (“4”) nhưng dường như calc.rb trả về null nên test case của chúng ta bị failed.

Hãy cùng làm một số bài tập nhỏ

  1. Hãy chỉnh sửa lại file ‘calc.rb’ để làm cho scenario trên chạy pass hết.
  2. Hãy chỉnh sửa lại feature để verify nhiều phép toán khác nữa (ví dụ: 3+3=6, 6+6=12)

Hãy dành chút thời gian quý báu để suy nghĩ và giải quyết 2 bài tập trên các bạn nhé, vừa học vừa tương tác sẽ giúp cho các bạn nhớ lâu hơn.

Mẹo nhỏ cho các bạn:

  • Hãy chạy cucumber với câu lệnh cucumber –format progress bạn sẽ thấy được sự khác biệt.
  • Muốn biết được thêm nhiều giá trị chạy kèm, hãy chạy lệnh: cucumber –help

Bài giải

Bài 1: Hãy chỉnh sửa lại file ‘calc.rb’ để làm cho scenario trên chạy pass hết.

Bài tập 2: Hãy chỉnh sửa lại feature để verify nhiều phép toán khác nữa (ví dụ: 3+3=6, 6+6=12)

trong bài tập 1  chúng ta đã “hardcode” nên giá trị trả về luôn luôn là “4”.

Fix lỗi bằng cách dùng argument ARGV[0] và gửi nó đến method eval của Ruby là xong.

Các bạn lưu ý để Cucumber thực hiện việc lặp lại test data trong cùng scenario thì các bạn sẽ phải chuyển scenario đó thành ‘Scenario Outline:’ kết hợp với ‘Examples:’.

Chúng ta vừa hoàn thành quy trình kiểm thử tự động bằng framework Cucumber, chỉ cần nắm vững cách hoạt động và các thức Cucumber làm việc, sau này các bạn có thể dễ dàng tùy biến và phát triển Cucumber thành một automation framework riêng cho mình. Các bạn vui lòng tham khảo thêm sơ đồ workflow bên dưới để nắm rõ hơn về cách hoạt động của Cucumber.

Chúng ta vừa hoàn thành xong phần automation testing với cucumber, nếu thấy hay và hữu ích, xin hãy chia sẻ chúng đến với mọi người để cùng nhau giúp đỡ cộng đồng kiểm thử phần mềm Việt Nam phát triển vững mạnh bạn nhé.