SELENIUM Bài 8: Framework & Design

 I. Automation Framework

1. Automation Framework là gì ?

  • Framework là một bộ các quản lý ứng dụng, giúp chúng ta quản lý các concept, code, process, môi trường test, thư viện test một cách hiệu quả hơn.
  • Một Framework bao gồm rất nhiều chức năng, những chức năng đó giúp chúng ta quản lý code, các convention của code, quản lý các report, quản lý log, quản lý cơ chế debug, quản lý test data, test result, test case, test suite....

Hình 1: Automation Framework

2. Các loại Framework

a. Script Modularity Framework

  • Script Modularity Framework quản lý các code theo từng module, từng mô hình, từng chức năng giúp chúng ta có thể tái sử dụng code dễ dàng hơn.

b. Library Architecture Framework

  • Library Architecture Framework cũng tương tự Script Modularity Framework, nó cũng tạo ra các common library cho từng module, cho từng màn hình... những gì có thể dùng chung được, framework này sẽ nhóm lại thành các common function và sử dụng các common function cho các test case, giúp chúng ta tránh bị duplicate code.

c. Keyword-Driven Framework

  • Keyword-Driven Framework hay còn gọi là Table-Driven Testing Framework.
  • Trong framework này các test data sẽ được đưa vào dạng bảng như file excel..., sau đó Automation tester sẽ tạo ra các keyword và  sử dụng các keyword này để tạo thành các test suite, test case, ví dụ như chúng ta có thể sử dụng excel để tạo ra các test case, Keyword-Driven Framework sẽ đọc các keyword trong file excel đó và sau đó nó sẽ chạy các chức năng của từng keyword.
  • Hiện tại Framework này đang hot nhất, chúng ta có thể tìm hiểu kỹ hơn tại link này: LINK BÀI VIẾT

d. Data-Driven Testing Framework

  • Data-Driven Testing Framework sẽ đọc data từ các external data source ví dụ như từ datapools, từ các excel file, csv file vào các biến trong test case và sau đó chạy các test script dựa theo các biến đọc được từ data đó, mỗi dòng trong file excel sẽ thành một test case riêng.
  • Data-Driven Testing Framework giúp chúng ta quản lý data dễ dàng hơn, chỉ cần tạo một test script, chúng ta có thể chạy rất nhiều test case
  • Mỗi khi có sự thay đổi về data, chúng ta chỉ cần sửa trong file excel mà không cần phải sửa code, sửa data sẽ dễ dàng hơn là sửa code.

e. Hybrid Test Automation Framework

  • Hybrid Test Automation Framework sẽ bao gồm tất cả các loại Framework kể trên, hiện tại các Framework chúng ta đang sử dụng bây giờ hầu hết đều là Hybrid Framework.

3. Page Object Model 

a. Page Object Pattern

  • Để quản lý các object trong các Framework thì chúng ta sẽ quản lý theo từng màn hình, với mỗi màn hình sẽ tạo ra một class để quản lý.
  • Ưu điểm: Việc quản lý object tập trung trong từng Page sẽ giúp quản lý hiệu quả hơn, dễ dàng maintain,  dễ dàng đọc các script, giảm sự trùng lặp code, độ tin cậy sẽ cao hơn, khả năng dùng lại được code sẽ cao hơn.
  • Trong page object sẽ khai báo các cách để tìm đến object đó, chúng ta sẽ không đưa các assertion(quản lý test case pass hay fail) vào các page object, việc quản lý test case pass hay fail chúng ta sẽ để nó ở trong logic của test case chứ không đưa vào page object.

b. Cách implement các Page Object

Ví dụ:

public class LogIn_Page { 

        private static WebElement element = null; 

        public static WebElement txtbx_UserName(WebDriver driver){ 

           element = driver.findElement(By.id("log")); 

           return element; 

         } 

        public static WebElement txtbx_Password(WebDriver driver){ 

element = driver.findElement(By.id("pwd")); 

           return element; 

         } 

