[Bài 9] Hoàn chỉnh test script login – Xử lý duplicate code

Ở bài này, mình sẽ hướng dẫn xử lý việc duplicate code một cách đơn giản và sẽ còn sử dụng cách này để làm những bài tiếp theo.

Ta thấy 2 cái test case ở bài trước, đều có chung nhau 1 đoạn như sau:

Chỉ khác nhau cái giá trị username và password truyền vào thôi. Thế ta sẽ viết 1 cái function dùng chung luôn nhỉ. Function này sẽ linh hoạt cái giá trị username và password là xong.

Function dùng chung đây:

Do function này không phải là Test case nên ta không cần đặt annotation @Test vào. Sau đó ta bỏ những dòng code ở các testcase ra và thay bằng function login.

Tuy nhiên, sau khi viết thì Eclipse báo lỗi ở chỗ các vị trí driver, lý do là cái object driver nó đang được khai báo và khởi tạo ở function login, nó không có ảnh hưởng gì đến các method test. Để fix, ta phải biến cái driver ấy thành Global variable, bằng cách khai báo nó ngoài các method.

Code sau khi sửa sẽ thành thế này:

 


Ta chợt thấy hình như ta càng ngày càng làm các method Test ngắn gọn hơn thì phải. Yeah, chúng ta đang trên đường build Test Automation Framework, việc chúng ta phải làm là: Làm cho test càng đơn giản càng tốt, phần xử lý phức tạp sẽ để Framework xử lý.


Nhìn vào đoạn trên ta vẫn thấy còn có 2 chỗ nữa vẫn không tốt:

  • driver.quit() đang bị lặp lại ở các test case.
  • Function login() đang có nhiều hơn 1 chức năng: Khởi tạo Object, vào trang login, thực hiện login

1. Để xử lý phần lặp lại driver.quit() ta sử dụng thêm 1 cái annotation nữa của TestNG là @AfterMethod. Cái method nào có sử dụng annotation này sẽ run sau 1 method test. Và như thế ta sẽ không cần viết driver.quit() ở mỗi test case nữa

 

2. Ta cần phải viết lại để cái function login() chỉ có 1 chức năng login duy nhất thôi. Có thể đến đây bạn sẽ phân vân là thế thì driver.get(URL_login) có được đặt vào function login không hay mình sẽ phải viết ở chỗ khác?

Ta suy nghĩ 1 chút, có phải là hầu hết các test case của ta đều sẽ làm việc với trang login đầu tiên đúng không? Thế thì việc vào trang login là điều mà test case nào cũng sẽ có. Do đó ta nên đặt nó vào 1 chỗ mà sẽ run trước tất cả các method test. Ok, sử dụng tiếp 1 annotation nữa của TestNG: @BeforeMethod.

 

Code hoàn chỉnh sẽ như sau:

Cái method Test ngắn lại nữa rồi. Nhìn thích phết :D.

Bạn đang vui mừng vì cái Script của bạn đang ngày càng đẹp lên, và bạn lại nghĩ rằng code automation vẫn dễ, ngày mai sẽ viết thêm 1 đống test nữa. Nhưng mà bạn ơi, lại có vấn đề tiếp:

  • Ngày mai bạn viết thêm 1 Class khác để test chức năng “Tạo bài viết mới”. Bạn chợt nhận ra rằng, hình như mai mình sẽ phải copy mấy cái BeforeMethod, AfterMethod từ Class LoginTest này sang. Ớ ớ ớ, vừa mới học để xử lý duplicate code xong, bây giờ lại chuẩn bị duplicate code ở chỗ mới. =))))))
  • Trang login này có ít element và ít test case nên cái class của bạn nó còn ngắn. Thế sang 1 cái chức năng ở 1 màn hình khác có rất nhiều element và rất nhiều test case thì cái Class test của bạn sẽ rất dài và rất loạn.
  • Khi test manual thì mỗi lần test đâu có cần đóng browser rồi mở lại đâu nhỉ?
  • Chức năng khác đều yêu cầu login thành công trước, thế mình phải copy nguyên cái đoạn code của login đi khắp các Class test ah. Xử lý thế nào đây?

Nhiều vấn đề quá nhỉ…hiu hiu…Hãy tiếp tục đọc các bài tiếp theo nhé. 😀

[Bài 10] Ý nghĩa của class base

5 thoughts on “[Bài 9] Hoàn chỉnh test script login – Xử lý duplicate code

  1. Pingback: [Bài 8] Hoàn chỉnh test script login | GiangTester Blog

  2. Pingback: [Bài 10] – ý nghĩa của class base | GiangTester Blog

  3. Pingback: [Bài 11] WebDriver script đơn giản thứ hai | GiangTester Blog

  4. Biết viết của Giang đúng là những gì mình đang cần về cả cấu trúc, tư duy
    Cảm ơn nhiều nhiều

Leave a Reply

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