Screenplay pattern là gì? Khác gì với Page Object

Screenplay và Page Object Model là 2 patterns dành cho Automation Test. Dạo gần đây, screenplay nổi lên như cồn, nên mình đú trend, viết 1 bài để khái quát những đặc điểm của mô hình này.

I. Screenplay Pattern là gì?

Screenplay, tiếng anh có nghĩa là kịch bản, nên nhiều người hay chém gió “dùng screenplay có nghĩa mình là nhà soạn kịch“.

Nó là 1 design pattern phục vụ cho automation test, có thể áp dụng cho 2 level API và UI. Nguồn gốc của nó từ bác John Ferguson Smart, một người chuyên đi dạy về agile, tập trung vào BDD.

Bác ý có 1 framework tên là serenity bdd, nó support 3 cách làm việc khác nhau:

  • Page Object
  • Cucumber
  • Screenplay

Vậy nên bạn đừng nhầm lẫn screenplay là serenity và ngược lại. Screenplay là 1 design pattern thể hiện 1 cách viết test. Còn serenity bdd là 1 framework cho Automation Test.

Giờ đây screenplay đã có mặt trên 3 framework khác nhau

II. Mô hình của Screenplay, so sánh với Page Object.

Hình mình tự vẽ lại cho có màu xanh :v

Bạn nào đọc được tiếng anh thì có thể đọc hướng dẫn và giới thiệu về screenplay ở đây.

Mô hình Page Object:

1. Tất cả xoay quanh Actor

Trong mô hình này, trung tâm của nó là Actor. Vì sao nó lại có actor??? Actor là đại diện cho 1 người dùng thật, nó xuất phát từ story trong agile. Và đó cũng là điểm khác biệt mấu chốt giữa Screenplay và Page Object. Actor sẽ là người đứng ra làm mọi việc, điều này dễ hiểu hơn là việc gọi method từ pageA rồi pageB.

Ví dụ:

17 Useful user story examples to get you started - Justinmind
copy image from https://www.justinmind.com/blog/user-story-examples/

Code mẫu copy từ trang gốc:

@RunWith(SerenityRunner.class)
public class AddNewTodos {

    private Actor james = Actor.named("James");

    @Managed
    private WebDriver hisBrowser;

    @Before
    public void jamesCanBrowseTheWeb() {
        james.can(BrowseTheWeb.with(hisBrowser));
    }

    @Test
    public void should_be_able_to_add_a_todo_item() {

        givenThat(james).wasAbleTo(OpenTheApplication.onTheHomePage());

        when(james).attemptsTo(AddATodoItem.called("Buy some milk"));

        then(james).should(seeThat(theDisplayedItems, hasItem("Buy some milk")));
    }
}
  • Actor has an ability (có thể sử dụng browser, có thể sử dụng api)
james.can(BrowseTheWeb.with(hisBrowser));
//thực chất là khởi tạo webdriver
  • Actor do tasks (task này nhìn dưới góc độ business)
(james).wasAbleTo(OpenTheApplication.onTheHomePage())
(james).attemptsTo(AddATodoItem.called("Buy some milk"))
//thực chất là gọi các method để thực hiện action lên web application
  • Actor ask question
(james).should(seeThat(theDisplayedItems, hasItem("Buy some milk")));
//Thực chất là compare actual và expected

2. Khác biệt đến từ Task

Task dưới góc độ business sẽ giúp cho chúng ta:

  • Đọc nội dung của test là hiểu test này nói về cái gì, chứ không phải là những thứ vô nghĩa như điền “abc” vào thẻ input hay click vào buttion nào đó.
  • Task có thể chứa 1 hoặc nhiều task khác.
  • Khi nhìn vào task, bạn chỉ nhìn thấy business và chỉ khi nào đi đến cái task level cuối cùng, bạn sẽ nhìn thấy interaction, chính là code selenium tương tác với browser (tất nhiên là nó cũng được bọc bên ngoài bằng code của serenity với ý nghĩa rõ ràng hơn).

3. Viết test rất giống câu văn

