BaymaxSky / baymax-community-question

1 stars 0 forks source link

Sự khác nhau giữa Task.where và Instrumented.instanceOf #2

Open jacobvn84 opened 1 year ago

jacobvn84 commented 1 year ago

Có 2 kiểu viết trong serenity screenplay java

Task.where

public static Performable toMyAccount() {
        return Task.where("{0} goes to the My Accounts page",
                Click.on(MenuBar.MY_ACCOUNT)
        );
    }

Instrumented.instanceOf

public static Task of(String keyword) {
    return Instrumented.instanceOf(SearchForKeyword.class).withProperties(keyword);
}

2 kiểu này khác nhau gì nhỉ? thích dùng cái nào thì dùng đúng ko nhỉ?

jacobvn84 commented 1 year ago

Tham khảo mã nguồn của Task

package net.serenitybdd.screenplay;

import net.serenitybdd.core.steps.Instrumented;
import net.thucydides.core.util.NameConverter;

import java.util.Arrays;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * A marker class to indicate that a Performable represents a higher level business task,
 * rather than a system interaction.
 */
public interface Task extends Performable {
     ...

    /**
     * Create a new Performable Task made up of a list of Performables.
     */
    static <T extends Performable> AnonymousTask where(String title, T... steps) {
        return Instrumented.instanceOf(AnonymousTask.class).withProperties(title, Arrays.asList(steps));
    }

  ....
}

So sánh

Trên là đoạn trích mô tả Task.where. Phương thức where trong interface Task gọi đến Instrumented.instanceOf(AnonymousTask.class).withProperties(title, Arrays.asList(steps)).

Vậy bản chất khi so sánh giữa Task.whereInstrumented.instanceOf theo ví dụ trên thực ra là so sánh 2 đoạn code dưới đây.

Instrumented.instanceOf(AnonymousTask.class).withProperties(title, Arrays.asList(steps)) (1) vs Instrumented.instanceOf(AnonymousTask.class).withProperties(constructorParameters) (2)

Đối với Instrumented.instanceOf(SearchForKeyword.class).withProperties(keyword) (2) tất cả các steps được đóng gói trong SearchForKeyword.class điều này có nguy cơ dẫn đến việc dễ đánh mất bối cảnh hoặc quên mất bối cảnh của việc sử dụng SearchForKeyword task trông tổng thể kịch bản khi mà lập trình viên mở riêng file code ra để sửa. Bù lại nó làm cho kịch bản trở nên bớt rườm rà và chi tiết.

Dùng Task.where giúp ta có một cái nhìn một cách trực quan, inline hơn vì chúng ta có khả năng thêm, bớt được các steps trong quá trình implementation một cách dễ dàng. Có thể sử dụng một danh sách các công việc T... steps. Cách này cho phép chúng ta lười biếng một chút. Có thể thoải mái hơn trong việc định hình các mối liên quan giữa các steps trong Task.where