Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số và thương mại điện tử bùng nổ, lưu lượng truy cập web từ thiết bị di động đã chiếm hơn 60% tổng lưu lượng Internet toàn cầu. Người dùng ngày càng đòi hỏi trải nghiệm duyệt web trên smartphone phải mượt mà, chính xác và không có lỗi kỹ thuật. Tuy nhiên, việc phát triển các ứng dụng web tương thích trên nhiều kích thước màn hình và trình duyệt di động đặt ra thách thức lớn đối với công tác đảm bảo chất lượng (QA - Quality Assurance).

Đồ án tốt nghiệp chuyên ngành Công nghệ Thông tin tại Trường Đại học Quốc tế Hồng Bàng với đề tài "Ứng Dụng Selenium Trong Kiểm Thử Website Di Động" (thực hiện bởi sinh viên Trương Minh Trí và Nguyễn Cao Triều, dưới sự hướng dẫn của Thầy Nguyễn Minh Đế) tập trung giải quyết bài toán tự động hóa quy trình kiểm thử giao diện và chức năng cho các nền tảng web di động.

Vấn đề thực tiễn (Problem Statement)

Kiểm thử thủ công (Manual Testing) trên giao diện website di động thường bộc lộ nhiều điểm nghẽn:

  • Tốn kém thời gian và nhân lực: Việc lặp đi lặp lại các kịch bản kiểm thử hồi quy (Regression Testing) trên nhiều độ phân giải màn hình gây lãng phí hàng trăm giờ làm việc của kiểm thử viên.
  • Tỉ lệ sai sót do yếu tố con người: Khi thực thi hàng chục test case cho các biểu mẫu phức tạp (Đăng ký, Đăng nhập, Thanh toán), sự mệt mỏi có thể dẫn đến việc bỏ sót các lỗi biên (Boundary bugs).
  • Khó khăn trong mô phỏng hành vi di động: Thao tác kiểm tra responsive web trên desktop đòi hỏi công cụ giả lập chính xác User-Agent và kích thước khung nhìn (Viewport) di động.

Mục tiêu dự án

  1. Nghiên cứu toàn diện quy trình phát triển phần mềm (SDLC) và vòng đời kiểm thử phần mềm (STLC - Software Testing Life Cycle).
  2. Làm chủ kiến trúc, cơ chế hoạt động và bộ định vị phần tử (Locators) của Selenium WebDriver.
  3. Ứng dụng kỹ thuật phân vùng tương đương (Equivalence Partitioning) và phân tích giá trị biên (Boundary Value Analysis) để thiết kế bộ kịch bản kiểm thử (Test Cases) chuẩn mực.
  4. Xây dựng bộ mã kịch bản kiểm thử tự động (Automation Scripts) bằng ngôn ngữ Java kết hợp framework JUnit.
  5. Triển khai thực nghiệm trực tiếp trên hệ thống website thương mại điện tử Functional Food Store trên giao diện di động nhằm đánh giá hiệu năng và độ tin cậy.

Phạm vi và giới hạn

  • Phạm vi kiểm thử: Kiểm thử chức năng hộp đen (Black-box Functional Testing), kiểm thử hồi quy và kiểm thử giao diện đáp ứng (Mobile Responsive Web) trên các module trọng tâm: Đăng ký tài khoản, Đăng nhập, Quản lý thông tin cá nhân, Tìm kiếm sản phẩm, Giỏ hàng và Đặt hàng.
  • Giới hạn: Dự án tập trung vào Mobile Web trên trình duyệt di động/giả lập, không bao gồm kiểm thử chuyên sâu ứng dụng di động gốc (Native App) hay kiểm thử bảo mật nâng cao (Penetration Testing).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trong kiểm thử phần mềm, sự chuyển dịch từ kiểm thử thủ công sang tự động hóa là yếu tố sống còn để rút ngắn chu kỳ phát hành sản phẩm.

