Ưu tiên dùng Enum thay String

Các bạn mới làm việc với Automation test dùng Java thì thường dùng String cho tất cả mọi thứ. Tuy nhiên, việc dùng String quá nhiều sẽ dẫn đến nhiều trường hợp lỗi (chủ yếu là lỗi typo) mà nếu dùng Enum ta có thể hạn chế được.

I. Dùng Enum cho method Argument:

Mình sẽ ví dụ như trường hợp dưới đây:

@Test
void test1(){
    selectGenderByName("nam");
}

@Test
void test2(){
    selectGenderByName("nan");
}

Nếu bạn có nhiều tests mà phải dùng function selectGenderByName(String) nhiều, bạn hoàn toàn có thể viết nhầm, ví dụ trên, mình nhầm “nam” và “nan”, dẫn đến test2 có thể fail. Và lỗi này hoàn toàn có thể sửa được bằng cách dùng Enum. Mình ko viết lại định nghĩa về Enum, bạn tự tìm hiểu.

Test mới có thể hoàn toàn được viết lại như sau:

import static unitTest.Gender.MALE;
...

@Test
void test1(){
    selectGenderByName(MALE.value());
}

@Test
void test2(){
    selectGenderByName(MALE.value());
}

Còn Enum thì mình sẽ viết như sau:

public enum Gender {
    MALE("nam"), FEMALE("nữ"), NA("chưa xác định");

    private String value;

    private Gender(String value) {
        this.value = value;
    }

    public String value() {
        return value;
    }
}

Với cách này, bạn sẽ có nhiều lợi ích:

  • Tránh lỗi về Typo, nhất là với trường hợp có nhiều ký tự.
  • Dễ maintain khi thay đổi giá trị, bạn chỉ cần sửa 1 nơi sẽ được tất cả các chỗ, nếu bạn điền String bạn sẽ phải sửa từng chỗ một, rất mất công.

Tuy nhiên, bạn không thể cứ sử dụng Enum tràn làn, chỗ nào có String thì thay thế bằng Enum. Chỉ nên sử dụng Enum cho:

  • Các giá trị mà số lượng không quá nhiều. Ví dụ Gender chỉ có 3 giá trị. (mình recommend là <= 5)
  • Các giá trị thường ít thay đổi, ví dụ như trong Selenium hay phải gặp Select box dùng để filter chẳng hạn. Các giá trị ở filter thường ít thay đổi.

II. Dùng Enum cho Switch-Case:

Các bạn có thể sẽ gặp kiểu viết này:

public WebDriver getDriver(String webdriver) {
        switch (webdriver) {
            case "chrome":
                this.driver = new ChromeDriver();
                break;
            case "firefox":
                this.driver = new FirefoxDriver();
                break;
            default:
                throw new IllegalArgumentException("Invalid WebDriver");
        }
        return this.driver;
    }

Chỗ nào bạn muốn gọi method này, bạn phải viết là:

WebDriver driver = driverHelper.getDriver("chrome");

Chỗ này sẽ rất dễ có lỗi typo và chưa kể là so sánh String thì phải đúng 100% các ký tự, in hoa và chữ thường sẽ được tính là khác nhau.

Hãy chuyển sang Enum:

public WebDriver getDriver(DriverType webdriver) {
        switch (webdriver) {
            case CHROME:
                this.driver = new ChromeDriver();
                break;
            case FIREFOX:
                this.driver = new FirefoxDriver();
                break;
            default:
                throw new IllegalArgumentException("Invalid WebDriver");
        }
        return this.driver;
    }
public enum DriverType {
    FIREFOX, CHROME
}

Khi cần dùng, sẽ gọi method như sau:

import static unitTest.DriverType.CHROME;
...
WebDriver driver = driverHelper.getDriver(CHROME);

III. Tổng kết

Khi bạn biết cách sử dụng Enum hợp lý thì sẽ tiết kiệm được rất nhiều thời gian cho việc maintain, và tránh được nhiều lỗi typos. Tuy nhiên hãy tự cân nhắc để tránh việc sử dụng Enum tràn lan, không đúng mục đích. 😀 Hết.

Leave a Reply

Your email address will not be published. Required fields are marked *