Khi Duplicate code trong 1 class thì ta viết 1 function để dùng chung. Thế khi duplicate code ở 2 class khác nhau thì làm thế nào? Có 1 cách xử lý đó là viết 1 Class dùng dung.
Ở trong Java cũng như các ngôn ngữ lập trình hướng đối tượng khác, đều có khái niệm Class cha – con (superclass và subclass). Nó thể hiện tính thừa kế trong ngôn ngữ hướng đối tượng. Nếu bạn chưa biết thì nên đọc lại Java basic trước khi đọc tiếp.
Quay trở lại bài toán hiện tại, chúng ta cần viết thêm 1 Class test chức năng “tạo bài viết mới” với rất nhiều test case khác. Bên cạnh đó, class LoginTest và class AddNewPostTest có chung BeforeMethod và AfterMethod. Vậy thì ta có thể viết 1 classe BaseTest là class cha và để 2 Class kia kế thừa từ đó.
Class BaseTest như sau:
public class BaseTest { WebDriver driver; public static final String URL_login = "http://localhost/wp/wp-login.php"; public static final String URL_dashBoard = "http://localhost/wp/wp-admin/"; @BeforeMethod public void setUp() { driver = new FirefoxDriver(); driver.get(URL_login); } @AfterMethod public void tearDown() { driver.quit(); } }
Bên cạnh việc tách 2 Method thì mình còn sửa lại 1 chút.
Class LoginTest sẽ phải thừa kế từ Class BaseTest thông qua keyword là extends.
public class LoginTest extends BaseTest{ String URL_dashBoard = "http://localhost/wp/wp-admin/"; String user_login = "user_login"; String user_pass = "user_pass"; String submitBtn = "wp-submit"; public void login(String userName, String password) { driver.findElement(By.id(user_login)).sendKeys(userName); driver.findElement(By.id(user_pass)).sendKeys(password); driver.findElement(By.id(submitBtn)).click(); } @Test public void loginWithBlankField() { login("", ""); Assert.assertEquals(driver.getCurrentUrl(), BaseTest.URL_login); } @Test public void loginByAdmin() { login("giang", "123456789"); Assert.assertEquals(driver.getCurrentUrl(), URL_dashBoard); } }
NOTE: Class con sẽ được kế thừa toàn bộ các thuộc tính của class cha. Do đó ở class con sẽ không cần phải khai báo WebDriver driver nữa.
Class test của chúng ta ngày càng ngắn nhỉ. =)))) Thực ra là nó chia nhỏ thành nhiều Class khác nhau mà thôi. Dù thế nào đi chăng nữa, thì có vẻ nó cũng đang khá chuyên nghiệp. 😀
Vậy là 4 vấn đề ở bài trước, ta đã xử lý được thằng đầu tiên. Có vẻ bài hơi ngắn, xử lý thêm 1 vấn đề nữa nhé. ^^
- Khi test manual thì mỗi lần test đâu có cần đóng browser rồi mở lại đâu nhỉ?
—> Không nên làm điều này với automation vì thực ra các case đúng nên phải re-new cái session. Mình làm chồng các test case sẽ có thể bị ảnh hưởng bởi trạng thái của các test case trước, dẫn đến việc kết quả sẽ có thể bị sai. Với lại việc sử dụng script làm giảm thời gian test rồi nên nó vẫn đáp ứng được yêu cầu về mặt thời gian test như manual.
Thế là chỉ còn 2 vấn đề nữa thôi nhỉ. Yeah. Những bài tiếp theo, mình vừa tạo thêm test case mới và vừa xử lý thêm các vấn đề khác. See you there! Thank you.
[…] ← Previous Next → […]
[…] ← Previous […]
[…] Vì cái Navigation này hầu như Page nào cũng sử dụng nên mình sẽ viết nó vào BasePage như mình đã nói ở bài 10. […]
Nếu muốn test cái chức năng tự động đăng nhập thì làm thế nào anh. Tức là khi bấm vào checkbox Remember, tắt trình duyệt. lần sau vào không cần đăng nhập lại ấy.
Mình không test chức năng đó bằng automation, mình làm manual. Còn nếu vẫn muốn làm bằng automation thì sẽ sử dụng add profile cho browser, cụ thể là add cookie.
có phải bỏ các public ở class BaseTest đi không a, để public không chạy được ạ?
Để public mà không chạy được??? chắc bạn nhầm, nó chỉ access modiffier và public là mở access rộng nhất rồi. Có thể bạn đang mắc lỗi khác.
Trong class LoginTest thấy khai báo URL_dashBoard, nhưng URL_login lại không có, vậy có khác nhau gì không khi mà cả 2 đều sử dụng trong class này ?
URL_login đã được khai báo ở BaseTest rồi nên trong LoginTest mình ko cần phải khai báo lại vì nó đã thừa kế rồi.
à, vì mình thấy URL_dashBoard được khai báo ở cả 2 chỗ nên ko biết là nó khác gì với URL_login. 🙂
Chắc mình viết thừa đấy. 😀 tks bạn!
“Khi test manual thì mỗi lần test đâu có cần đóng browser rồi mở lại đâu nhỉ?”
Anh cho em hỏi chút ạ.Em muốn trên automation test , mỗi lần test không cần đóng browser thì làm như nào ạ.
Chuyển annotation từ BeforeMethod sang BeforeSuite.
Nhưng chắc em chưa thực hành làm automation bao giờ nên chưa biết được tại sao phải re-new cái test từ đầu. Hãy thử và cảm nhận khi 1 test fail nó làm cả dãy test phía sau fail nốt. Good luck!
Anh cho em hỏi vậy nếu một class Test khác có url khác url login ở trên thì đâu dùng class base ở trên được đúng không ạ, vậy mình xử lí như thế nào ạ?.
Em có nghĩ là đưa @beforeMethod ra ngoài class Test nhưng mà cảm thấy như vậy thì hơi dài.
Anh nghĩ là em cứ tiếp tục các bài khác ở series, biết đâu cái em muốn lại được anh viết rồi.
Hi anh, sau khi đọc các bài tiếp theo trong series thì em đưa ra cách giải quyết là trong class BaseTest sẽ khai báo url đầu tiên là url login trong @beforeMethod, sau đó các class khác như Dashboad sẽ bắt đầu đi từ url login sau đó navigation sang url dashboard và thực hiện test.
Anh confirm giúp em cách làm như vậy có ổn không với ạ?
Hi em,
Khi em làm việc với Selenium thì có nghĩa là em đang giả lập những hành động của user sử dụng browser.
Nếu em là người dùng bình thường, liệu em sẽ chọn open url cho page shopping cart hay em sẽ click vào icon shopping cart? Em trả lời được là em tự biết sẽ phải làm gì rồi. 😀