        public static WebElement btn_LogIn(WebDriver driver){ 

           element = driver.findElement(By.id("login")); 

return element; 

         } 

}

  • Với mỗi page sẽ tạo ra một class, ví dụ ở trên là tạo ra 1 class là  LogIn_Page\
  • Trong class LogIn_Page này sẽ tạo ra các method để trả về các web element như WebElement txtbx_UserName(), WebElement txtbx_Password(), WebElement btn_LogIn();
  • Khi chúng ta cần sử dụng đến, chỉ cần dùng LogIn_Page .(chấm) các method mà không cần tìm cái element đó nữa.

c. PageFactory class

  • PageFactory class là một extention của Page Object Design Pattern, Nó được sử dụng để khởi tạo các element của Page Object hoặc khởi tạo chính Page Object. Các annotation cho các element có thể được tạo và để xuất vì các thuộc tính mô tả có thể không phải lúc nào cũng đủ chi tiết để phân biệt đối tượng này với đối tượng kia.
  • Nó được sử dụng để khởi tạo element của Page Class mà không cần sử dụng ‘FindElement’ or ‘FindElements’. Các annotation có thể được sử dụng để mô tả các đối tượng cải thiện khả năng đọc lại code dễ hiểu hơn. Tuy nhiên, có một số khác biệt giữa C # và Java - Java có tính linh hoạt cao hơn với PageFactory

Để hiểu được cơ chế làm việc của PageFactory, chúng ta sẽ làm một bài thực hành nhỏ

Đề bài: Mở trang http://automationpractice.com/ sau đó đăng nhập tài khoản, sau đó đăng xuất bằng chrome

Ở đây chúng ta sẽ tạo ra một project có tên là BlogPageFactoryTest, project này sẽ có 2 package đó là pages tests
Package pages sẽ chứa các trang page, còn packge tests sẽ chứa các test case

  • Đầu tiên chúng ta sẽ tạo ra file BasePage.java trong pagekage pages, file này có tạo dụng làm trang nền có nhiệm vụ khởi tạo driver và các element thông qua PageFactory

Code của file này: 

package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

public class BasePage {
// Tạo 1 biến driver
protected WebDriver driver; 

 // Hàm khởi tạo để nhận driver truyền vào từ test case, đồng thời sử dụng PageFactory để khởi tạo các element muốn tìm đến
this.driver = driver;
public BasePage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
}

  • File thứ 2 là tạo ra file LoginPage.java trong pagekage pages, file này chứa các biên locator và tìm đến chúng, bên cạnh đó là 1 hàm để thực hiện các hành động ở page login, class này sẽ kế thừa BasePage.java
Code của file này: 

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

//Kế thừa từ BasePage
public class LoginPage extends BasePage {

public LoginPage(WebDriver driver) {
super(driver);
}

//Khai báo các WebElement và Các anotation, truyền vào class name, id hoặc css
//Có 2 cách để khai báo các anotation đó là  @FindBy(id = "SubmitLogin") hoặc  @FindBy(how = How.ID, using = "SubmitLogin")

@FindBy(className = "login")
public WebElement lnk_Signin;

@FindBy(id = "email")
public WebElement txt_Username;

@FindBy(id = "passwd")
public WebElement txt_Password;

@FindBy(how = How.ID, using = "SubmitLogin")
public WebElement btn_Login;

//Thực hiên các hành động trên trang, tham số truyền vào bao gồm username và password từ hàm main
public void actionLogin(String username, String password) {
lnk_Signin.click();
txt_Username.sendKeys(username);
txt_Password.sendKeys(password);
btn_Login.click();

}
}

  • Tiếp theo tạo ta file MyViewPage.java, file này có nhiệm vụ tương tự như file LoginPage,java tuy nhiên dùng để logout
Code của file này: 
package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

//Kế thừa từ BasePage
public class MyViewPage extends BasePage {
public MyViewPage(WebDriver driver) {
super(driver);
}

//Khai báo các WebElement và Các anotation, truyền vào class name, id hoặc css
@FindBy(how = How.CLASS_NAME, using = "logout")
public WebElement lnk_Logout;

// Thực hiện logout
public void actionLogout() {
lnk_Logout.click();
}

}

  • Cuối cùng là package tests sẽ chứa file LoginTest.java, file này sẽ chưa hàm main, khởi tạo browser và các action

Code của file này: 
package tests;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import pages.LoginPage;
import pages.MyViewPage;

