# 🚀 Lộ Trình Học Automation Testing 3 Tháng
### Dành cho Manual Tester chuyển sang Automation

> **Dành cho:** Manual Tester muốn bước sang thế giới Automation  
> **Thời gian:** 3 tháng (~10-15 tiếng/tuần)  
> **Mục tiêu cuối:** Có thể tự viết, chạy và maintain automation test framework thực tế

---

## 📋 Tổng Quan Lộ Trình

| Tháng | Chủ đề | Kết quả |
|-------|--------|---------|
| 🟡 Tháng 1 | Java cơ bản + Selenium WebDriver | Viết được script test đơn giản |
| 🟠 Tháng 2 | Locators nâng cao + TestNG + POM | Xây dựng được framework cơ bản |
| 🟢 Tháng 3 | Project thực tế + GitHub + Appium | Có portfolio để đi phỏng vấn |

---

## 🟡 THÁNG 1: Nền Tảng Java + Selenium WebDriver

### 🎯 Mục Tiêu Tháng 1
Nắm vững Java đủ dùng để viết automation test và làm quen với Selenium WebDriver. Bạn **không cần** học Java như một Java Developer — chỉ cần đủ để viết test script!

---

### 📚 Tuần 1: Cài Đặt Môi Trường + Java Cơ Bản (Phần 1)

