NỘI DUNG BÀI HỌC

Cài đặt và sử dụng TestNG cho Eclipse IDE và IntelliJ IDEA và chạy code theo cấu trúc TestNG Framework.

1. Tổng quan về TestNG

TestNG là 1 công cụ kiểm thử tự động được viết bằng Java, có chức năng quản lý việc tạo test case, thứ tự chạy test case và report sau khi test.

TestNG được xây dựng từ cảm hứng của 2 Framework là JUnit (Java) và NUnit (C#). NG là viết tắt của từ Next Generation.

Xem mindmap để có cái nhìn tổng quan hơn về testNG

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

 

Các tính năng nổi bật của TestNG

  • Mô tả các thiết lập khác nhau khi kiểm thử phần mềm bằng file XML
  • Phân nhóm kiểm thử
  • Tạo mối quan hệ ràng buộc lẫn nhau giữa các module
  • Xác lập thời điểm cho các xử lý trước và sau
  • Cung cấp các chỉ dẫn Annotation – based để nhận diện phương thức test
  • TestNG không yêu cầu có phương thức main()
  • Các phương thức không cần tĩnh (static)

Một số ưu điểm của TestNG

  • Nó cho phép tạo ra các bản báo cáo HTML của tiến trình thực thi.
  • Các chú thích giúp việc kiểm thử dễ dàng hơn.
  • Các trường hợp kiểm thử có thể được nhóm lại và được ưu tiên dễ dàng hơn.
  • TestNG có các annotation logic hơn và dễ hiểu hơn.
  • Có thể kiểm thử song song, tạo ra các log bug, tạo data Parameterized action.
  • TestNG cho phép bạn xác định các test case phụ thuộc.

Các bước viết một test case sử dụng TestNG

  • Viết các test case theo logic của phần cần kiểm thử 
  • Chèn các các chú thích của TestNG
  • Thêm các thông tin bài test của bạn trong file testng.xml
  • Chạy testNG


2. Cài đặt và sử dụng TestNG trên IntelliJ IDEA với Maven project

✅ Cài đặt TestNG Framework

Các bạn chỉ cần add thư viện TestNG vào và build lại Maven.

Tải TestNG trên MVN repository: https://mvnrepository.com/artifact/org.testng/testng

Ở đây chúng ta sẽ dùng bản 7.4.0 cho nó ổn định và thích ứng với các thư viện khác nhé.

<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.4.0</version>
</dependency>

Các bạn chú ý là bỏ cái dòng <scope>test</scope> ra nhé. Nghĩa là mình sẽ cho framework áp dụng trên toàn project chứ không chỉ riêng vùng package test. Nôm na là nó sẽ áp dụng cho cả 2 package maintest

Chổ này chúng ta nên tách project cũ ra vì TestNG sẽ theo một cú pháp và cấu trúc chạy test cases mới nên nếu dùng chung sẽ bị ảnh hưởng nội dung bài cũ.

Vậy giờ mình sẽ tạo project mới nhé. An đặt tên là SeleniumTestNG



Tiếp theo là thêm TestNG Framework vào pom.xml và nhớ nhấn reload lại maven project

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>anhtester.com</groupId>
    <artifactId>SeleniumTestNG</artifactId>
    <version>1.0.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.4.0</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.6.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.3</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.3</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>


Chổ này các bạn cập nhật lại version của Selenium mới nhất luôn là 4.6.0 (updated 04/11/2022). Cùng WebDriverManager version 5.3.1 (updated 04/11/2022)

Thêm 2 cái thư viện SLF4J version mới nhất luôn nhé. Để nó thích ứng với Selenium bản mới nhất.

Còn về TestNG bản 7.4.0 thì nó thích ứng ở tất cả các phiên bản của các thư viện khác.

✅ Sử dụng TestNG Framework

Chúng ta tạo một packageBai9_TestNGFramework và tạo một class mới RunTestNG chạy thử xem cài đặt được chưa.

[Selenium Java] Bài 9: Cài đặt và sử dụng TestNG Framework | Anh Tester

package anhtester.com.Bai9_TestNGFramework;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.time.Duration;

public class RunTestNG {
    WebDriver driver;

    @BeforeMethod
    public void createDriver() {
        //WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
    }

    @Test
    public void testAnhTesterBlog() throws InterruptedException {
        driver.get("https://anhtester.com");
        driver.findElement(By.xpath("//a[normalize-space()='blog']")).click();
        Thread.sleep(2000);
    }

    @Test
    public void testGoogleSearch() throws InterruptedException {
        driver.get("https://www.google.com/");
        driver.findElement(By.xpath("//input[@name='q']")).sendKeys("anhtester", Keys.ENTER);
        Thread.sleep(1000);
        driver.findElement(By.xpath("//h3[normalize-space()='Anh Tester - Automation Testing']")).click();
        Thread.sleep(2000);
    }

    @AfterMethod
    public void closeDriver() {
        driver.quit();
    }
}


Các bạn thấy là chúng ta không còn chạy code auto trong hàm main nữa. Và cái hay là cứ mỗi cái test cases chúng ta để trong một hàm riêng với ghi chú là @Test

Chúng ta sẽ click Run chạy từng function hoặc là chạy cả class luôn nhé.

[Selenium Java] Bài 9: Cài đặt và sử dụng TestNG Framework | Anh Tester

Khi chạy xong sẽ có kết quả Pass/Fail/Skip rất rõ ràng chứ không như trước đây.

[Selenium Java] Bài 9: Cài đặt và sử dụng TestNG Framework | Anh Tester


3. Cài đặt TestNG trong Eclipse

Eclipse là một trong những IDE rất phổ biến để phát triển test trong Java.

Và để sử dụng testNG, không phải là sẽ tải về và cài đặt như một tool, mà sẽ giống như một cái phần mềm nho nhỏ được cài đặt tích hợp trong Eclipse.

Để cài đặt thành công TestNG thì chúng ta cần chuẩn bị:

  • Cài đặt môi trường Java (bài 1)
  • Cấu hình Java (bài 1)
  • Cài đặt Eclipse (bài 1)
  • Cài đặt Selenium Webdriver (bài 4) - Có thể cài sau TestNG vẫn được
  • Cài đặt TestNG


Bắt đầu nhé


1. Mở Eclipse IDE lên -> click Help > Eclipse Marketplace

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


2. Gõ TestNG và nhấn Go để tìm kiếm framework như hình bên dưới
3. Nhấn Install để cài đặt

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester
Tiến trình đang chạy để xác nhận chọn gói TestNG for Eclipse:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

    4. Các bạn nhấn chọn hết và "Confirm" để xác nhận bước tiếp theo

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

     5. Chọn "I accept..." và nhấn "Finish"

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester
Nếu có cửa sổ bật lên xác nhận như hình bên dưới thì các bạn chọn "Install anyway"


[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester
 
Chờ cho đến khi cài đặt xong và khởi động lại TestNG là được

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Sau khi khởi động lại, hãy xác minh xem TestNG có thực sự được cài đặt thành công hay không.
Bấm vào Window > Show View > Other

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Sau đó, mở thư mục Java và xem TestNG có hiện lên chưa.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

HOÀN TẤT RỒI CÒN GÌ NỮA ĐÂU :))