public class LoginTest {
public static void main(String[] args) {

//Khởi tạo browser, set đường dẫn đến file driver trên chrome, maximize browser, sau đó mở trang web cần test
System.setProperty("webdriver.chrome.driver",
"D:\\Work\\Automation Test\\Tool\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://automationpractice.com/index.php");
//Khởi tạo 2 đối tượng của LoginPage và MyViewPage, truyền vào driver
                LoginPage lp = new LoginPage(driver);
MyViewPage mp = new MyViewPage(driver);
//Thực hiện hành động Login truyền vào username và password sau đó Logout
lp.actionLogin("hocautotest@gmail.com", "12345678");
mp.actionLogout();
}
}

  • Logic của ví dụ này sẽ như sau: file LoginTest.java chứ màn main, có tác dụng khởi tạo browser mở browser, sau đó tạo 2 hai đối tượng là lp và mp truyền vào driver mới tạo bên trên, tiếp theo lp sẽ gọi đến hàm actionLogin trong LoginPage,java truyền vào username và password, hàm này sẽ  thực hiện các hành động login, sau đó đối tượng mp sẽ gọi đến hàm logout trong MyViewPage.java và thực hiện các hành động Logout.

4. TestNG Framework

a. Giới thiệu chung về TestNG Framework

  • TestNG Framework là một testing automation framework mã nguồn mở được phát triển dựa trên framework JUnit và NUnit, JUnit là dành cho Java còn NUnit là dành cho .Net, NG ở đây nghĩa là Next Generation (Thế hệ tiếp theo), Test NG cũng tương tự như JUnit nhưng nó nhiều chức năng hơn JUnit nhưng nó vẫn được lấy cảm hứng từ JUnit.
  • Test NG Framework sẽ giúp chúng ta quản lý rất nhiều thứ như test case, test suite, các assertion, các cái report, các cái log, các data provider...
  • TestNG Framework được sử dụng rộng rãi nhất cho Selenium 

b. Cài đặt TestNG Framework

Để cài đặt testNG framework, vhúng ta thực hiện theo các bước sau:
  • Mở Eclipse IDE và vào phần Help menu, click “Install New Software”.

Hình 2


Hình 3


  • Bạn back lại cửa sổ trước, bạn sẽ thấu  tùy chọn TestNG đã hiện ra. Click TestNG and nhấn nút “Next”.

Hình 4

  • Click “I accept the terms of the license agreement” sau đó click Finish.
  • Nếu thấy cảnh báo bảo mật thì nhấn OK.
  • Lại Click Next cho đến thông báo cài đặt thành công hiện ra thì khởi động lại Eclipse.
  • Sau khi khởi động lại để xác nhận xem test NG đã được cài thành công chưa bằng cách File - New - Other bạn sẽ thấy có tùy chọn testNG hiện ra như vậy là đã cài đặt thành công.
Hình 5

Nếu không được có thể tham khảo link này để cài đặt testNG: https://www.lambdatest.com/blog/how-to-install-testng-in-eclipse-step-by-step-guide/

c. Anotation trong TestNG

Các loại anotation: 
  • @BeforeMethod: Được sử dụng để khai báo các method được chạy trước khi test method được chạy.
  • @BeforeTest: Được sử dụng để khai báo các method được chạy trước khi test case được chạy, nó sẽ dùng chung các tính năng cho cả test case
  • @BeforeClass: Được sử dụng để khai báo các method được chạy trước khi test class được chạy, nó sẽ dùng chung các tính năng cho cả class, ví dụ như một class có nhiều test case, nếu khai báo khởi tạo driver trong BeforeClass thì cả hai test case này sẽ dùng chung browser mà không khởi tạo browser nhiều lần. Tuy nhiên phải đảm bảo các test case không bị conflict với nhau thì nó sẽ không chạy được.
  • @BeforeSuite: Được sử dụng để khai báo các method được chạy trước khi test suite được chạy, nó sẽ dùng chung các tính năng cho cả test suite
  • @AfterMethod: Được sử dụng để khai báo các method được chạy sau khi test method được chạy.
  • @AfterTest: Được sử dụng để khai báo các method được chạy sau khi test case  được chạy.
  • @AfterClass: Được sử dụng để khai báo các method được chạy sau khi test class được chạy, nó sẽ dùng chung các tính năng cho cả class
  • @AfterSuite: Được sử dụng để khai báo các method được chạy sau khi test suite được chạy.
  • @DataProvider: Được sử dụng khi chúng ta đọc dữ liệu từ Data Provider ví dụ như file excel chẳng hạn.
@Test: Để khai báo một test case

VÍ DỤ

Đề bài: Mở trang web http://automationpractice.com/index.php đăng nhập sau đó đăng xuất sử dụng TestNG Framework

  • Bước 1: Tạo 1 project mới tên là BlogTestNGFirstTest, import toàn bộ thư viện của selenium vào build path, ngoài ra còn phải add thêm file jquery-3.5.1.jar để tránh bị báo lỗi, các bạn có thể download file này TẠI ĐÂYtrong project này sẽ tạo một package là tests
  • Bước 2: Chuột phải vào package tests chọn New - Other - TestNG Class - Next - Điền class name là LoginTest - Tích chọn anotation @BeforeMethod và @AfterMethod - XML Suite file: điền LoginTest.xml - Nhấn Finish


Hình 6: Các thông tin cần điền vào khi tạo mới file TestNG

  • Bước 3: Code theo framework TestNG và đây là nội dung file code và giải thích

File LoginTest.java

package tests;

//Nếu code báo đỏ thì click vào và add testNG Library
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;

public class LoginTest {
WebDriver driver;

// @Test là nơi khai báo test case, chúng ta có thể có nhiều cái @Test khác nhau
@Test
public void loginSuccessfulTest() {
driver.findElement(By.className("login")).click();
driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");
driver.findElement(By.id("passwd")).sendKeys("12345678");
driver.findElement(By.id("SubmitLogin")).click();
driver.findElement(By.className("logout")).click();
}

@Test
public void loginUnSuccessfulTest() {
driver.findElement(By.className("login")).click();
driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");
driver.findElement(By.id("passwd")).sendKeys("12345679");
driver.findElement(By.id("SubmitLogin")).click();
driver.findElement(By.className("logout")).click();
}
// @BeforeMethod thường để setup các môi trường
// Khai báo group cho test hàm, ở đây setUp() method sẽ dùng cho cả group1 và group2
@BeforeMethod (groups = {"group1", "group2"})
public void setUp() {
System.setProperty("webdriver.chrome.driver",
"D:\\Work\\Automation Test\\Tool\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://automationpractice.com/index.php");
}

// @AfterMethod thường đưa vào các hàm teardown để giải phóng môi trường
@AfterMethod
public void afterMethod() {
driver.quit();
}

}

File LoginTest.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite parallel="false" name="Suite">
<test name="Test">
<classes>
<class name="tests.LoginTest" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

  • Bước 4: Chạy file, chúng ta sé có 2 cách chạy, một là chạy thông qua file test case LoginTest.java, cách 2 là chạy qua file test suite LoginTest.xml bằng cách chuột phải chọn run as
  • Bước 5: Sau khi chạy xong, chúng ra refresh sẽ thấy xuất hiện thư mục test-output chúng ta có thể mở file này xem một số thông tin trong đó file index.html sẽ chứa thông tin như hình dưới (tại thời điểm mình làm video web đó đang bị lỗi, không thể load được nên có báo cáo như hình): 


Hình 7: Nội dung file index.html trong trường hợp file chạy bị lỗi



d. Group

Chúng ta sẽ khai báo nhóm các test lại với nhau, và chúng ta cũng có thể khai báo muốn chạy các group nào trong test suite của chúng ta. Để khai báo chúng ta thêm vào sau cái @Test annotations
Cú pháp: (groups = { ” Group Name” })


VÍ DỤ VỀ GROUP 

Đề bài: Mở trang web http://automationpractice.com/index.php đăng nhập sau đó đăng xuất sử dụng TestNG Framework có sử dụng group

  • Bước 1: Tạo 1 project mới tên là BlogTestNGFirstTest, import toàn bộ thư viện của selenium vào build path, ngoài ra còn phải add thêm file jquery-3.5.1.jar để tránh bị báo lỗi, các bạn có thể download file này TẠI ĐÂYtrong project này sẽ tạo một package là tests
  • Bước 2: Chuột phải vào package tests chọn New - Other - TestNG Class - Next - Điền class name là LoginTestGroup - Tích chọn anotation @BeforeMethod và @AfterMethod - XML Suite file: điền LoginTestGroup.xml - Nhấn Finish
  • Bước 3: Code theo framework TestNG và đây là nội dung file code và giải thích

File LoginTestGroup.java

package tests;

//Nếu code báo đỏ thì click vào và add testNG Library
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;

public class LoginTestGroup {
WebDriver driver;

// @Test là nơi khai báo test case, chúng ta có thể có nhiều cái @Test khác nhau
// Khai báo group cho test case
@Test (groups = {"group1"})
public void loginSuccessfulTest() {
driver.findElement(By.className("login")).click();
driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");
driver.findElement(By.id("passwd")).sendKeys("12345678");
driver.findElement(By.id("SubmitLogin")).click();
driver.findElement(By.className("logout")).click();
}

@Test (groups = {"group2"})
public void loginUnSuccessfulTest() {
driver.findElement(By.className("login")).click();
driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");
driver.findElement(By.id("passwd")).sendKeys("12345679");
driver.findElement(By.id("SubmitLogin")).click();
driver.findElement(By.className("logout")).click();
}
// @BeforeMethod thường để setup các môi trường
// Khai báo group cho test hàm, ở đây setUp() method sẽ dùng cho cả group1 và group2
@BeforeMethod (groups = {"group1", "group2"})
public void setUp() {
System.setProperty("webdriver.chrome.driver",
"D:\\Work\\Automation Test\\Tool\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://automationpractice.com/index.php");
}

// @AfterMethod thường đưa vào các hàm teardown để giải phóng môi trường
@AfterMethod (groups = {"group1", "group2"})
public void afterMethod() {
driver.quit();
}

}

File LoginTestGroup.xml, file này sẽ khác file xml của LoginTest.xml ở chỗ phần code thêm node group

<?xml version="1.0" encoding="UTF-8"?>
<suite parallel="false" name="Suite">
<test name="Test">
<groups>
<run>
<include name="group1" />
</run>
</groups>

<classes>
<class name="tests.LoginTestGroup" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->


  • Bước 4: Để chạy file mà nhóm theo group chúng ta chạy qua file test suite LoginTestGroup.xml bằng cách chuột phải chọn run as
  • Bước 5: Tương tự ví dụ của LoginTest.java

e. OnDepend

  • Chúng ta sử dụng OnDepend để khai báo cái test này chạy sau khi cái test kia chạy thành công. Để khai báo chúng ta thêm vào sau cái @Test annotations
  • dependsOnMethods cái test method này chạy sau khi cái test method kia chạy thành công, nếu fail thì sẽ skip không chạy nữa.
  • dependsOnGroups cái test group này chạy sau khi cái test group kia chạy thành công, ếu fail thì sẽ skip không chạy nữa.

f. Reporter

  • Là hình thức ghi log trong TestNG, có hai loại level đó là low level log và high level log, low level log hay được sử dụng trong debug, còn high level log được sử dụng để ghi ra các log trong quá trình chạy test của chúng ra.
  • Cú pháp: Reporter.log("Nội dung"); 

g. Asserts

  • Selenium webdriver nó không có cơ chế asserts vì nó không quản lý test case, test suite, tuy nhiên TestNG nó quản lý test case, test suite nên có cơ chế để đánh giá test case là test hay fail.
  • Thông thường chúng ta sẽ có 3 cách đánh giá là: Assert.assertEquals()Assert.assertNotEquals() để kiểm tra giá trị chúng ta cần kiểm tra có giống như mong muốn hay không, cái thứ 2 là Assert.assertTrue() để kiểm tra điều kiện logic của ta có phải là true hay không, cái thứ 3 là Assert.fail() để đánh test case của ta là fail


VÍ DỤ VỀ GROUP , REPORTER, ASSERTS

