NỘI DUNG BÀI HỌC



✳️ Cách run test bằng package, class, method trong file testng.xml

Ví dụ project demo của chúng ta gồm có 3 package như mẫu:

Trong mỗi Class, ta chỉ cần add 2 Method.

@Test
public void firstTest() {
    System.out.println("First test method");
}

@Test
public void secondTest() {
    System.out.println("Second test method");
}
 

🔆 Cách tạo file testng.xml


Lưu ý:

  • File này tên là gì cũng được, không nhất thiết phải là testng.xml, miễn là nó có đuôi .xml là được. Tuy nhiên, nên tránh lấy trùng tên với file config của thằng khác ví dụ như file pom.xml của Maven.
  • File này nằm ở đâu trong Project cũng được, không nhất thiết phải nằm ở ngay dưới folder Project, nhưng tốt nhất là ko nên để nó trong package code nào, nên tách riêng ra.


Nội dung của file .xml:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByClass" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="com.anhtester.firstpackage.FirstClass"/>
        </classes>
    </test>
</suite>

 
  • Dòng đầu tiên khai báo !DOCTYPE có thể có hoặc không, nhưng nếu bạn ko có thì khi run TestNG sẽ thông báo “It is strongly recommended to add “<!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd” >” at the top of your file, otherwise TestNG may fail or not work as expected.
  • TestNG bắt buộc phải có khai báo thẻ <suite> và <test>, nếu bạn bỏ 1 trong 2 cái khai báo đó thì TestNG sẽ báo lỗi.  Lưu ý: <test> ở đây không phải là 1 test case, test case là cái khai báo trong class java.
  • Thẻ <suite> và <test> có attribute name, có thể đặt tên tùy ý, không được đặt trùng tên cho các thẻ.
  • Một file TestNG chỉ có 1 thẻ <suite> duy nhất và <suite> có thể có nhiều thẻ <test>.
  • Trong thẻ <test> có thể có 0 hoặc nhiều đối tượng test: <packages>, <classes>, <methods>.


🔆 Cách run test theo Class

Nghĩa là nó sẽ chạy tất cả các @Test nằm trong class chỉ định.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByClass" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="com.anhtester.firstpackage.FirstClass"/>
            <class name="com.anhtester.firstpackage.SecondClass"/>
        </classes>
    </test>
</suite>
  • Đối tượng phía trong của <test><classes>
  • Trong <classes> sẽ điền list các class mà ta muốn run test. Name là [packageName].[className]. Ví dụ: firstpackage.FirstClass



Khi run xong, kết quả sẽ hiển thị như sau:


🔆 Cách run test theo package

Nghĩa là nó sẽ chạy tất cả các @Test nằm trong package chỉ định.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByPackage" verbose="1">
    <test name="FirstTest">
        <packages>
            <package name="com.anhtester.firstpackage"/>
            <package name="com.anhtester.secondpackage"/>
            <package name="com.anhtester.thirdpackage"/>
        </packages>
    </test>
</suite>
  • Đối tượng phía trong của <test><packages>
  • Trong <packages> sẽ điền list các package mà ta muốn run test. Name là [packageName] Ví dụ: firstpackage


LƯU Ý:
chỉ được chọn package sau cùng chứa Class chứ không được gọi package còn chứa package con bên trong.


Khi run xong, kết quả sẽ hiển thị như sau:



Mỗi package có 2 class, mà mỗi class có 2 method test cases, nên 1 package sẽ có 4 test cases. Thì 3 package có 12 test cases.


🔆 Cách run test theo Method

Nghĩa là nó chỉ chạy những @Test nằm trong class và được chỉ định cụ thể từng method.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByMethod" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="com.anhtester.firstpackage.FirstClass">
                <methods>
                    <include name="firstTest"/>
                </methods>
            </class>
            <class name="com.anhtester.firstpackage.SecondClass">
                <methods>
                    <include name="firstTest"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>
  • Để run được riêng <method> thì phải có <class>
  • Method muốn được run thì phải sử dụng <include>


Kết quả:



🔆 Cách run test hỗn hợp package, class và method