4. Sử dụng TestNG trong Eclipse

3.1 Tạo Test Case bằng cách sử dụng chú thích TestNG

Bây giờ, chúng ta sẽ tìm hiểu cách tạo test case đầu tiên của mình bằng cách sử dụng Chú thích (Annotation) TestNG trong Selenium

Trước tiên chúng ta tạo một Project TestNG mới trong Eclipse và đặt tên là "FirstTestNGProject".

Thiết lập một Project TestNG mới

Bước 1: Nhấp vào File > New > Java Project

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 2: Gõ "FirstTestNGProject" làm Tên dự án, sau đó nhấp vào Next.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 3: Bây giờ chúng ta sẽ bắt đầu thêm Thư viện TestNG vào dự án của mình. Nhấp vào tab "Libraries", sau đó nhấp vào "Add Library…"

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 4: Trên hộp thoại Thêm Thư viện, chọn "TestNG" và nhấp vào Next.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 5: Nhấp vào Finish.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bạn sẽ thấy TestNG hiển thị trong danh sách Libraries.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 6: Bây giờ chúng ta sẽ thêm các tệp JAR có chứa API Selenium. Vào đây tải https://www.selenium.dev/downloads/ 
Phần này chúng ta đã cài đặt Selenium vào Eclipse bài trước chắc quen rồi. Quên thì lật lại coi :))
=> [Selenium Java] Lesson 4: Cài đặt môi trường Selenium với Java

Bước 7: Nhấp vào Apply và Close.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


Cách tạo file class test mới với TestNG

Bước 1: Nhấp chuột phải vào thư mục gói "src" rồi chọn New > Other

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 2: Nhấp vào thư mục TestNG và chọn tùy chọn "TestNG class". Nhấn Next.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 3: Nhập các giá trị như mẫu bên dưới và nhấp vào Finish.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Eclipse sẽ tự động tạo mẫu cho tệp TestNG cho chúng ta như hiển thị bên dưới.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


Code mẫu chạy thử nào:

package testngpackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.*;

public class AutomationTestNG {

    public String baseUrl = "https://anhtester.com";

    String driverPath = "D:\\TESTER\\SeleniumJava\\Setup\\chromedriver.exe";
    System.setProperty("webdriver.chrome.driver", driverPath);    
    public WebDriver driver ; 
     