#### 🔧 Cài đặt môi trường
- [ ] Cài **JDK 11 hoặc 17** (LTS version) từ [adoptium.net](https://adoptium.net)
- [ ] Cài **IntelliJ IDEA Community Edition** (miễn phí, dùng tốt hơn Eclipse)
- [ ] Cài **Maven** hoặc dùng Maven tích hợp trong IntelliJ
- [ ] Tạo project Maven đầu tiên, chạy được `Hello World`
- [ ] Cài **Google Chrome** + **ChromeDriver** phù hợp version
- [ ] Tạo tài khoản **GitHub** nếu chưa có

#### ☕ Java Cơ Bản - Biến và Kiểu Dữ Liệu
- [ ] Hiểu và viết được các kiểu dữ liệu: `String`, `int`, `boolean`, `double`
- [ ] Phân biệt được `int` vs `Integer`, `String` và cách so sánh string (`equals` vs `==`)
- [ ] Thực hành: Khai báo biến lưu thông tin user (username, password, age, isLoggedIn)
- [ ] Hiểu `final` (hằng số) — dùng nhiều để lưu URL, timeout
- [ ] Nắm được cách in ra màn hình: `System.out.println()`

#### 🔁 Java Cơ Bản - Điều Kiện
- [ ] Viết được `if / else if / else`
- [ ] Biết dùng `switch-case` (dùng khi kiểm tra nhiều trường hợp)
- [ ] Thực hành: Viết hàm kiểm tra login thành công/thất bại dựa trên username và password

---

### 📚 Tuần 2: Java Cơ Bản (Phần 2)

#### 🔁 Vòng Lặp
- [ ] Viết được vòng lặp `for` cơ bản
- [ ] Viết được vòng lặp `while`
- [ ] Biết dùng `for-each` để duyệt danh sách
- [ ] Thực hành: Viết vòng lặp để in ra danh sách tên sản phẩm từ một mảng
- [ ] Biết khi nào dùng `break` và `continue`

#### 🔧 Hàm (Methods)
- [ ] Hiểu cú pháp khai báo hàm: `returnType methodName(parameters)`
- [ ] Phân biệt hàm có return value và `void`
- [ ] Viết được hàm `loginUser(String username, String password)`
- [ ] Hiểu khái niệm **overloading** (cùng tên hàm, khác tham số)
- [ ] Thực hành: Viết 5 hàm tiện ích hay dùng trong test (generateRandomEmail, formatDate, v.v.)

#### 📦 Array và ArrayList
- [ ] Khai báo và dùng được **Array** cơ bản
- [ ] Dùng được **ArrayList** — thêm, xóa, lấy phần tử
- [ ] Biết dùng `List<String>` để lưu danh sách test data
- [ ] Thực hành: Tạo danh sách các URL cần test, duyệt và in ra

---

### 📚 Tuần 3: Java Hướng Đối Tượng + Exception

#### 🏛️ Class và Object
- [ ] Hiểu khái niệm **Class** là gì, **Object** là gì (đừng lo lắng quá về lý thuyết!)
- [ ] Tạo được class đơn giản với **fields** và **methods**
- [ ] Hiểu **Constructor** là gì và tại sao cần nó
- [ ] Phân biệt `public`, `private` (encapsulation cơ bản)
- [ ] Thực hành: Tạo class `User` với các field: username, password, email + các getter/setter
- [ ] Thực hành: Tạo class `Product` với name, price, quantity

#### 🧬 Kế Thừa và Interface (Mức độ cần biết)
- [ ] Hiểu `extends` — class con kế thừa class cha
- [ ] Biết `@Override` là gì
- [ ] Hiểu **Interface** ở mức cơ bản (sẽ dùng trong POM tháng 2)
- [ ] Thực hành: Tạo class `AdminUser` kế thừa `User`, thêm field `role`

#### ⚠️ Exception Handling
- [ ] Hiểu Exception là gì và tại sao automation test hay gặp
- [ ] Viết được `try-catch-finally`
- [ ] Biết các exception phổ biến trong Selenium: `NoSuchElementException`, `TimeoutException`, `StaleElementReferenceException`
- [ ] Biết cách throw exception: `throw new RuntimeException("message")`
- [ ] Thực hành: Wrap một đoạn code có thể lỗi trong try-catch, in ra message rõ ràng

---

### 📚 Tuần 4: Selenium WebDriver Cơ Bản

#### 🌐 Setup Selenium
- [ ] Thêm dependency Selenium vào `pom.xml`
- [ ] Hiểu cách WebDriver hoạt động (Browser ↔ ChromeDriver ↔ Selenium)
- [ ] Chạy được script mở Chrome, truy cập Google, đóng trình duyệt
- [ ] Cấu hình được `ChromeOptions` (chạy không có UI — headless, maximize window)

#### 🖱️ Tương Tác Cơ Bản
- [ ] Mở URL: `driver.get("https://...")`
- [ ] Tìm element cơ bản bằng `By.id()`, `By.name()`
- [ ] Click vào element: `element.click()`
- [ ] Nhập text: `element.sendKeys("text")`
- [ ] Xóa text: `element.clear()`
- [ ] Lấy text của element: `element.getText()`
- [ ] Kiểm tra element có hiển thị không: `element.isDisplayed()`
- [ ] Thực hành: Viết script login vào [https://the-internet.herokuapp.com/login](https://the-internet.herokuapp.com/login)

#### ⏱️ Waits — RẤT QUAN TRỌNG
- [ ] Hiểu tại sao cần **Wait** (page load, AJAX, animation)
- [ ] Biết dùng `Thread.sleep()` (cách dùng nhưng KHÔNG nên lạm dụng)
- [ ] Cài đặt và dùng được **Implicit Wait**
- [ ] Dùng được **Explicit Wait** với `WebDriverWait` + `ExpectedConditions`
- [ ] Thực hành: Viết script chờ element xuất hiện trước khi click
- [ ] Thực hành: Dùng `ExpectedConditions.visibilityOfElementLocated()`

---

### 📖 Tài Nguyên Học Tháng 1

| Loại | Tên | Link | Ghi chú |
|------|-----|------|---------|
| Video | Java for Testers - Automation Step by Step | YouTube | Tìm kênh "Automation Step by Step" |
| Video | Selenium Java Full Course | YouTube - Edureka | Miễn phí |
| Thực hành | The Internet - Herokuapp | [the-internet.herokuapp.com](https://the-internet.herokuapp.com) | Website demo để luyện |
| Thực hành | DemoQA | [demoqa.com](https://demoqa.com) | Nhiều component để thực hành |
| Docs | Selenium Official Docs | [selenium.dev/documentation](https://www.selenium.dev/documentation) | Tài liệu chính thức |
| Sách | "Java Programming for Beginners" | Amazon/PDF | Đọc chương 1-7 là đủ |

---

### 🏆 Milestone Cuối Tháng 1

> ✅ **Bạn đã sẵn sàng qua Tháng 2 khi:**

- [ ] Viết được script Java không cần Google mỗi 5 phút cho những thứ cơ bản
- [ ] Tự viết được script: Mở browser → Login → Kiểm tra kết quả → Đóng browser
- [ ] Script chạy được 3 lần liên tiếp không bị lỗi
- [ ] Hiểu được lỗi `NoSuchElementException` và biết cách debug
- [ ] **Demo được:** Script tự động login vào The Internet Herokuapp ✨

---

## 🟠 THÁNG 2: Locators Nâng Cao + TestNG + Page Object Model

### 🎯 Mục Tiêu Tháng 2
Nâng cấp từ "script chạy được" lên "framework có cấu trúc". Đây là tháng quan trọng nhất — Page Object Model sẽ là thứ bạn dùng mỗi ngày khi đi làm!

---

### 📚 Tuần 5: Locators Nâng Cao

#### 🔍 Ôn Lại và Nâng Cấp Locators

**ID và Name (Dễ nhất)**
- [ ] Thực hành tìm element bằng `By.id()` — luôn ưu tiên dùng cái này trước
- [ ] Thực hành tìm element bằng `By.name()`
- [ ] Biết khi nào element không có ID và phải dùng cách khác

**CSS Selector**
- [ ] Hiểu cú pháp cơ bản: `tagName`, `.className`, `#id`
- [ ] Kết hợp: `input.login-form` (tag + class)
- [ ] Attribute selector: `input[type='submit']`
- [ ] Tìm element con: `div.form > input`
- [ ] Thực hành: Viết 10 CSS selector cho các element trên DemoQA
- [ ] Dùng DevTools để test CSS selector trước khi viết vào code

**XPath — Linh Hoạt Nhất**
- [ ] Hiểu cú pháp XPath tuyệt đối vs tương đối (luôn dùng tương đối)
- [ ] `//tagName[@attribute='value']` — cú pháp hay dùng nhất
- [ ] Dùng `text()`: `//button[text()='Login']`
- [ ] Dùng `contains()`: `//input[contains(@class,'username')]`
- [ ] Dùng `starts-with()`: `//input[starts-with(@id,'user')]`
- [ ] XPath với quan hệ cha-con: `//div[@class='form']//input`
- [ ] XPath với `following-sibling` và `preceding-sibling`
- [ ] Thực hành: Viết XPath cho 10 element khó trên trang web thực tế
- [ ] **Luyện tập:** Mở DevTools → Console → Dùng `$x("//xpath")` để test

**LinkText và PartialLinkText**
- [ ] Dùng `By.linkText()` cho thẻ `<a>`
- [ ] Dùng `By.partialLinkText()` khi text quá dài
- [ ] Biết khi nào nên dùng vs không nên dùng

**Chọn Locator Strategy đúng**
- [ ] Nắm được thứ tự ưu tiên: ID > Name > CSS > XPath
- [ ] Biết khi nào XPath tốt hơn CSS (và ngược lại)
- [ ] Thực hành: Cho một element, viết được 3 cách locate khác nhau

---

### 📚 Tuần 6: Xử Lý Các Element Phức Tạp

#### 🎛️ Dropdown, Checkbox, Radio Button
- [ ] Dùng `Select` class để handle `<select>` dropdown
- [ ] `selectByVisibleText()`, `selectByValue()`, `selectByIndex()`
- [ ] Handle custom dropdown (không phải thẻ select) — click và chọn từ list
- [ ] Thực hành check/uncheck checkbox: `element.click()` + verify `isSelected()`
- [ ] Thực hành chọn radio button
- [ ] Thực hành: Hoàn thành form trên [demoqa.com/automation-practice-form](https://demoqa.com/automation-practice-form)

#### 🗓️ Các Element Khó
- [ ] Upload file: `element.sendKeys("/path/to/file")`
- [ ] Handle **Alert/Popup**: `driver.switchTo().alert().accept()`
- [ ] Handle **iFrame**: `driver.switchTo().frame()` và `driver.switchTo().defaultContent()`
- [ ] Handle **multiple windows/tabs**: `driver.getWindowHandles()`
- [ ] Scroll trang: dùng `JavascriptExecutor`
- [ ] Click bằng **JavascriptExecutor** (khi click thường không work)
- [ ] Thực hành: Test trang có iframe (DemoQA có nhiều ví dụ tốt)

#### 🖱️ Actions Class — Thao Tác Nâng Cao
- [ ] Hover chuột: `Actions.moveToElement()`
- [ ] Right-click: `Actions.contextClick()`
- [ ] Double-click: `Actions.doubleClick()`
- [ ] Drag and drop: `Actions.dragAndDrop()`
- [ ] Keyboard shortcuts: `Actions.keyDown(Keys.CONTROL).sendKeys("a")`
- [ ] Thực hành: Test drag-and-drop trên [the-internet.herokuapp.com/drag_and_drop](https://the-internet.herokuapp.com/drag_and_drop)

---

### 📚 Tuần 7: TestNG Framework

#### 🧪 Setup và Annotation Cơ Bản
- [ ] Thêm TestNG dependency vào `pom.xml`
- [ ] Cài TestNG plugin trong IntelliJ
- [ ] Hiểu và dùng được các annotation chính:
  - [ ] `@Test` — đánh dấu đây là test method
  - [ ] `@BeforeMethod` — chạy trước mỗi test (thường dùng để mở browser)
  - [ ] `@AfterMethod` — chạy sau mỗi test (thường dùng để đóng browser)
  - [ ] `@BeforeClass` — chạy một lần trước tất cả test trong class
  - [ ] `@AfterClass` — chạy một lần sau tất cả test trong class
  - [ ] `@BeforeSuite` / `@AfterSuite`
- [ ] Tạo và chạy được TestNG test đầu tiên
- [ ] Xem được **TestNG Report** HTML sau khi chạy

#### 🔧 TestNG Nâng Cao
- [ ] Cấu hình file `testng.xml` để chạy test
- [ ] Chạy test theo **group**: `@Test(groups = {"smoke", "regression"})`
- [ ] Chạy test theo **priority**: `@Test(priority = 1)`
- [ ] Bỏ qua test: `@Test(enabled = false)`
- [ ] **Data Provider** — cực kỳ quan trọng cho data-driven testing:
  - [ ] Viết `@DataProvider` cơ bản
  - [ ] Dùng `@DataProvider` với `@Test(dataProvider = "...")`
  - [ ] Thực hành: Test login với nhiều bộ dữ liệu (valid/invalid username/password)
- [ ] Cấu hình **timeout**: `@Test(timeOut = 5000)`
- [ ] Dùng `Assert` và `SoftAssert`:
  - [ ] `Assert.assertEquals()`, `Assert.assertTrue()`, `Assert.assertFalse()`
  - [ ] Hiểu khi nào dùng `SoftAssert` (verify nhiều điều nhưng không dừng test)

#### 📊 TestNG Reports
- [ ] Đọc được TestNG default report
- [ ] Tích hợp **Extent Reports** (optional nhưng rất đẹp để demo)
- [ ] Chụp **Screenshot khi test fail** và đính vào report

---

### 📚 Tuần 8: Page Object Model (POM)

#### 🏛️ Hiểu Tại Sao Cần POM

> 💡 **Giải thích đơn giản:** Thay vì viết locator và action rải rác khắp nơi, POM gom tất cả thứ liên quan đến một trang vào một class. Khi UI thay đổi, bạn chỉ sửa **một chỗ** thay vì tìm khắp project!

- [ ] Đọc và hiểu vấn đề của code **không có POM** (code lặp, khó maintain)
- [ ] Hiểu cấu trúc POM: Page Class chứa locators và methods, Test Class chứa test logic
- [ ] Vẽ sơ đồ cấu trúc project POM trên giấy trước khi code

#### 🏗️ Xây Dựng POM Framework
- [ ] Tạo **Base Page** class với WebDriver và các method dùng chung (click, type, getText, waitForElement)
- [ ] Tạo **Page Class** đầu tiên: `LoginPage.java`
  - [ ] Khai báo locators là field của class (dùng `By`)
  - [ ] Viết method `enterUsername(String username)`
  - [ ] Viết method `enterPassword(String password)`
  - [ ] Viết method `clickLoginButton()`
  - [ ] Viết method `login(String username, String password)` — gọi 3 method trên
- [ ] Tạo `HomePage.java` — trang sau khi login thành công
  - [ ] Method kiểm tra đã login thành công
  - [ ] Method logout
- [ ] Tạo Test Class `LoginTest.java` — chỉ gọi methods từ Page Classes

#### 🔄 PageFactory — Cách Viết POM Ngắn Gọn Hơn
- [ ] Hiểu `@FindBy` annotation thay thế cho `driver.findElement(By...)`
- [ ] Dùng `PageFactory.initElements(driver, this)` trong constructor
- [ ] So sánh POM với `By` vs POM với `PageFactory` — biết cái nào bạn thấy dễ hơn
- [ ] Refactor `LoginPage` dùng `@FindBy`

#### 🗂️ Cấu Trúc Project Chuẩn
- [ ] Tổ chức project theo cấu trúc:
```
src/
├── main/java/
│   ├── pages/          ← Page Object classes
│   ├── base/           ← BasePage, BaseTest
│   └── utils/          ← Helper methods
└── test/java/
    └── tests/          ← Test classes
resources/
├── testng.xml
└── test-data/          ← File data nếu cần
```
- [ ] Tạo **BaseTest** class: setup driver trước test, quit driver sau test
- [ ] Dùng `@BeforeMethod` trong BaseTest để khởi tạo driver
- [ ] Thực hành: Refactor toàn bộ code tuần 4-6 sang POM structure

---

### 📖 Tài Nguyên Học Tháng 2

| Loại | Tên | Link | Ghi chú |
|------|-----|------|---------|
| Video | TestNG Full Tutorial | YouTube - Selenium Express | Tìm playlist TestNG |
| Video | Page Object Model - Naveen AutomationLabs | YouTube | Kênh rất chất lượng |
| Thực hành | DemoQA | [demoqa.com](https://demoqa.com) | Luyện locators |
| Thực hành | OrangeHRM Demo | [opensource-demo.orangehrmlive.com](https://opensource-demo.orangehrmlive.com) | Website HRMS để thực hành POM |
| Docs | TestNG Documentation | [testng.org](https://testng.org) | Tài liệu chính thức |
| Blog | Guru99 Selenium | [guru99.com/selenium-tutorial](https://www.guru99.com/selenium-tutorial.html) | Bài viết chi tiết, dễ hiểu |
| Tool | XPath Helper (Chrome Extension) | Chrome Web Store | Helper để viết XPath |
| Tool | ChroPath (Chrome Extension) | Chrome Web Store | Generate locators tự động |

---

### 🏆 Milestone Cuối Tháng 2

> ✅ **Bạn đã sẵn sàng qua Tháng 3 khi:**

- [ ] Locate được element dù khó đến đâu (kể cả trong iframe, dynamic element)
- [ ] Viết được test class sử dụng TestNG annotations đúng cách
- [ ] Chạy được test với nhiều bộ dữ liệu dùng `@DataProvider`
- [ ] Xây dựng được POM framework cho ít nhất 3 trang web
- [ ] Khi code bị lỗi, biết cách đọc stack trace và tìm ra nguyên nhân
- [ ] **Demo được:** Framework có LoginPage, HomePage, và ít nhất 5 test case chạy được ✨

---

## 🟢 THÁNG 3: Project Thực Tế + GitHub + Appium

### 🎯 Mục Tiêu Tháng 3
Xây dựng một project automation hoàn chỉnh, đưa lên GitHub, và có một portfolio đàng hoàng để đi phỏng vấn. Đây là tháng "thực chiến"!

---

### 📚 Tuần 9: Git + GitHub + Chuẩn Bị Project

#### 📦 Git Cơ Bản — Không Thể Thiếu
- [ ] Hiểu Git là gì và tại sao cần (version control, collaboration)
- [ ] Cài Git và cấu hình `user.name`, `user.email`
- [ ] Nắm các lệnh cơ bản:
  - [ ] `git init` — khởi tạo repo
  - [ ] `git add .` — stage changes
  - [ ] `git commit -m "message"` — commit với message rõ ràng
  - [ ] `git status` — xem trạng thái
  - [ ] `git log` — xem lịch sử commit
  - [ ] `git branch` — tạo và chuyển branch
  - [ ] `git merge` — merge branch
- [ ] Viết được commit message đúng chuẩn: `feat: add login test cases`
- [ ] Tạo `.gitignore` cho project Java/Maven (ignore `target/`, `.idea/`, `*.class`)

#### 🐙 GitHub
- [ ] Tạo repository mới trên GitHub (Public — để nhà tuyển dụng thấy)
- [ ] Connect local repo với GitHub remote
- [ ] `git push origin main` — đẩy code lên GitHub
- [ ] `git pull` — kéo code mới về
- [ ] Viết file **README.md** đẹp cho project
- [ ] Biết cách tạo **Pull Request** cơ bản

#### 📝 Lên Kế Hoạch Project
- [ ] Chọn website để test (xem gợi ý bên dưới 👇)
- [ ] Liệt kê các **test case** sẽ viết (ít nhất 15-20)
- [ ] Vẽ cấu trúc thư mục project
- [ ] Tạo file Excel/Sheet quản lý test case (Test ID, Description, Priority, Status)

> 💡 **Gợi ý website để làm project:**
> - [automationexercise.com](https://automationexercise.com) — E-commerce, có sẵn API + UI, rất phổ biến để practice
> - [saucedemo.com](https://www.saucedemo.com) — Simple e-commerce, login với nhiều user type
> - [nopcommerce.com/en/demo](https://www.nopcommerce.com/en/demo) — Full-featured e-commerce

---

### 📚 Tuần 10: Viết Test Cases Thực Tế (Phần 1)

#### 🔐 Module Authentication (3-4 test cases)
- [ ] **TC01:** Login thành công với valid credentials
- [ ] **TC02:** Login thất bại với wrong password → verify error message
- [ ] **TC03:** Login thất bại với empty username/password → verify validation message
- [ ] **TC04:** Logout thành công → verify redirect về login page

#### 🛍️ Module Product/Search (3-4 test cases)
- [ ] **TC05:** Search sản phẩm với keyword hợp lệ → verify kết quả
- [ ] **TC06:** Search sản phẩm không tồn tại → verify "no results" message
- [ ] **TC07:** Filter sản phẩm theo category
- [ ] **TC08:** Xem chi tiết sản phẩm → verify đủ thông tin (name, price, description)

#### 🛒 Module Cart (3-4 test cases)
- [ ] **TC09:** Thêm sản phẩm vào giỏ hàng → verify số lượng trong cart
- [ ] **TC10:** Thêm nhiều sản phẩm vào giỏ → verify total price
- [ ] **TC11:** Xóa sản phẩm khỏi giỏ hàng → verify cart trống
- [ ] **TC12:** Update số lượng sản phẩm trong giỏ → verify price cập nhật

---

### 📚 Tuần 11: Viết Test Cases Thực Tế (Phần 2) + Nâng Cấp Framework

#### 👤 Module User Account (3-4 test cases)
- [ ] **TC13:** Đăng ký tài khoản mới với thông tin hợp lệ
- [ ] **TC14:** Đăng ký với email đã tồn tại → verify error message
- [ ] **TC15:** Cập nhật thông tin profile → verify saved thành công

#### 🧾 Module Checkout (2-3 test cases, optional)
- [ ] **TC16:** Checkout thành công (nếu website có demo checkout)
- [ ] **TC17:** Verify order summary trước khi confirm

#### 🔨 Nâng Cấp Framework
- [ ] Đọc test data từ **file Excel** dùng Apache POI (không hardcode data trong code)
  - [ ] Thêm dependency Apache POI vào pom.xml
  - [ ] Viết utility class `ExcelUtils.java`
  - [ ] Refactor login test dùng data từ Excel
- [ ] Đọc config từ **file Properties** (URL, browser, timeout)
  - [ ] Tạo `config.properties`
  - [ ] Viết `ConfigReader.java` để đọc file
- [ ] Implement **Screenshot on Failure**
  - [ ] Implement `ITestListener` của TestNG
  - [ ] Chụp ảnh màn hình khi test fail, lưu vào folder `screenshots/`
- [ ] Viết **Log** bằng Log4j hoặc SLF4J (optional nhưng professional)

#### ✅ Kiểm Tra Chất Lượng Code
- [ ] Review lại tất cả test cases — có đủ `Assert` để verify không?
- [ ] Đảm bảo mỗi test case **độc lập** (không phụ thuộc nhau)
- [ ] Đảm bảo test có thể chạy lại nhiều lần (idempotent)
- [ ] Xóa `Thread.sleep()` cứng, thay bằng Explicit Wait
- [ ] Đặt tên method, class, variable rõ ràng và nhất quán

---

### 📚 Tuần 12: Hoàn Thiện Project + Appium Cơ Bản

#### 📱 Appium Cơ Bản (Nếu cần/muốn test Mobile)

> 💡 **Nên học Appium nếu:** CV của bạn target vào công ty có app mobile, hoặc JD yêu cầu mobile testing.

**Setup Appium**
- [ ] Cài **Appium Server** (bản desktop hoặc CLI)
- [ ] Cài **Android Studio** + cấu hình Android SDK
- [ ] Tạo **Android Emulator** hoặc dùng device thật
- [ ] Cài **Appium Inspector** để inspect element trên mobile
- [ ] Chạy được Appium Server, connect với Emulator

**Appium Cơ Bản**
- [ ] Hiểu Desired Capabilities — cách khai báo device, app, platform
- [ ] Tạo `AppiumDriver` thay vì `ChromeDriver`
- [ ] Locate element mobile: `By.id()`, `By.xpath()`, `By.accessibilityId()`
- [ ] Thao tác cơ bản: tap, swipe, long press
- [ ] Viết được test case đơn giản trên app demo (dùng app APK mẫu)
- [ ] Thực hành: Download APK mẫu từ GitHub, viết test login

**Nếu không học Appium:**
- [ ] Thay thế bằng học thêm **API Testing cơ bản với RestAssured** (cũng rất có giá trị!)

#### 🏁 Hoàn Thiện Project
- [ ] Chạy toàn bộ 15-20 test cases — tất cả phải PASS
- [ ] Chạy được bằng `testng.xml` với đầy đủ test suite
- [ ] Generate được **HTML Report** sau khi chạy
- [ ] Viết **README.md** hoàn chỉnh (xem checklist bên dưới)
- [ ] Push toàn bộ code lên GitHub
- [ ] Tạo **Release** hoặc tag version `v1.0`

#### 📝 README.md Checklist
- [ ] Tiêu đề project và mô tả ngắn
- [ ] **Tech Stack:** Java, Selenium, TestNG, Maven, Page Object Model
- [ ] **Prerequisites:** JDK version, Chrome version, Maven version
- [ ] **How to Run:** Hướng dẫn clone và chạy test từng bước
- [ ] **Project Structure:** Mô tả các folder
- [ ] **Test Cases:** Danh sách các test case có trong project
- [ ] **Screenshots:** Thêm vài ảnh chụp màn hình report đẹp
- [ ] Badge CI/CD (optional nhưng pro)

---

### 📖 Tài Nguyên Học Tháng 3

| Loại | Tên | Link | Ghi chú |
|------|-----|------|---------|
| Thực hành | Automation Exercise | [automationexercise.com](https://automationexercise.com) | Website tốt nhất để làm project |
| Video | Git & GitHub for Beginners | YouTube - Traversy Media | Ngắn, đủ dùng |
| Video | Appium Tutorial | YouTube - Naveen AutomationLabs | Playlist Appium rất tốt |
| Docs | Appium Documentation | [appium.io/docs](https://appium.io/docs/en/2.0/) | Tài liệu chính thức |
| Tool | Apache POI | Maven Repository | Đọc Excel |
| Mẫu README | Awesome README | GitHub | Tìm "awesome-readme" trên GitHub |
| CI/CD | GitHub Actions | GitHub Docs | Optional: tự động chạy test khi push code |

---

### 🏆 Milestone Cuối Tháng 3

> ✅ **Bạn đã hoàn thành lộ trình khi:**

- [ ] Project có **ít nhất 15-20 test cases** chạy được, có assert đầy đủ
- [ ] Code được tổ chức theo **Page Object Model** đúng chuẩn
- [ ] Có thể **giải thích** từng dòng code bạn viết ra (không copy-paste mù quáng)
- [ ] Project đã **public trên GitHub** với README đẹp
- [ ] Có **HTML Report** với kết quả test rõ ràng
- [ ] Chạy được **15 test trong vòng dưới 5 phút**
- [ ] (Bonus) Có thêm Appium hoặc API testing
- [ ] **Sẵn sàng demo project trong vòng 15 phút cho interviewer** ✨

---

## 💡 Tips Và Lưu Ý Quan Trọng

### 🔥 Tips Học Hiệu Quả

#### ⏰ Về Thời Gian
- [ ] Học **đều đặn mỗi ngày** (1-2 tiếng) tốt hơn nhồi nhét cuối tuần
- [ ] Dùng kỹ thuật **Pomodoro**: 25 phút học → 5 phút nghỉ
- [ ] Đặt reminder hàng ngày lúc cùng một giờ
- [ ] Cuối mỗi tuần: dành 30 phút **ôn lại** những gì đã học

#### 💻 Về Thực Hành
- [ ] **Code nhiều hơn đọc** — đọc 1 tiếng, code 2 tiếng
- [ ] Khi gặp lỗi, hãy tự debug ít nhất **15-20 phút** trước khi Google
- [ ] Đọc **error message** cẩn thận — 80% lỗi bắt đầu từ việc không đọc error message
- [ ] Giữ lại code cũ trong Git — để sau nhìn lại thấy mình tiến bộ bao nhiêu 😊
- [ ] **Đừng copy-paste** từ tutorial mà không hiểu — tự gõ lại để nhớ lâu hơn

#### 🤝 Về Cộng Đồng
- [ ] Tham gia group **Vietnam Testing Community** trên Facebook
- [ ] Follow các kênh: **Naveen AutomationLabs**, **Automation Step by Step** trên YouTube
- [ ] Đăng câu hỏi trên **Stack Overflow** khi bí (nhưng search trước!)
- [ ] Tìm **study buddy** — học cùng nhau tiến bộ nhanh hơn nhiều

---

### ⚠️ Những Lỗi Thường Gặp Cần Tránh

#### ❌ Sai Lầm Phổ Biến

**Về Code:**
- [ ] ⚠️ **KHÔNG** dùng `Thread.sleep()` cố định — dùng Explicit Wait
- [ ] ⚠️ **KHÔNG** dùng XPath tuyệt đối (`/html/body/div[1]/...`) — rất fragile
- [ ] ⚠️ **KHÔNG** hardcode URL, username, password vào test code
- [ ] ⚠️ **KHÔNG** để test phụ thuộc nhau (test B phải chạy sau test A)
- [ ] ⚠️ **KHÔNG** bỏ qua `driver.quit()` — gây memory leak
- [ ] ⚠️ **KHÔNG** ignore test fail mà không điều tra nguyên nhân

**Về Học:**
- [ ] ⚠️ **KHÔNG** học quá nhiều thứ cùng lúc — focus vào lộ trình
- [ ] ⚠️ **KHÔNG** skip phần Java — nền tảng yếu sẽ khó khăn về sau
- [ ] ⚠️ **KHÔNG** chỉ xem video mà không thực hành theo
- [ ] ⚠️ **KHÔNG** so sánh tiến độ của mình với người khác quá nhiều

---

### 🎯 Kỳ Vọng Thực Tế

> Hãy đọc phần này để không bị nản lòng nhé!

| Tuần | Cảm giác thông thường | Giải pháp |
|------|----------------------|-----------|
| 1-2 | Hứng khởi, mọi thứ có vẻ dễ | Tận dụng momentum này! |
| 3-4 | Bắt đầu thấy khó, nhiều lỗi | Bình thường! Mọi người đều vậy |
| 5-6 | Có thể bị "dumb" — quên những gì đã học | Ôn lại + thực hành nhiều hơn |
| 7-8 | Thấy mọi thứ kết nối lại với nhau | 🎉 Đây là lúc bạn "click" rồi! |
| 9-12 | Tự tin hơn, bắt đầu thấy mình "biết" | Giữ vững, sắp về đích! |

---

### 📊 Tracking Tiến Độ

> Copy bảng này vào Notion/Google Sheet để track hàng tuần!

| Tuần | Nội dung | % Hoàn thành | Ghi chú |
|------|----------|--------------|---------|
| 1 | Setup + Java Basics | ___% | |
| 2 | Java OOP + Loops | ___% | |
| 3 | Java Class + Exception | ___% | |
| 4 | Selenium WebDriver Basics | ___% | |
| 5 | Locators Advanced | ___% | |
| 6 | Complex Elements | ___% | |
| 7 | TestNG | ___% | |
| 8 | Page Object Model | ___% | |
| 9 | Git + GitHub + Project Planning | ___% | |
| 10 | Test Cases Part 1 | ___% | |
| 11 | Test Cases Part 2 + Framework Upgrade | ___% | |
| 12 | Final Project + Appium | ___% | |

---

### 🚀 Sau 3 Tháng — Bước Tiếp Theo

Khi hoàn thành lộ trình, bạn có thể tiếp tục với:

- [ ] **CI/CD:** Tích hợp test với Jenkins hoặc GitHub Actions
- [ ] **API Testing:** RestAssured để test REST API
- [ ] **BDD:** Cucumber + Gherkin (viết test theo ngôn ngữ tự nhiên)
- [ ] **Docker:** Chạy test trong container
- [ ] **Allure Reports:** Report đẹp hơn Extent Reports
- [ ] **Cloud Testing:** BrowserStack, Sauce Labs (test trên nhiều browser/device)
- [ ] **Performance Testing:** JMeter cơ bản

---

## 🎉 Lời Kết

> **Nhớ nhé:** Mỗi Senior Automation Tester đều từng là người không biết gì về code. Sự khác biệt duy nhất là họ **không bỏ cuộc**.

Khi bạn muốn nản lòng, hãy nhớ:
- 🌱 **Tuần 1:** "Sao cái vòng lặp này cứ lỗi mãi thế?"
- 🌿 **Tháng 1:** "Ồ, mình đã tự động hóa được màn hình login rồi!"
- 🌳 **Tháng 3:** "Mình có portfolio automation framework riêng trên GitHub rồi!"

**Chúc bạn học vui và sớm "lên level" thành Automation Tester nhé!** 💪

---

*📅 Tạo ngày: ___/___/2025 | Ngày bắt đầu: ___/___/2025 | Mục tiêu hoàn thành: ___/___/2025*

*⭐ Nếu lộ trình này hữu ích, hãy chia sẻ cho bạn bè manual tester khác nhé!*