Nghĩa là nó sẽ chạy tất cả các @Test nằm trong package hoặc class hoặc method cụ thể chỉ định.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByCommon" verbose="1">
    <test name="FirstTest">
        <packages>
            <package name="com.anhtester.firstpackage"/>
        </packages>
        <classes>
            <class name="com.anhtester.secondpackage.FirstClass">
                <methods>
                    <include name="firstTest"/>
                </methods>
            </class>
            <class name="com.anhtester.thirdpackage.SecondClass"/>
        </classes>
    </test>
</suite>
  • <packages> và <classes> được khai báo cùng cấp, ngang hàng với nhau. <class> không phải khai báo dưới <packge>. Tuy nhiên khai báo <method> thì phải nằm dưới <class>


Đây là kết quả:



🔆 Cách run nhiều module <test> trong suite

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite Run By Module Test" verbose="1">
    <test name="First Test">
        <packages>
            <package name="com.anhtester.firstpackage"/>
        </packages>
    </test>
    <test name="Second Test">
        <classes>
            <class name="com.anhtester.secondpackage.FirstClass"/>
            <class name="com.anhtester.thirdpackage.FirstClass"/>
        </classes>
    </test>
    <test name="Third Test">
        <classes>
            <class name="com.anhtester.secondpackage.SecondClass"/>
            <class name="com.anhtester.thirdpackage.SecondClass"/>
        </classes>
    </test>
</suite>


Kết quả:


Bạn sẽ thấy là TestNG không run theo thứ tự test mà bạn đã config trong TestNG từ firstpackage –> secondpackage –> thirdpackage. Lý do là vì với TestNG thì những thằng nằm dưới <test> là ngang hàng, lúc đó nó chỉ quan tâm đến tên của Class đến tên của phương thức test theo thứ tự bảng chữ cái (Aphabetically).

Và các methods trong 1 Class cũng được run theo thứ tự bảng chữ cái. Đó là lý do vì sao nhiều bạn khi mới học cảm thấy khó chịu vì nó không run theo thứ tự từ trên xuống dưới. Để config run theo thứ tự mong muốn thì mình dùng thuộc tính priority trong @Test.


🔆 Cách sử dụng chức năng Include và Exclude

Include: được dùng trong các trường hợp sau đây:

  • Trong 1 package có nhiều package, nhưng chỉ muốn run số ít package trong đó.
  • Trong 1 Class có nhiều method, chỉ muốn run số ít method (xem lại mục IV ở trên).

Exclude: được dùng trong các trường hợp sau đây:

  • Trong 1 package có nhiều package, nhưng muốn không run một vài package trong đó.
  • Trong 1 Class có nhiều method, nhưng muốn không run một vài method.


Ví dụ:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunByExcludeMethod" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="com.anhtester.firstpackage.FirstClass">
                <methods>
                    <include name="firstTest"/>
                </methods>
            </class>
            <class name="com.anhtester.secondpackage.SecondClass">
                <methods>
                    <exclude name="firstTest"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>


Đây là kết quả:



NOTE
: trong một project có thể có nhiều file config XML.

 

🔆 Triển khai vào code Test Automation API Rest Assured

Tạo 2 class test cases như mẫu:

DemoRunTestXML_01.java

import com.anhtester.globals.ConfigsGlobal;
import com.anhtester.globals.TokenGlobal;
import com.anhtester.helpers.JsonHelper;
import com.anhtester.model.LoginPOJO;
import com.anhtester.model.data.LoginPOJO_Builder;
import com.google.gson.Gson;
import io.restassured.http.ContentType;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import net.datafaker.Faker;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.File;
import java.util.Locale;

import static io.restassured.RestAssured.given;

public class DemoRunTestXML_01 {
    @Test(priority = 0)
    public void loginUser() {
        LoginPOJO loginPOJO = LoginPOJO_Builder.getDataLogin();

        Gson gson = new Gson();

        RequestSpecification request = given();
        request.baseUri(ConfigsGlobal.URI)
                .accept("application/json")
                .contentType("application/json")
                .body(gson.toJson(loginPOJO));

        Response response = request.when().post("/login");
        response.then().statusCode(200);

        TokenGlobal.TOKEN = response.getBody().path("token");
        System.out.println("Token Global: " + TokenGlobal.TOKEN);
    }