  @Test
  public void verifyHomepageTitle() {
	
      driver = new ChromeDriver();
	    
      driver.manage().window().maximize();
        
      driver.navigate().to(baseUrl);
      Thread.sleep(2000);

      String expectedTitle = "Anh Tester - Automation Testing";
      String actualTitle = driver.getTitle();

      Assert.assertEquals(actualTitle, expectedTitle);

      Thread.sleep(2000);
      driver.quit();
  }
}

  • TestNG không yêu cầu bạn phải có phương thức main ().
  • Các phương thức không cần phải tĩnh.
  • Chúng ta đã sử dụng chú thích @Test. (@Test được sử dụng để cho biết rằng phương thức bên dưới nó là một trường hợp thử nghiệm)

Chạy thử nghiệm

Để chạy thử nghiệm, chỉ cần chạy tệp trong Eclipse như bạn thường làm. Eclipse sẽ cung cấp hai đầu ra
- Một trong cửa sổ Console
- Một trên cửa sổ TestNG Results.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


Kiểm tra các Report được tạo bởi TestNG

Cửa sổ Console trong Eclipse cung cấp một báo cáo dựa trên văn bản về kết quả trường hợp thử nghiệm của chúng tôi trong khi cửa sổ Kết quả TestNG cung cấp cho chúng ta một báo cáo đồ họa.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

 

Tạo HTML Report

TestNG có khả năng tạo báo cáo ở định dạng HTML.

Bước 1: Sau khi chạy FirstTestNGFile mà chúng ta đã tạo ở phần trước, nhấp chuột phải vào tên dự án (FirstTestNGProject) trong cửa sổ Project Explorer rồi nhấp vào tùy chọn "Refresh".

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


Bước 2:
 Lưu ý rằng một thư mục "test-output" đã được tạo. Mở rộng nó và tìm kiếm tệp index.html. Tệp HTML này là báo cáo kết quả của lần chạy thử nghiệm gần đây nhất.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Bước 3: Nhấp đúp vào tệp index.html đó để mở tệp trong trình duyệt web được tích hợp sẵn của Eclipse. Bạn có thể làm mới trang này bất kỳ lúc nào sau khi chạy lại bài kiểm tra của mình bằng cách chỉ cần nhấn F5 giống như trong các trình duyệt web thông thường.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester



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

Tạo Project demo của chúng ta:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

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");
}
 

I. Cách tạo file testng.xml

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester
[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

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ó là file xml. 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 testng.xml:

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

<suite name="Suite" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="firstpackage.FirstClass" />
        </classes>
    </test>
</suite>
 
  • Dòng đầu tiên, 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 <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 testcase, testcase là cái viết ở Method.
  • <suite> và <test> có attribute name, có thể đặt tên tùy ý.
  • Một file TestNG chỉ có 1 <suite> duy nhất và <suite> có thể có nhiều <test>.
  • Trong Test có thể có 0 hoặc nhiều đối tượng test: <packages>, <classes>, <methods>.


II. Cách run test theo Class

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

<suite name="Suite" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="firstpackage.FirstClass" />
            <class name="firstpackage.SecondClass" />
        </classes>
    </test>
</suite>​


  • Đối tượng phía trong của <test> là <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:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


III. Cách run test theo package


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

<suite name="Suite" verbose="1">
    <test name="FirstTest">
        <packages>
            <package name="firstpackage" />
            <package name="secondpackage" />
        </packages>
    </test>
</suite>​
  • Đối tượng phía trong của <test> là <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:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


IV. Cách run test theo Method


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

<suite name="Suite" verbose="1">
    <test name="FirstTest">
        <classes>
            <class name="firstpackage.FirstClass">
                <methods>
                    <include name="firstTest" />
                </methods>
            </class>
            <class name="secondpackage.FirstClass">
                <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>


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


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

<suite name="Combine Suite" verbose="1">
    <test name="Combine Test">
        <packages>
            <package name="firstpackage" />
        </packages>
        <classes>
            <class name="secondpackage.FirstClass" />
            <class name="thirdpackage.FirstClass">
                <methods>
                    <include name="firstTest" />
                </methods>
            </class>
        </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ả:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester


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 và thứ tự theo 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ự ta mong muốn sẽ được nói ở 1 bài khác, cách bài này không xa lắm.


VI. 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="Exclude Method Suite" verbose="1">
    <test name="Exclude Method Test">
        <classes>
            <class name="firstpackage.FirstClass">
                <methods>
                    <exclude name="firstTest" />
                </methods>
            </class>
        </classes>
    </test>
</suite>​

 

Đây là kết quả:

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

NOTE: Một project có thể có nhiều file config.

[Selenium Java] Lesson 9: Cài đặt và sử dụng TestNG | Anh Tester

Teacher

Teacher

Anh Tester

Software Tester

Đườ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