Đề bài: Mở trang web http://automationpractice.com/index.php đăng nhập sau đó đăng xuất sử dụng TestNG Framework có sử dụng OnDepend, Reporter, Asserts
  • Bước 1: Tạo 1 project mới tên là BlogTestNGFirstTest, import toàn bộ thư viện của selenium vào build path, ngoài ra còn phải add thêm file jquery-3.5.1.jar để tránh bị báo lỗi, các bạn có thể download file này TẠI ĐÂYtrong project này sẽ tạo một package là tests
  • Bước 2: Chuột phải vào package tests chọn New - Other - TestNG Class - Next - Điền class name là LoginTestDepend- Tích chọn anotation @BeforeMethod và @AfterMethod - XML Suite file: điền LoginTestDepend.xml - Nhấn Finish
  • Bước 3: Code theo framework TestNG và đây là nội dung file code và giải thích, Trong ví dụ này method  loginSuccessfulTest() sẽ  depend on  method loginUnSuccessfulTest(), method  loginSuccessfulTest() sẽ chạy nếu method loginUnSuccessfulTest() chạy thành công.

File LoginTestDepend.java

package tests;


import org.testng.annotations.Test;

import org.testng.annotations.BeforeMethod;

//Nếu code báo đỏ thì click vào và add testNG Library


import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.testng.Assert;

import org.testng.Reporter;

import org.testng.annotations.AfterMethod;


public class LoginTestDepend {

WebDriver driver;


// @Test là nơi khai báo test case, chúng ta có thể có nhiều cái @Test khác nhau

@Test(dependsOnMethods = { "loginUnSuccessfulTest" })

public void loginSuccessfulTest() {

driver.findElement(By.className("login")).click();

driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");

driver.findElement(By.id("passwd")).sendKeys("12345678");

driver.findElement(By.id("SubmitLogin")).click();

try {

driver.findElement(By.className("logout")).click();


} catch (Exception e) {

Assert.fail("Login UnSucessful");

}


}


@Test

public void loginUnSuccessfulTest() {

driver.findElement(By.className("login")).click();

driver.findElement(By.id("email")).sendKeys("hocautotest@gmail.com");

driver.findElement(By.id("passwd")).sendKeys("12345679");

driver.findElement(By.id("SubmitLogin")).click();


try {

driver.findElement(By.className("logout")).click();

Assert.fail("Login Successful but expected result is UnSuccessful");

} catch (Exception e) {

Reporter.log("loginUnSuccessfulTest: PASS");

}


}


// @BeforeMethod thường để setup các môi trường

@BeforeMethod

public void setUp() {

System.setProperty("webdriver.chrome.driver",

"D:\\Work\\Automation Test\\Tool\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");

driver = new ChromeDriver();

driver.manage().window().maximize();

driver.get("http://automationpractice.com/index.php");

}


// @AfterMethod thường đưa vào các hàm teardown để giải phóng môi trường

@AfterMethod

public void afterMethod() {

driver.quit();

}


}

 File LoginTestDepend.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite parallel="false" name="Suite">
<test name="Test">
<classes>
<class name="tests.LoginTestDepend" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

h. Parameters

  • Chúng ta khai báo Parameters trong test suite và truyền giá trị cho cái parameters đó trong test suite, trong test sẽ sử dụng các parameters được khai báo đó trong các cái test của chúng ta.
Ví dụ 1: Trong đoan code chúng ta có sử dụng 2 cái parameters là sUsername và sPassword, chúng ta sẽ truyền cái parameter đó thông qua cái @Parameters vào trong cái test của chúng ta và trong test method phải khai báo String sUsername, String sPassword, chúng ta khai báo bao cái parameter ở trong cái @Parameters thì chúng ta phải khai báo bấy nhiêu biến ở trong class method. Trong test method sẽ dùng các parameter truyền vào ở đây.

package automationFramework; 
import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.Test; 
import org.testng.annotations.Parameters;
 
public class TestngParameters { 
private static WebDriver driver;
 
   @Test  
@Parameters({ "sUsername", "sPassword" }) 
public void test(String sUsername, String sPassword) { 
driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
driver.get("http://www.store.demoqa.com"); 
driver.findElement(By.xpath(".//*[@id='account']/a")).click(); 
driver.findElement(By.id("log")).sendKeys(sUsername); 
driver.findElement(By.id("pwd")).sendKeys(sPassword); 
driver.findElement(By.id("login")).click(); 
driver.findElement(By.xpath(".//*[@id='account_logout']/a")).click(); 
driver.quit(); 
}
 
}

