Nội dung bài học
✅ Cách generate Step Definitions từ Gherkin
✅ Cách Cucumber tìm kiếm các steps
✅ Cách chạy một feature file
✅ Cách tạo và bố trí Feature File
Feature có thể được hiểu là một đơn vị hoặc chức năng độc lập của một dự án. Ví dụ như một trang web thương mại điện tử, một vài tính năng (features) có thể xác định như:
- Đăng nhập bằng tài khoản hệ thống hoặc mạng xã hội
- Tìm kiếm hàng hóa
- Thanh toán
- Thêm sản phẩm
....
Trong Cucumber mỗi feature có thể hiểu là mỗi chứ năng độc lập của sản phẩm. Trước khi viết test scripts chúng ta nên xác định trước các features cần test để mang lại hiệu quả cao. Các tests xây dựng trong Cucumber được gọi là các feature files và có dạng đuôi mở rộng .feature, mỗi feature cần test nên đặt trong 1 file feature tương ứng.
Cách tạo thì ở bài trước chổ cài đặt Cucumber An cũng có chia sẻ rồi nên là ở đây An chỉ chia sẻ cho các bạn cách chúng ta bố trí các feature file sao cho hợp lý trong project auto test của mình thôi.
Như vậy thì An góp ý luôn là chúng ta sẽ tạo folder tên features bên trong thu mục recources của phần package test. Và chúng ta sẽ tạo thêm các folder con bên trong để phân ra các module test với nhau để dễ quản lý và gọi lại thực thi.
Ví dụ nếu An test hệ thống CRM thì nó gồm có các module như Login, Customers, Projects,...Thì mình sẽ tạo folder con với chính tên module đó luôn.src/test/recourses/features/Login/Login.feature
src/test/recourses/features/Customers/Customers.feature
src/test/recourses/features/Projects/Projects.feature
✅ Cách generate Step Definitions từ Gherkin
Mặc dù đã có file feature nhưng Cucumber chưa thực sự biết đoạn mã nào sẽ được thực thi cho từng scenario cụ thể được nêu trong file feature. Nó cần một file trung gian Step Definition, file này ánh xạ các bước thực hiện (step), features (Given,When,Then) trong scenario với đoạn mã (code) chức năng cần thực thi. Step được định nghĩa trong file java chẳng hạn như "stepdefinitions/StepLoginCRM.java".
Như bên dưới này thì An sẽ chỉ các bạn generate một Step Definitions từ Feature LoginCRM
Format Gherkin hiện màu Vàng là báo hiệu nó chưa tìm thấy code Step Definitions tương ứng. Nhờ có 2 plugin hỗ trợ mà chúng ta đã cài vào IntelliJ nó báo hiệu.
Tiếp theo chúng ta tạo file step definitions để chứa hết tất cả các step trong Gherkin.
🔆 Tạo Step Definitions cho Feature File
Bước 1: Rê chuột vào một step bất kỳ. Dialog gợi ý hiện lên và chọn more actions
Bước 2: nhấn chọn Create all step definitions để nó generate ra tất cả các step bên trong Gherkin.
Bước 3: đặt tên cho File java để lưu các steps trên. Các bạn có thể chọn như hình
Bước 4: Khi nhấn Ok thì nó sẽ tạo file để chứa Steps và Gherkin cũng đã mapping với các steps đó
Vậy là xong phần tạo file Step Definitions cho file Feature hay Gherkin tương ứng rồi.
🔆 Cách bố trí Step Definitions
Các step definitions chính là các file Java và cụ thể hơn là nó nằm trong các class y như chúng ta code Selenium Java. Nội dung bên trong là chúng ta điền code Selenium Java vào để nó thực thi.
Nơi đặt các Step Definitions hợp lý sẽ là trong package test (src/test/java
) vì nó sẽ tự động hiểu đó là package nguồn. Tuỳ chúng ta có để trong package con hay không. Chẳng hạn như package com.anhtester.stepdefinitions
và An sẽ đặt như vậy để source code chúng ta gọn ràng hơn.
Và thuận tiện khi chúng ta khai báo đường dẫn của step definitions trong Cucumber Option (Cucumber Test Runner)
import io.cucumber.testng.CucumberOptions;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import org.testng.annotations.Test;
@CucumberOptions(
features = "src/test/resources/features",
glue = "com.anhtester.stepdefinitions",
plugin = {"pretty", "html:target/cucumber-html-report.html"}
)
@Test
public class RunCucumberTests extends AbstractTestNGCucumberTests {
}
Các bạn chú ý chổ "glue
" chính là khai báo đường dẫn đến các step definitions. Chúng ta có bao nhiêu vị trí chung để lưu file step thì khai báo vào hết, cách nhau bởi dấu phẩy và đặt trong dấu ngoặc nhọn. Ví dụ:
import io.cucumber.testng.CucumberOptions;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import org.testng.annotations.Test;
@CucumberOptions(
features = "src/test/resources/features",
glue = {"com.anhtester.projects.website.crm.stepdefinitions",
"com.anhtester.projects.website.cms.stepdefinitions",
"com.anhtester.common.stepdefinitions",
"acom.anhtester.hooks"},
plugin = {"pretty", "html:target/cucumber-html-report.html"}
)
@Test
public class RunCucumberTests extends AbstractTestNGCucumberTests {
}
✅ Cách Cucumber tìm kiếm các steps
Trong Cucumber nó sẽ tự động nhận diện các steps nằm rải rác ở nhiều file step definitions trong một project cho cùng một feature file.
Nghĩa là các step definitions được generate ra từ một feature file nó có thể nằm ở nhiều file step khác nhau. Chính vì thế chúng ta khai báo chổ glue gồm nhiều đường dẫn trỏ đến.
Ví dụ: Gherkin có 5 steps
Thì chúng ta để tại class StepsLoginCRM
4 step desinitions
Còn 1 step mình đặt tại CommonStepDefinitions
Như vậy nếu chúng ta không thay đổi gì trong Test Runner. Nghĩa là chỉ để 1 đường dẫn đến nơi chứa file StepsLoginCRM
thì nó sẽ báo lỗi không tìm thấy 1 step Given đầu
Bây giờ chúng ta chỉ cần thêm đường dẫn đến nơi chứa các file steps liên quan vào từ khoá "glue" trong Test Runner là ok.
Thì đó là cách Cucumber hoạt động để tìm các step definitions.
Qua đây chúng ta mới nghiệm lại là nếu như vậy thì làm sao thiết kế driver theo dạng BaseTest trong TestNG với mô hình Page Object được đây. Vì steps nó rải rác ra nhiều nơi mà theo TestNG thuần chúng ta buộc thiết kế @Test chung một nơi 😝
Yeah tức nhiên sẽ có cách. An sẽ chỉ các bạn trong các bài tiếp theo.
✅ Cách chạy một feature file
Chúng ta có thể chạy một feature file bằng 2 cách:
- Chạy trực tiếp tại class Test Runner mà chúng ta thiết đặt cho nó.
- Gọi class Test Runner sang Suite XML để chạy y như TestNG thuần gọi một class
Và cách 2 sẽ là cách dùng hợp lý. Chúng ta dùng Cucumber kết hợp TestNG để sử dụng thế mạnh của TsestNG chổ này. Sau này sẽ gọi sang Maven để chạy càng tiện hơn.
Hết hết hết hết hết rồi 😜
Anh Tester
facebook.com/anhtester
Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu