# Checklist Kiểm Thử Tích Hợp 4 Tool - Dành Cho Tester Fresher

---

## 1. JUnit / TestNG Checklist

> **Mục tiêu:** Nắm vững kiểm thử đơn vị và kiểm thử tích hợp với framework Java phổ biến nhất.

- [ ] **1.1 Setup project Maven** — Tạo file `pom.xml`, thêm dependency `junit-jupiter` (JUnit 5) hoặc `testng` vào block `<dependencies>`, chạy `mvn clean install` thành công không lỗi
- [ ] **1.2 Setup project Gradle** — Tạo file `build.gradle`, khai báo `testImplementation 'org.junit.jupiter:junit-jupiter:5.x'`, chạy `./gradlew test` để xác nhận build pass
- [ ] **1.3 Viết test case đơn giản** — Tạo class `*Test.java`, dùng annotation `@Test` (JUnit) hoặc `@Test(groups="smoke")` (TestNG), đặt tên method theo pattern `shouldDoX_whenY`
- [ ] **1.4 Sử dụng Assertion cơ bản** — Thực hành đầy đủ: `assertEquals`, `assertNotNull`, `assertTrue`, `assertThrows` (JUnit 5) / `Assert.assertEquals` (TestNG) với cả happy path và negative case
- [ ] **1.5 Cấu hình vòng đời test** — Hiểu và dùng đúng `@BeforeEach/@AfterEach` (JUnit) hoặc `@BeforeMethod/@AfterMethod` (TestNG) để khởi tạo và dọn dẹp dữ liệu test
- [ ] **1.6 Chạy test theo nhóm / Suite** — Dùng `@Tag` (JUnit 5) hoặc `@Test(groups="regression")` + file `testng.xml` để chạy chọn lọc nhóm test case
- [ ] **1.7 Parameterized Test** — Viết ít nhất 1 test dùng `@ParameterizedTest + @CsvSource` (JUnit) hoặc `@DataProvider` (TestNG) để chạy cùng logic với nhiều bộ dữ liệu
- [ ] **1.8 Mock dependency cơ bản** — Tích hợp `Mockito`, dùng `@Mock`, `when().thenReturn()`, `verify()` để cô lập unit test khỏi database hoặc external service
- [ ] **1.9 Xem báo cáo HTML** — Sau khi chạy `mvn test`, mở file `target/surefire-reports/index.html` (Maven) hoặc `build/reports/tests/test/index.html` (Gradle), đọc được số test passed/failed/skipped
- [ ] **1.10 Tích hợp CI pipeline cơ bản** — Thêm bước `mvn test` hoặc `./gradlew test` vào file `.github/workflows/ci.yml` hoặc `Jenkinsfile`, xác nhận pipeline tự chạy khi push code

---

## 2. Selenium Checklist

> **Mục tiêu:** Tự động hóa kiểm thử giao diện web, thao tác được với các phần tử UI phổ biến.