    public static int CATEGORY_ID;
    public static String CATEGORY_NAME;

    @Test(priority = 1)
    public void testAddNewCategory() {
        System.out.println("Create Category");
        String dataFile = "src/test/resources/testdata/CreateCategory.json";

        Faker faker = new Faker(new Locale("vi"));
        CATEGORY_NAME = faker.job().title();
        System.out.println("CATEGORY_NAME: " + CATEGORY_NAME);

        JsonHelper.updateValueJsonFile(dataFile, "name", CATEGORY_NAME);

        RequestSpecification request = given();
        request.baseUri("https://api.anhtester.com/api")
                .accept(ContentType.JSON)
                .contentType(ContentType.JSON)
                .header("Authorization", "Bearer " + TokenGlobal.TOKEN)
                .body(new File(dataFile));

        Response response = request.post("/category");

        response.prettyPrint();
        response.then().statusCode(200);

        CATEGORY_ID = Integer.parseInt(response.path("response.id").toString());
        System.out.println("CATEGORY_ID: " + CATEGORY_ID);
    }

    @Test(priority = 2)
    public void testGetCategoryById() {
        System.out.println("Get Category By Id");

        RequestSpecification request = given();
        request.baseUri("https://api.anhtester.com/api")
                .accept(ContentType.JSON)
                .contentType(ContentType.JSON)
                .header("Authorization", "Bearer " + TokenGlobal.TOKEN);

        System.out.println("CATEGORY_ID: " + CATEGORY_ID);
        Response response = request.get("/category/" + CATEGORY_ID);

        response.prettyPrint();
        response.then().statusCode(200);

        JsonPath jsonPath = response.jsonPath();
        Assert.assertEquals(jsonPath.get("response.name"), CATEGORY_NAME, "Category name not match.");
    }
}


DemoRunTestXML_02.java

import com.anhtester.globals.ConfigsGlobal;
import com.anhtester.globals.TokenGlobal;
import com.anhtester.model.BookPOJO;
import com.google.gson.Gson;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import net.datafaker.Faker;
import org.joda.time.LocalDateTime;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;

import static io.restassured.RestAssured.given;

public class DemoRunTestXML_02 {

    @Test
    public void testAddNewBook() {

        Faker faker = new Faker(new Locale("vi"));
        String BOOK_NAME = faker.book().title() + "_" + LocalDateTime.now();

        BookPOJO bookPOJO = new BookPOJO();

        bookPOJO.setName(BOOK_NAME);
        bookPOJO.setCategory_id(DemoRunTestXML_01.CATEGORY_ID);
        bookPOJO.setPrice(120000);
        bookPOJO.setRelease_date("2024-01-27");
        bookPOJO.setStatus(true);

        bookPOJO.setImage_ids(new ArrayList<>(Arrays.asList(2, 18, 19)));

        Gson gson = new Gson();

        RequestSpecification request = given();
        request.baseUri(ConfigsGlobal.URI)
                .accept(ContentType.JSON)
                .contentType(ContentType.JSON)
                .header("Authorization", "Bearer " + TokenGlobal.TOKEN)
                .body(gson.toJson(bookPOJO));

        Response response = request.post("book");
        response.prettyPrint();

        response.then().statusCode(200);

    }
}


Tạo file XML để gọi 2 class test cases:

SuiteRunTest.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteRunTest" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="com.anhtester.Bai14_Annotation.DemoRunTestXML_01"/>
            <class name="com.anhtester.Bai14_Annotation.DemoRunTestXML_02"/>
        </classes>
    </test>
</suite>


Kết quả:

 

✅ Annotation trong TestNG Framework

Annotation là tính năng giúp thêm thông tin vào một đối tượng. Nó có thể được dùng cho class, method, variable, và parameters. TestNG cung cấp rất nhiều loại annotation cho các mục đích khác nhau, trong đó có các annotation phục vụ cho mục đích: xử lý trước và sau method Test. Vì sao cần xử lý trước và sau Test:

  • Cần tạo môi trường trước khi thực hiện test.
  • Cần xóa hết các trạng thái sau khi thực hiện test hoặc cần phải thực hiện các hành động không liên quan đến method Test nhưng cần thiết như screenshot, delete session hoặc close connection…


TestNG cung cấp 10 Annotation ở dạng Before và After và 1 Annotation dạng Test

  • @BeforeSuite/@AfterSuite
  • @BeforeTest/@AfterTest
  • @BeforeGroups/@AfterGroups
  • @BeforeClass/@AfterClass
  • @BeforeMethod/@AfterMethod
  • @Test


🔆 Các loại Annotation trong TestNG

@Test: Đại diện cho một test case.
@BeforeSuite: Chú thích sẽ được chạy trước khi tất cả các kiểm tra trong bộ kiểm thử đã chạy.
@AfterSuite: Chú thích sẽ được chạy sau khi tất cả các kiểm tra trong bộ kiểm thử đã chạy.
@BeforeTest: Chú thích sẽ được chạy trước khi bất kỳ một @Test nào thuộc trong cùng một class được gọi để chạy.
@AfterTest: Chú thích sẽ được chạy sau khi tất cả các @Test thuộc cùng class đã chạy xong.
@BeforeGroups: Chạy trước các group trong các @Test.
Phương pháp này được đảm bảo chạy ngay trước @Test đầu tiên thuộc bất kỳ nhóm nào được gọi ra.
@AfterGroups: Danh sách các nhóm mà phương pháp cấu hình này sẽ chạy sau.
Phương pháp này được đảm bảo chạy ngay sau khi phương pháp kiểm tra cuối cùng thuộc về bất kỳ nhóm nào được gọi ra.
@BeforeClass: Chú thích sẽ được chạy trước khi @Test đầu tiên trong lớp hiện tại được gọi. (sau @BeforeTest)
@AfterClass: Chú thích sẽ được chạy sau khi tất cả các @Test trong lớp hiện tại đã được chạy hết. (đóng trước @AfterTest)
@BeforeMethod: Chú thích sẽ được chạy trước mỗi @Test. (dùng nhiều)
@AfterMethod: Chú thích sẽ được chạy sau mỗi @Test. (dùng nhiều)


🔆 Lợi ích của việc sử dụng chú thích

  1. Nó xác định các phương pháp nó quan tâm bằng cách tìm kiếm các chú thích. Do đó tên phương thức không bị hạn chế trong bất kỳ mẫu hoặc định dạng nào. (cùng một ghi chú có thể sử dụng cho nhiều hàm tên khác nhau)
  2. Chúng ta có thể truyền các thông số bổ sung vào trong các chú thích.
  3. Chú thích được đánh làm mốc mạnh mẽ rõ ràng, do đó trình biên dịch sẽ đánh dấu lỗi sai ngay lập tức nếu có.
  4. Các lớp kiểm tra thuận tiện trong quá trình sắp xếp chạy các test cases (trước, sau, logic)


✅ Khai báo Annotation trên một Class

Thứ tự chạy của chúng sẽ được thể hiện qua ví dụ sau:

public class DemoAnnotation {
     
    @BeforeSuite
    public void beforeSuite() {
        System.out.println("Before Suite");
    }

    @AfterSuite
    public void afterSuite() {
        System.out.println("After Suite");
    }

    @BeforeTest
    public void beforeTest() {
        System.out.println("Before Test");
    }

    @AfterTest
    public void afterTest() {
        System.out.println("After Test");
    }

    @BeforeClass
    public void beforeClass() {
        System.out.println("Before Class");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("After Class");
    }

    @BeforeGroups(groups = { "testOne" })
    public void beforeGroupOne() {
        System.out.println("Before Group testOne");
    }

    @AfterGroups(groups = { "testOne" })
    public void afterGroupOne() {
        System.out.println("After Group testOne");
    }

    @BeforeGroups(groups = { "testTwo" })
    public void beforeGroupTwo() {
        System.out.println("Before Group testTwo");
    }

    @AfterGroups(groups = { "testTwo" })
    public void afterGroupTwo() {
        System.out.println("After Group testTwo");
    }

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("Before Method");
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("After Method");
    }

    @Test(groups = { "testOne" })
    public void testOneMethod() {
        System.out.println("Test method 1");
    }

    @Test(groups = { "testTwo" })
    public void testTwoMethod() {
        System.out.println("Test method 2");
    }

}​