Tiêu chí Kiểm thử thủ công (Manual Testing) Kiểm thử tự động (Selenium Automation)
Tốc độ thực thi Chậm (30 - 60 giây/test case phức tạp) Cực nhanh (1 - 3 giây/test case)
Khả năng lặp lại Dễ nảy sinh sai sót do chủ quan Đảm bảo 100% tính nhất quán kịch bản
Chi phí dài hạn Tăng tuyến tính theo thời gian và quy mô Đầu tư ban đầu cao, chi phí vận hành giảm sâu
Kiểm thử hồi quy Tốn kém tài nguyên, khó bao phủ toàn bộ Tự động hóa hoàn toàn theo lịch trình
Độ phủ kiểm thử Bị giới hạn bởi năng suất con người Dễ dàng mở rộng cho hàng trăm kịch bản

Phân tích yêu cầu theo mô hình MoSCoW:

  • Must have: Tự động hóa luồng Đăng ký (với hơn 29 ca kiểm thử biên/tương đương), Đăng nhập, Thêm vào giỏ hàng, Đặt hàng.
  • Should have: Cơ chế chụp ảnh màn hình khi xuất hiện lỗi (Screen capture on failure), báo cáo trạng thái Pass/Fail rõ ràng qua JUnit Assertions.
  • Could have: Tích hợp kiểm thử đa trình duyệt (Chrome Mobile Emulation, Firefox Mobile).
  • Won't have: Kiểm thử hiệu năng chịu tải hàng triệu CCU (được tách thành giai đoạn kiểm thử tải chuyên biệt).

Thiết kế hệ thống

Kiến trúc giải pháp được xây dựng trên mô hình phân lớp chuẩn công nghiệp:

Ngăn xếp công nghệ (Technology Stack):

  • Ngôn ngữ lập trình: Java (JDK 11 / 17 LTS) - Hỗ trợ hướng đối tượng mạnh mẽ, đa luồng và đồng bộ hóa tốt.
  • Automation Core: Selenium WebDriver 4.x - Giao tiếp trực tiếp cấp hệ điều hành với trình duyệt, tốc độ phản hồi tối ưu.
  • Unit Testing Framework: JUnit 4 / JUnit 5 - Quản lý vòng đời kiểm thử thông qua các Annotation (@Test, @Before, @After, @BeforeClass, @AfterClass).
  • Trình duyệt & Giả lập: Google Chrome Mobile Emulation (chế độ Developer Tools mô phỏng Viewport iPhone/Android).
  • Hệ quản trị CSDL backend: MySQL / SQL Server hỗ trợ lưu trữ dữ liệu người dùng và đơn hàng.

Kỹ thuật xác định phần tử (Locators Strategy):

Để tương tác chính xác với DOM (Document Object Model) của giao diện web di động, dự án áp dụng chiến lược định vị ưu tiên:

  1. By.id() / By.name(): Định danh trực tiếp, tốc độ truy xuất nhanh nhất.
  2. By.cssSelector(): Linh hoạt trong việc bắt các lớp giao diện CSS responsive.
  3. By.xpath() tương đối: Giải pháp mạnh mẽ để truy xuất các phần tử động phức tạp bằng cú pháp: $$\text{XPath} = \text{//tagname}[@attribute='value']$$

Implementation và kết quả

Quy trình phát triển kịch bản kiểm thử

Quá trình triển khai tuân thủ nghiêm ngặt 6 bước của Vòng đời kiểm thử phần mềm (STLC):

  1. Phân tích yêu cầu: Bóc tách tài liệu đặc tả chức năng và use case hệ thống.
  2. Lập kế hoạch kiểm thử (Test Plan): Xác định phạm vi, môi trường và tiêu chí dừng (Exit Criteria).
  3. Thiết kế kịch bản (Test Design): Ứng dụng kỹ thuật phân vùng tương đương và giá trị biên để bao phủ tối đa trường hợp lỗi.
  4. Thiết lập môi trường: Cấu hình Java SDK, Selenium Client JARs, ChromeDriver tương thích phiên bản.
  5. Thực thi kiểm thử: Chạy kịch bản tự động, ghi nhận log và đối soát kết quả mong đợi (Expected Result) với kết quả thực tế (Actual Result).
  6. Đóng chu trình kiểm thử: Tổng hợp báo cáo kiểm thử (Defect Report & Test Summary Report).
Project_Structure/

Minh họa mã nguồn tự động hóa (Code Implementation)

Dưới đây là đoạn mã Java JUnit triển khai kịch bản kiểm thử tự động cho chức năng Đăng ký tài khoản:

package tests;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class RegisterTestSuite {
    private WebDriver driver;
    private final String BASE_URL = "http://localhost:8080/FunctionalFoodStore";

    @Before
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "drivers/chromedriver.exe");
        
        // Cấu hình Chrome Mobile Emulation
        Map<String, String> mobileEmulation = new HashMap<>();
        mobileEmulation.put("deviceName", "Nexus 5");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);

        driver = new ChromeDriver(chromeOptions);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get(BASE_URL + "/register");
    }

    @Test
    public void testCase01_ValidPhoneNumberRegistration() {
        // TEST_01: Kiểm tra nhập số điện thoại hợp lệ
        WebElement phoneInput = driver.findElement(By.id("txtPhone"));
        phoneInput.clear();
        phoneInput.sendKeys("0912345678");

        WebElement registerBtn = driver.findElement(By.id("btnRegisterSubmit"));
        registerBtn.click();

        WebElement headerTitle = driver.findElement(By.xpath("//h2[contains(text(),'Cập nhật thông tin cá nhân')]"));
        assertTrue("Không chuyển hướng đến trang Cập nhật thông tin", headerTitle.isDisplayed());
    }

    @Test
    public void testCase26_PasswordLessThan8Characters() {
        // TEST_26: Kiểm tra mật khẩu < 8 ký tự (Phân tích giá trị biên)
        WebElement phoneInput = driver.findElement(By.id("txtPhone"));
        phoneInput.sendKeys("0987654321");
        driver.findElement(By.id("btnRegisterSubmit")).click();

        WebElement passInput = driver.findElement(By.id("txtPassword"));
        passInput.sendKeys("1234567"); // 7 ký tự
        driver.findElement(By.id("btnUpdateProfile")).click();

        WebElement errorMsg = driver.findElement(By.id("lblPasswordError"));
        assertEquals("Thông báo lỗi không đúng", "Mật khẩu cần ít nhất 8 kí tự", errorMsg.getText());
    }

    @After
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