- [ ] **2.1 Cài đặt ChromeDriver** — Download ChromeDriver khớp version với Chrome đang dùng từ https://chromedriver.chromium.org, set PATH hoặc dùng `WebDriverManager` (`io.github.bonigarcia:webdrivermanager`) để tự động quản lý version
- [ ] **2.2 Khởi tạo WebDriver** — Viết được đoạn code khởi tạo: `WebDriver driver = new ChromeDriver()`, cấu hình `ChromeOptions` với `--headless`, `--no-sandbox`, `--disable-dev-shm-usage` cho môi trường CI
- [ ] **2.3 Điều hướng và kiểm tra URL** — Sử dụng `driver.get(url)`, `driver.navigate().to()`, `driver.navigate().back()`, xác nhận URL bằng `driver.getCurrentUrl()` + `assertEquals`
- [ ] **2.4 Locator Strategy — By.id và By.name** — Tìm element bằng `By.id("username")`, `By.name("password")`, ưu tiên dùng `id` vì ổn định nhất, ghi chú lại khi element không có `id`
- [ ] **2.5 Locator Strategy — By.xpath và By.cssSelector** — Viết được XPath tương đối `//button[@type='submit']`, CSS Selector `.login-btn`, so sánh hiệu năng (CSS thường nhanh hơn XPath), tránh dùng XPath tuyệt đối
- [ ] **2.6 Explicit Wait thay vì Thread.sleep** — Dùng `WebDriverWait` + `ExpectedConditions.visibilityOfElementLocated()` với timeout hợp lý (10-15 giây), tuyệt đối **không** dùng `Thread.sleep()` trong production test
- [ ] **2.7 Thao tác với Form và Dropdown** — Thực hành: `sendKeys()` nhập text, `click()` chọn checkbox/radio, dùng class `Select` để chọn `<select>` dropdown theo `visibleText`, `value`, hoặc `index`
- [ ] **2.8 Xử lý Alert và iFrame** — Dùng `driver.switchTo().alert().accept()` cho JS alert, `driver.switchTo().frame("frameName")` để làm việc trong iframe, `driver.switchTo().defaultContent()` để thoát ra
- [ ] **2.9 Chụp Screenshot khi test FAIL** — Implement `TakesScreenshot` interface: `((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE)`, lưu vào thư mục `screenshots/` với tên file chứa timestamp và tên test case
- [ ] **2.10 Áp dụng Page Object Model (POM)** — Tách biệt từng trang thành class riêng dùng `@FindBy` + `PageFactory.initElements()`, test class chỉ gọi method của Page Object, không chứa locator trực tiếp

---

## 3. JMeter Checklist

> **Mục tiêu:** Kiểm thử hiệu năng (Performance Testing) cơ bản, đọc hiểu kết quả load test.

- [ ] **3.1 Tạo Test Plan và Thread Group** — Mở JMeter, tạo `Test Plan` → chuột phải thêm `Thread Group`, cấu hình 3 thông số bắt buộc: **Number of Threads** (users ảo), **Ramp-Up Period** (giây để tăng dần), **Loop Count** (số vòng lặp)
- [ ] **3.2 Cấu hình HTTP Request Sampler** — Thêm `HTTP Request` vào Thread Group, điền đúng: **Protocol** (http/https), **Server Name**, **Port**, **Method** (GET/POST), **Path**, thêm **Body Data** hoặc **Parameters** cho POST request
- [ ] **3.3 Thêm HTTP Header Manager** — Thêm `Config Element > HTTP Header Manager`, khai báo header `Content-Type: application/json` và `Authorization: Bearer <token>` khi test API cần xác thực
- [ ] **3.4 Sử dụng CSV Data Set Config** — Tạo file `testdata.csv` chứa username/password hoặc ID đa dạng, thêm `CSV Data Set Config`, cấu hình `Variable Names` và `Sharing Mode` để mỗi thread dùng dữ liệu riêng
- [ ] **3.5 Thêm Listener — View Results Tree** — Thêm `Listener > View Results Tree` để debug từng request/response, xem **Request Headers**, **Response Body**, **Response Code** (200/404/500) khi chạy với số lượng nhỏ
- [ ] **3.6 Thêm Listener — Summary Report và Aggregate Report** — Thêm cả hai listener này, sau khi chạy load test đọc được các chỉ số: **Average** (ms), **Min/Max**, **Throughput** (req/s), **Error%**, **90th/95th/99th Percentile**
- [ ] **3.7 Hiểu và phân tích chỉ số kết quả** — Nắm ngưỡng đánh giá cơ bản: Average response time < 2000ms (web) / < 500ms (API), Error Rate < 1% là PASS, Throughput phải đáp ứng yêu cầu concurrent users của dự án
- [ ] **3.8 Chạy JMeter ở chế độ Non-GUI (Command Line)** — Sử dụng lệnh `jmeter -n -t testplan.jmx -l results.jtl -e -o report/` để chạy không cần giao diện, sinh HTML report tự động, tích hợp được vào CI/CD pipeline

---

## 4. Chiến Lược Kết Hợp 4 Tool Theo Sprint

> **Mục tiêu:** Biết cách phối hợp đúng tool vào đúng giai đoạn, tránh lãng phí công sức và đảm bảo chất lượng toàn diện.