Trong test suite.xml phải khai báo ra các parameter và các giá trị tương ứng, nếu chúng ta khai báo parameter thì bắt buộc chúng ta phải chạy qua test suite, nếu không chạy qua test suite mà chạy trực tiếp qua test case thì nó sẽ báo lỗi.

<suite name="Suite"> 

<test name="ToolsQA"> 

<parameter name="sUsername" value="testuser_1"/> 

<parameter name="sPassword" value="Test@123"/> 

<classes> 

<class name="automationFramework.TestngParameters" /> 

</classes> 

 </test> 

</suite>

Ưu điểm của việc truyền parameter từ file xml  là chúng ta sửa giá chị rất là dễ, không cần build lại cả project.

Ví dụ 2: 

Đề bài: Mở trang web http://automationpractice.com/index.php đăng nhập sau đó đăng xuất sử dụng TestNG Framework có sử dụng parameter

  • Bước 1: Tạo 1 project mới tên là BlogTestNGFirstTest, import toàn bộ thư viện của selenium vào build path, ngoài ra còn phải add thêm file jquery-3.5.1.jar để tránh bị báo lỗi, các bạn có thể download file này TẠI ĐÂYtrong project này sẽ tạo một package là tests
  • Bước 2: Chuột phải vào package tests chọn New - Other - TestNG Class - Next - Điền class name là LoginTestParameter- Tích chọn anotation @BeforeMethod và @AfterMethod - XML Suite file: điền LoginTestParameter.xml - Nhấn Finish
  • Bước 3: Code theo framework TestNG và đây là nội dung file code và giải thích

File LoginTestParameter.java

package tests;


//Nếu code báo đỏ thì click vào và add testNG Library

import org.testng.annotations.Test;

import org.testng.annotations.BeforeMethod;

import org.testng.annotations.Parameters;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.testng.annotations.AfterMethod;


public class LoginTestParameter {

WebDriver driver;


// @Test là nơi khai báo test case, chúng ta có thể có nhiều cái @Test khác nhau

// Khai báo group cho test case

@Test

@Parameters({"username", "password"})

public void loginSuccessfulTest(String username, String password) {

driver.findElement(By.className("login")).click();

driver.findElement(By.id("email")).sendKeys(username);

driver.findElement(By.id("passwd")).sendKeys(password);

driver.findElement(By.id("SubmitLogin")).click();

driver.findElement(By.className("logout")).click();

}

// @BeforeMethod thường để setup các môi trường

// Khai báo group cho test hàm, ở đây setUp() method sẽ dùng cho cả group1 và group2

@BeforeMethod (groups = {"group1", "group2"})

public void setUp() {

System.setProperty("webdriver.chrome.driver",

"D:\\Work\\Automation Test\\Tool\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");

driver = new ChromeDriver();

driver.manage().window().maximize();

driver.get("http://automationpractice.com/index.php");

}


// @AfterMethod thường đưa vào các hàm teardown để giải phóng môi trường

@AfterMethod

public void afterMethod() {

driver.quit();

}


}

File LoginTestParameter.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite parallel="false" name="Suite">
<test name="Test">
<parameter name="username" value="hocautotest@gmail.com" />
<parameter name="password" value="12345678" />

<classes>
<class name="tests.LoginTestParameter" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

  • Nếu như chúng ta có nhiều test class mà muốn chạy tất cả các test class thì chúng ta phải tạo ra một test suite chung cho cả project, chuột phải tên project chọn testNG và convert to testNG, khi convert sang testNG nó sẽ tạo ra file testNG.xml trong group folder của project, trong này nó add vào tất cả các testNG class trong project đó.




Giới thiệu về HIENDV94

Mình là Hiển. Đây là blog ghi chép lại những thứ mình trải qua và học được hàng ngày, mình luôn luôn muốn học hỏi để trau dồi kinh nghiệm, hoàn thiện bản thân. Rất mong được làm quen mọi người. Hãy kết bạn với mình qua Facebook các bạn nhé.

0 Bình luận:

Đăng nhận xét