Ma trận kiểm thử & Kết quả đạt được

Bộ kịch bản kiểm thử được áp dụng chi tiết cho module Đăng ký với 29 ca kiểm thử chuyên sâu:

Nhóm kiểm thử Kỹ thuật áp dụng Số lượng Test Cases Tỉ lệ Pass
Số điện thoại (SĐT) Biên (9, 10, 11 ký tự), Tương đương (chứa chữ, ký tự đặc biệt, khoảng trắng) 9 cases (TEST_01 - TEST_09) 100%
Họ và tên Biên (49, 50, 51 ký tự), Bỏ trống 5 cases (TEST_10 - TEST_14) 100%
Ngày sinh Biên ($T-1$, $T$, $T+1$ so với ngày hiện tại), Ký tự lạ 6 cases (TEST_15 - TEST_20) 100%
Mật khẩu Biên (7, 8, 16, 17 ký tự), Ký tự hợp lệ/không hợp lệ 7 cases (TEST_23 - TEST_29) 100%
Giới tính & Địa chỉ Phân vùng giá trị hợp lệ / Bỏ trống 2 cases (TEST_21 - TEST_22) 100%

Thống kê hiệu năng thực nghiệm:

  • Thời gian thực thi 29 kịch bản đăng ký:
    • Kiểm thử thủ công: $\approx 25 \text{ phút}$ (trung bình ~50 giây/case tính cả thời gian nhập liệu và đối chiếu).
    • Kiểm thử tự động với Selenium WebDriver: $\approx 58 \text{ giây}$ (khoảng 2.0 giây/case).
  • Tốc độ cải thiện: Nhanh hơn 25.8 lần so với thao tác thủ công.
  • Độ chính xác xác nhận kết quả (Assertion Accuracy): 100% không phát sinh sai số người dùng.

Đổi mới và đóng góp