Và ta cần thêm một config cho file testng.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite" verbose="1">
    <test name="First Test">
        <classes>
            <class name="com.anhtester.Bai10_Annotations.DemoAnnotation"></class>
        </classes>
    </test>
</suite>


Và đây là kết quả:

[Selenium Java] Bài 10: Cách sử dụng chú thích (Annotation) trong TestNG Framework | Anh Tester

[Selenium Java] Bài 10: Cách sử dụng chú thích (Annotation) trong TestNG Framework | Anh Tester

Các Groups sẽ có hiệu lực khi chạy nó tại XML file và có gọi tag <groups>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite" verbose="1">
    <groups>
        <run>
            <include name="testOne"/>
            <!-- include thêm các group khác -->
        </run>
    </groups>
    <test name="Test">
        <classes>
            <class name="com.anhtester.Bai10_Annotations.DemoAnnotation"></class>
        </classes>
    </test>
</suite>



[Selenium Java] Bài 10: Cách sử dụng chú thích (Annotation) trong TestNG Framework | Anh Tester

Từ đây, ta có thể hiểu được thứ tự chạy chúng:

  • Khi bắt đầu thì mở từ Suite > Test > Group > Class > Method
  • Khi kết thúc thì đóng từ Method > Class > Group > Test > Suite


✅ Khai báo Annotation khi có kế thừa (Extends)

Ở phía trên, chúng ta đã xem về cách sử dụng annation trên 1 class, chúng ta sẽ băn khoăn là thế nhưng chúng ta viết theo dạng POM thì có cả BaseTest, không biết thứ tự run annotation sẽ như thế nào?

Hãy xem ví dụ dưới đây:

Ta có class BaseTest:

public class BaseTest {
     
    @BeforeClass
    public void beforeBaseClass() {
        System.out.println("Parent Before Class method");
    }

    @AfterClass
    public void afterBaseClass() {
        System.out.println("Parent After Class method");
    }

    @BeforeMethod
    public void beforeBaseMethod() {
        System.out.println("Parent Before method");
    }

    @AfterMethod
    public void afterBaseMethod() {
        System.out.println("Parent After method");
    }

}​

Class Test cases:

package com.anhtester.Bai10_Annotations;

import com.anhtester.common.BaseTest;
import org.testng.annotations.*;

public class DemoAnnotation extends BaseTest {

    @BeforeSuite
    public void beforeSuite() {
        System.out.println("Before Suite");
    }

    @AfterSuite
    public void afterSuite() {
        System.out.println("After Suite");
    }

    @BeforeTest
    public void beforeTest() {
        System.out.println("Before Test");
    }

    @AfterTest
    public void afterTest() {
        System.out.println("After Test");
    }

    @BeforeClass
    public void beforeClass() {
        System.out.println("Before Class");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("After Class");
    }

    @BeforeGroups(groups = {"testOne"})
    public void beforeGroupOne() {
        System.out.println("Before Group testOne 1");
    }

    @AfterGroups(groups = {"testOne"})
    public void afterGroupOne() {
        System.out.println("After Group testOne 1");
    }

    @BeforeGroups(groups = {"testTwo"})
    public void beforeGroupTwo() {
        System.out.println("Before Group testTwo 2");
    }

    @AfterGroups(groups = {"testTwo"})
    public void afterGroupTwo() {
        System.out.println("After Group testTwo 2");
    }

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("Before Method");
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("After Method");
    }

    @Test(groups = {"testOne"}, priority = 1, description = "Đây là test case thứ 1")
    public void testOneMethod() {
        System.out.println("Test method 1");
    }

    @Test(groups = {"testTwo"}, priority = 2)
    public void testTwoMethod() {
        System.out.println("Test method 2");
    }
}

Và file testng.xml như lúc nảy đã chạy:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite" verbose="1">
    <test name="First Test">
        <classes>
            <class name="com.anhtester.Bai10_Annotations.DemoAnnotation"></class>
        </classes>
    </test>
</suite>


Đây là kết quả:

[Selenium Java] Bài 10: Cách sử dụng chú thích (Annotation) trong TestNG Framework | Anh Tester