- [ ] **4.1 Thứ tự chạy test theo giai đoạn Sprint**
  Tuân thủ kim tự tháp kiểm thử theo thứ tự ưu tiên:
  ```
  Giai đoạn 1 — Dev hoàn thành feature:
    └─ Chạy JUnit/TestNG (Unit Test + Integration Test) → phải PASS 100%

  Giai đoạn 2 — Deploy lên môi trường Staging:
    └─ Chạy Selenium (Smoke Test tự động, ~10-15 test case critical) → phải PASS

  Giai đoạn 3 — Trước khi Release / End of Sprint:
    └─ Chạy Selenium (Full Regression Suite)
    └─ Chạy JMeter (Load Test với concurrent users theo yêu cầu)
  ```

- [ ] **4.2 Ngưỡng Pass/Fail cho từng loại test**
  Định nghĩa rõ ràng **Definition of Done** về kiểm thử:

  | Loại Test | Tool | Ngưỡng PASS | Hành động khi FAIL |
  |---|---|---|---|
  | Unit Test | JUnit/TestNG | 100% passed | Block merge PR ngay lập tức |
  | Smoke Test | Selenium | ≥ 95% passed | Block deploy lên Staging |
  | Regression Test | Selenium | ≥ 90% passed | Tạo bug report, họp triage |
  | Load Test | JMeter | Error Rate < 1%, Avg < 2s | Tạo performance bug, không release |

- [ ] **4.3 Phân chia trách nhiệm viết test theo vai trò**
  Tránh chồng chéo công việc, phân công rõ ràng trong team:
  - **Developer** → Chịu trách nhiệm viết và maintain JUnit/TestNG (Unit + Integration Test)
  - **Tester (Automation)** → Viết và maintain Selenium test suite (Smoke + Regression)
  - **Tester (Performance)** → Thiết kế kịch bản và chạy JMeter, phân tích kết quả
  - **Tester Fresher** → Bắt đầu với Selenium Smoke Test, học JUnit song song, JMeter quan sát trước

- [ ] **4.4 Quản lý môi trường và dữ liệu test**
  Đảm bảo tính độc lập và tái sử dụng của test:
  - Dùng file `.env` hoặc `config.properties` để tách biệt **URL**, **credentials**, **timeout** theo môi trường (dev/staging/prod), không hardcode trong code
  - JUnit/TestNG: Dùng `@BeforeEach` để tạo dữ liệu mới, `@AfterEach` để rollback/xóa — đảm bảo mỗi test **độc lập hoàn toàn**
  - Selenium: Dùng API call (RestAssured) trong `@BeforeClass` để seed dữ liệu, tránh phụ thuộc vào kết quả test trước
  - JMeter: Tạo môi trường test riêng biệt, **không bao giờ** chạy load test trên môi trường Production

- [ ] **4.5 Báo cáo tổng hợp và theo dõi xu hướng chất lượng**
  Xây dựng thói quen đo lường và cải tiến liên tục:
  - Tích hợp tất cả report vào một nơi: Allure Report (JUnit/Selenium) + JMeter HTML Report → publish lên Jenkins/GitHub Actions artifacts sau mỗi pipeline run
  - Theo dõi **Test Pass Rate trend** theo từng Sprint bằng biểu đồ (dùng Allure Trends hoặc Grafana nếu có)
  - Định kỳ **cuối mỗi Sprint** review: số lượng test case mới thêm, số flaky test cần fix, thời gian chạy toàn bộ suite (mục tiêu < 30 phút cho full regression)
  - Ghi lại **lessons learned** về bug tìm được bởi từng loại test để tối ưu chiến lược Sprint sau

---

> 💡 **Ghi chú cho Tester Fresher:** Đừng cố gắng hoàn thành tất cả cùng một lúc. Hãy hoàn thiện **Phần 1** trước (2 tuần), sau đó **Phần 2** (3 tuần), rồi mới kết hợp **Phần 4**. JMeter (Phần 3) có thể học song song khi đã quen với Selenium.