Điểm cải tiến kỹ thuật nổi bật

  1. Mô phỏng chính xác giao diện di động trên trình duyệt: Bằng cách tích hợp mobileEmulation thông qua ChromeOptions, kịch bản tự động tái lập hoàn hảo môi trường di động mà không cần trang bị thiết bị phần cứng thật đắt đỏ.
  2. Ứng dụng bài bản lý thuyết thiết kế kiểm thử: Đồ án không viết mã ngẫu nhiên mà vận dụng chặt chẽ 2 kỹ thuật nền tảng của ISTQB là Phân vùng tương đươngPhân tích giá trị biên, giúp tối ưu hóa số lượng test case nhưng vẫn đạt độ bao phủ lỗi tối đa.
  3. Cơ chế Assertions đa dạng: Sử dụng linh hoạt các phương thức kiểm tra trong JUnit (assertTrue, assertEquals, assertNotNull, assertSame) giúp định vị chính xác vị trí phát sinh sai lệch giữa mã nguồn hệ thống và tài liệu đặc tả.

So sánh các giải pháp kiểm thử

Tiêu chí Selenium WebDriver (Đồ án áp dụng) Selenium IDE Cypress
Cơ chế hoạt động Điều khiển trực tiếp trình duyệt qua Driver Add-on ghi/phát (Record & Playback) Chạy trực tiếp bên trong vòng lặp trình duyệt
Hỗ trợ ngôn ngữ Đa ngôn ngữ (Java, C#, Python, Ruby...) Selenese (kịch bản nội bộ) JavaScript / TypeScript
Khả năng tùy biến Rất cao (Hỗ trợ cấu trúc rẽ nhánh, vòng lặp) Hạn chế, khó xử lý kịch bản phức tạp Rất cao cho Web SPA hiện đại
Kiểm thử Mobile Web Tốt thông qua Mobile Emulation/Appium Kém, không linh hoạt Giới hạn viewport
Độ ổn định kịch bản Cao khi sử dụng chiến lược Locator tốt Thấp, dễ gãy kịch bản khi UI đổi Cao với cơ chế tự động chờ (Auto-waiting)

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tiễn

  • Nền tảng E-commerce bán lẻ: Áp dụng cho các trang thương mại điện tử như Functional Food Store để tự động kiểm tra giỏ hàng, tính toán mã giảm giá và thanh toán trước mỗi đợt sale lớn.
  • Kiểm thử hồi quy tự động trong quy trình CI/CD: Kịch bản kiểm thử Selenium viết bằng Java có thể tích hợp trực tiếp vào pipeline của Jenkins, GitLab CI hoặc GitHub Actions để tự động kích hoạt mỗi khi lập trình viên tạo Pull Request.

Đánh giá hiệu quả kinh tế (Cost-Benefit Analysis & ROI)

Giả định một chu kỳ phát hành sản phẩm gồm 10 đợt cập nhật trong năm:

  • Chi phí Manual Testing: 10 đợt $\times$ 50 giờ test hồi quy $\times$ $15\text{ USD/giờ} = 7,500\text{ USD}$.
  • Chi phí Automation Testing: 80 giờ phát triển script ban đầu + 10 đợt $\times$ 2 giờ bảo trì script $= 100\text{ giờ} \times 15\text{ USD/giờ} = 1,500\text{ USD}$.
  • Hiệu quả đầu tư (ROI): Giảm 80% chi phí kiểm thử hồi quy sau năm đầu tiên triển khai.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Phụ thuộc vào tính ổn định của DOM: Khi cấu trúc HTML/CSS của website thay đổi lớn, các kịch bản XPath tương đối vẫn có nguy cơ bị gãy và cần bảo trì thủ công.
  • Giả lập môi trường: Phương pháp Chrome Mobile Emulation mô phỏng tốt về mặt hiển thị và kích thước màn hình, nhưng chưa tái hiện được hoàn toàn các giới hạn phần cứng thực tế (CPU di động, kết nối mạng 3G/4G chập chờn, cử chỉ cảm ứng đa điểm phức tạp).

Hướng phát triển trong tương lai

  • Mở rộng sang Appium: Tích hợp Appium framework để thực hiện kiểm thử tự động trên ứng dụng di động gốc (Native App) và Hybrid App chạy trên thiết bị thật Android/iOS.
  • Mô hình Page Object Model (POM): Tái cấu trúc toàn bộ mã nguồn kịch bản theo design pattern POM để tách biệt hoàn toàn giữa giao diện trang (Page Elements) và kịch bản nghiệp vụ (Test Actions), giúp tăng tính tái sử dụng và dễ bảo trì.
  • Tích hợp Selenium Grid: Triển khai kiểm thử song song phân tán trên nhiều node máy chủ nhằm rút ngắn thời gian thực thi toàn bộ test suite xuống dưới 10 giây.

Đối tượng hưởng lợi

  • Sinh viên chuyên ngành CNTT / Kỹ thuật phần mềm: Tiếp cận tài liệu hướng dẫn thực hành kiểm thử tự động bài bản từ lý thuyết đặc tả đến viết mã JUnit hoàn chỉnh.
  • Kỹ sư kiểm thử (QC / Automation Testers): Sử dụng bộ 29 test case mẫu cho form đăng ký làm chuẩn tham chiếu để kiểm tra các hệ thống web thực tế.
  • Doanh nghiệp & Đội ngũ phát triển: Nâng cao chất lượng sản phẩm website, phát hiện lỗi sớm ở giai đoạn phát triển, bảo vệ trải nghiệm người dùng cuối.

Câu hỏi thường gặp

1. Cần chuẩn bị những công cụ gì để triển khai chạy kịch bản Selenium trong đồ án?

Môi trường tối thiểu bao gồm: Java Development Kit (JDK 11 trở lên), Eclipse IDE hoặc IntelliJ IDEA, ChromeDriver (trùng phiên bản với trình duyệt Google Chrome cài trên máy) và thư viện Selenium Java Client (JARs) hoặc cấu hình dependencies thông qua Maven pom.xml.

2. Làm thế nào để Selenium tương tác được với giao diện mobile web?

Thông qua việc thiết lập thuộc tính mobileEmulation trong lớp ChromeOptions của ChromeDriver. Bạn có thể truyền tên thiết bị giả lập (ví dụ: "Nexus 5", "iPhone X") hoặc cấu hình thủ công chiều rộng (width), chiều cao (height) và chuỗi User-Agent di động.

3. Khi nào nên áp dụng kiểm thử tự động thay vì kiểm thử thủ công?

Nên áp dụng khi hệ thống đã ổn định về mặt luồng chức năng, cần thực hiện kiểm thử hồi quy lặp đi lặp lại nhiều lần, kiểm thử các form nhập liệu có số lượng kịch bản biên lớn, hoặc khi cần kiểm tra dữ liệu lớn (Data-driven Testing) mà sức người không đáp ứng kịp tiến độ.

4. Cách khắc phục khi XPath của phần tử trên trang web bị thay đổi?

Cần tuân thủ quy tắc viết XPath tương đối ngắn gọn dựa trên các thuộc tính cố định hoặc thuộc tính duy nhất (như id, name, custom data attribute như data-testid). Ngoài ra, việc áp dụng mô hình thiết kế Page Object Model (POM) sẽ giúp gom toàn bộ định nghĩa Locator về một nơi duy nhất để sửa đổi nhanh chóng.

5. Khả năng tích hợp kịch bản kiểm thử này vào quy trình CI/CD như thế nào?

Dự án có thể đóng gói kịch bản dưới dạng Maven Project (pom.xml). Trong file cấu hình CI/CD (như .gitlab-ci.yml hoặc Jenkinsfile), chỉ cần gọi lệnh mvn clean test, hệ thống sẽ tự động tải các dependencies, khởi chạy trình duyệt ở chế độ không đầu (Headless Chrome) và xuất kết quả báo cáo kiểm thử tự động.


Kết luận

Đề tài "Ứng Dụng Selenium Trong Kiểm Thử Website Di Động" đã giải quyết thành công bài toán tự động hóa kiểm thử giao diện và chức năng cho hệ thống thương mại điện tử trên nền tảng web di động. Bằng việc kết hợp chặt chẽ giữa lý thuyết kiểm thử phần mềm tiêu chuẩn (phân tích giá trị biên, phân vùng tương đương) và công nghệ Selenium WebDriver trên nền tảng Java/JUnit, đồ án đã chứng minh tính khả thi, độ tin cậy vượt trội và khả năng tiết kiệm thời gian lên đến 25 lần so với phương thức kiểm thử thủ công truyền thống.

Kết quả nghiên cứu này không chỉ là nền tảng học thuật vững chắc cho sinh viên trước khi gia nhập thị trường lao động CNTT, mà còn là tài liệu tham khảo thực tiễn giá trị cho các kỹ sư kiểm thử phần mềm đang tìm kiếm giải pháp nâng cao chất lượng sản phẩm số.