Thứ tự chạy khi có kế thừa (extends) sẽ là:

  • Khi bắt đầu: Parent Before > Child Before
  • Khi kết thúc: Child After > Parent After
Trong một project, không nhất thiết phải sử dụng hết tất cả các annotation này, nhưng ta cần phải biết thứ tự để từ đó điều khiển code của mình chạy theo thứ tự mình mong muốn, ví dụ như chụp screentshot hay screen video record ở cuối mỗi test, khởi tạo connection để đọc file Excel


✅ Annotation @Test

Đây là annotation đánh dấu method hoặc Class là 1 phần của TestNG Test. Nếu nó được đánh dấu cho Class thì tất cả các Method mà Public thì sẽ được run, các Method không phải public sẽ không được run.

Ví dụ:

[Selenium Java] Lesson 10: Cách sử dụng chú thích (Annotation) trong TestNG | Anh Tester

✅ Các Attribute của Annotation @Test

  • alwaysRun: có giá trị mặc định là false, nó sẽ bị ignore nếu nó không có dependency method (phụ thuộc) . Nếu đặt là true thì Method sẽ được run kể cả khi các dependency method fail.
    VD: @Test(alwaysRun=true)
  • enabled: giá trị mặc định là true. Dùng để đánh dấu method run hoặc không run. Nếu false, method đó sẽ được bỏ qua, không run. Nếu true, method đó sẽ được run.
    VD: @Test(enabled=true)

[Selenium Java] Lesson 10: Cách sử dụng chú thích (Annotation) trong TestNG | Anh Tester
  • description: dùng để thêm thông tin cho test. Attribute này khá hiệu quả khi chúng ta muốn thêm mô tả các test case khi mà method Name không thể diễn tả được hết.
    VD: @Test(description=”Print the second test method”)

[Selenium Java] Lesson 10: Cách sử dụng chú thích (Annotation) trong TestNG | Anh Tester
  • expectedExceptions: dùng để xác định exception mà Method có thể gặp phải.
    VD:  @Test(expectedExceptions={IOException.class})
    [Selenium Java] Lesson 10: Cách sử dụng chú thích (Annotation) trong TestNG | Anh Tester
  • timeOut: xác định thời gian tối đa mà test có thể run, nếu thời gian run lớn hơn thời gian đã định sẵn thì kết quả test là fail. Đơn vị là mili giây.
    VD: @Test(timeOut=500)

[Selenium Java] Lesson 10: Cách sử dụng chú thích (Annotation) trong TestNG | Anh Tester
  • dataProvider: điền data vào cho test method, phục vụ cho data-driven testing (sẽ viết ở bài khác)
  • dataProviderClass: điền tên class mà TestNG sẽ tìm kiếm data-provider method được nhắc đến ở attribute dataProvider. Mặc định thì nó sẽ tìm ở chính class đó hoặc class base. 
  • dependsOnGroups: điền list các group mà test phụ thuộc.
  • dependsOnMethods: điền list các method mà test phụ thuộc. (sẽ viết ở bài khác)
  • groups: điền tên group, những test mà có chung tên group sẽ tạo thành 1 tập hợp. Tập hợp này có thể được run từ file testng.xml

NOTE:

  • Trong 1 @Test có thể áp dụng nhiều annotation cùng với nhau.
Ví dụ:
@Test(enabled=true, description="Anh Tester - Automation Testing")
public void TestMethod() {
    System.out.println("Anh Tester");
}​

✅ Độ ưu tiên để chạy Test trong TestNG

package TestNG;
import org.testng.annotations.*;
public class SettingPriority {
 
@Test(priority=1)
public void method1() {
     System.out.println("Run method 1");
 }
 
@Test(priority=0)  //độ ưu tiên đầu tiên -> chạy method2() đầu tiên
public void method2() {
     System.out.println("Run method 2");
 }
 
@Test(priority=2)
public void method3() {
     System.out.println("Run method 3");
 }
}

Đoạn mã set độ ưu tiên sẽ được đặt trong annotation @Test , với cú pháp @Test(priority={expected_order}) (expected_order : 0 .... N , số càng nhỏ thì độ ưu tiên càng lớn). Trong ví dụ trên thì trình tự thực hiện sẽ là :

  • Method2
  • Method1
  • Method3

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học