Nội dung bài viết
Xin chào các bạn – đây loạt bài viết hướng dẫn về Build Automation Framework. Các bài viết này được hướng dẫn từ khóa học Build Automation Framework in Java with Page Object Pattern – bạn nào quan tâm và muốn làm bài bản thì nên tham gia để học và thực hành trên dự án từ A-Z nhé.
Bài viết này hướng dẫn tạo test sample đầu tiên để kiểm tra môi trường có hoạt động đúng hay không – test này sẽ viết theo dạng basic mục đích để so sánh với các cách viết khác (các bài sau) – nói rõ ưu nhược điểm tại sao lại cần triển khai framework và không nên viết test theo dạng basic (step-by-step) như thế này
Test business
- Các testcase để validate cho form login
-
- Testcase 01 – Login với email/ password là empty
- Testcase 02 – Login với email invalid ([email protected])
- Testcase 03 – Login với email incorrect (not existing)
- Testcase 04 – Login với password invalid (nhỏ hơn 6 kí tự)
- Testcase 05 – Login với password incorrect (nhập sai password)
- Testcase 06 – Login với email/ password hợp lệ
Code demo
package com.liveguru.login; import java.util.Random; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class Login_01_Step_By_Step { WebDriver driver; @BeforeClass public void beforeClass() { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.get("http://live.techpanda.org/"); } @BeforeMethod public void beforeMethod() { driver.findElement(By.xpath("//div[@class='footer']//a[text()='My Account']")).click(); } @Test public void TC_01_LoginWithEmptyEmailAndPassword() { driver.findElement(By.id("email")).sendKeys(""); driver.findElement(By.id("pass")).sendKeys(""); driver.findElement(By.id("send2")).click(); assertEquals(driver.findElement(By.id("advice-required-entry-email")).getText(), "This is a required field."); assertEquals(driver.findElement(By.id("advice-required-entry-pass")).getText(), "This is a required field."); } @Test public void TC_02_LoginWithInvalidEmail() { driver.findElement(By.id("email")).sendKeys("[email protected]"); driver.findElement(By.id("pass")).sendKeys("123456"); driver.findElement(By.id("send2")).click(); assertEquals(driver.findElement(By.id("advice-validate-email-email")).getText(), "Please enter a valid email address. For example [email protected]."); } @Test(description = "Email not exist in application") public void TC_03_LoginWithIncorrectEmail() { driver.findElement(By.id("email")).sendKeys("auto_test" + randomNumber() + "@live.com"); driver.findElement(By.id("pass")).sendKeys("123456"); driver.findElement(By.id("send2")).click(); assertEquals(driver.findElement(By.xpath("//li[@class='error-msg']//span")).getText(), "Invalid login or password."); } @Test(description = "Password less than 6 characters") public void TC_04_LoginWithInvalidPassword() { driver.findElement(By.id("email")).sendKeys("auto_test" + randomNumber() + "@live.com"); driver.findElement(By.id("pass")).sendKeys("123"); driver.findElement(By.id("send2")).click(); assertEquals(driver.findElement(By.id("advice-validate-password-pass")).getText(), "Please enter 6 or more characters without leading or trailing spaces."); } @Test public void TC_05_LoginWithIncorrectPassword() { driver.findElement(By.id("email")).sendKeys("auto_test" + randomNumber() + "@live.com"); driver.findElement(By.id("pass")).sendKeys(randomNumber() + ""); driver.findElement(By.id("send2")).click(); assertEquals(driver.findElement(By.xpath("//li[@class='error-msg']//span")).getText(), "Invalid login or password."); } @Test public void TC_06_LoginWithValidEmailAndPassword() { driver.findElement(By.id("email")).sendKeys("[email protected]"); driver.findElement(By.id("pass")).sendKeys("123123"); driver.findElement(By.id("send2")).click(); assertTrue(driver.findElement(By.xpath("//h3[text()='Contact Information']/parent::div/following-sibling::div[@class='box-content']/p[contains(.,'Automation FC')]")).isDisplayed()); assertTrue( driver.findElement(By.xpath("//h3[text()='Contact Information']/parent::div/following-sibling::div[@class='box-content']/p[contains(.,'[email protected]')]")).isDisplayed()); } @AfterClass public void afterClass() { driver.quit(); } private int randomNumber() { Random rand = new Random(); return rand.nextInt(999999); } }
Test Result
Phân tích
- Ưu điểm:
- Viết nhanh cho những chức năng đơn giản – ít step
- Viết theo dạng Selenium API nên không cần nhiều kĩ năng lập trình
- Nhược điểm:
- Khó bảo trì khi các step giống nhau sẽ lặp lại nhiều lần trong các class khác nhau
- Selenium API bị lặp lại
- Locator bị lặp lại
- Data test bị lặp lại
- Không phù hợp với những dự án phức tạp – nhiều chức năng
- Vi phạm nguyên tắc DRY
- Nguyên tắc này có nghĩa là đừng có viết lặp bất kỳ lại một đoạn mã nào mà hãy đóng gói nó thành phương thức riêng – đến khi cần thì chỉ cần gọi tên nó ra
- Khó bảo trì khi các step giống nhau sẽ lặp lại nhiều lần trong các class khác nhau