Viết code như là viết văn, với người khác thì là điểm mạnh, với mình thì nó là điểm yếu vcđ, nó luôn làm cho mình phải nghĩ đến ngữ pháp tiếng anh mỗi khi viết code và phải hi sinh java coding convention =)))) Còn bạn thì sao, hãy comment phía dưới nhé.

@Test
public void should_be_able_to_add_a_todo_item() {
     givenThat(james).wasAbleTo(OpenTheApplication.onTheHomePage());
     
     when(james).attemptsTo(AddATodoItem.called("Buy some milk")); 
    
     then(james).should(seeThat(theDisplayedItems, hasItem("Buy some milk"))); 
}

III Để dùng screenplay hiệu quả

1. Về mind-set

  • Bạn phải thấm nhuần tư tưởng của BDD, sử dụng example, story …Tốt nhất là đọc kỹ cuốn BDD in action của ông John.
  • Team bạn phải làm theo phương pháp BDD, nếu không thì người tím lịm chính là người viết test. :v

2. Về kỹ thuật

  • Java core (cực chắc chắn)
  • Bạn phải hiểu và biết cách sử dụng Interface: marker interface và functional interface (lambda expression) và cả interface thông thường.
  • Ngoài ra là Generics, Annotation
  • Bạn nên làm quen với kiểu đẻ class mới như lợn con, vì screenplay tách nhỏ từng thứ, nên viết rất nhiều class. Nếu đơn giản viết một đoạn code 3 dòng selenium mở 1 trang web nào đó thì bên này bạn phải có đến khoảng 3 class. Không nói bạn cũng có thể mường tượng số lượng dòng code gấp khoảng vài lần.

IV. Tổng kết

Nếu bạn thấy hay hoặc không hiểu gì, đừng ngại ngần cho bài viết 1 like. :))) Vì để viết được bài này, tác giả phải làm đôi cái dự án dùng screenplay và đọc code framework ngày đêm. Nếu bạn muốn tác giả phân tích code của framework serenity, hãy để lại 1 comment, tác giả sẽ viết dần (nếu rảnh).

5 1 vote
Article Rating
Subscribe
Notify of
guest
17 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
truyen
truyen
2 years ago

hóng

Vương Anhh
Vương Anhh
2 years ago

Vẫn chưa có ạ, hóng quá !!!

Vương Anhh
Vương Anhh
2 years ago
Reply to  Giang Nguyen

Anh có thể phân biệt Interaction và Task giúp em ko ạ, em thấy 2 thằng này nó khá giống nhau. Em cảm ơn ạ.

qc gà
qc gà
2 years ago

Đã đọc qua bài viết. Và nhận xét từ 1 người có làm qua cucumber và chưa làm qua screenplay thì vẫn chưa thấy sự pro hơn hẳn ở đây nhưng cách viết code lại phức tạp hơn nhiều lần.
Cảm ơn tác giả nhé!

Nguyễn Anh Tuấn
Nguyễn Anh Tuấn
2 years ago

Mong anh làm thêm nhiều bài về Senerity Framework + Cucumber + Screenplay Pattern ạ, đúng thật là dạo gần đây nó rất hot, như là xu thế tương lai vậy ạ, mặc dù từ bài viết này cá nhân em thích POM hơn vì nó ko phải nhớ nhiều đến các keyword của Screenplay, và code của POM cũng đơn giản dễ đọc vs người đã code có tí kinh nghiệm rồi 😀

Em hóng phần này lắm, em sẽ thường xuyên lên page để hóng các bài viết mới của anh về chủ đề này 😀
Chúc anh nhiều sức khỏe ạ ^^

beauti
beauti
1 year ago
Reply to  Giang Nguyen

cucumber có kết hợp với screenplay được các bác ạ
e vẫn đang làm việc có sự kết hợp này ạ

thuy
thuy
2 years ago

hóng code của framework serenity

Phong
Phong
2 years ago
Reply to  Giang Nguyen

Vài tháng sau rồi, vẫn hóng tiếp 😀

Hongthai`
Hongthai`
2 years ago

đọc xong vẫn chưa hiểu lắm, 😀 nhưng sẽ đọc đi đọc lại nhiều lần bài a Giang viết. Hy vọng không bị đuổi việc sớm a :(((