Note
Sinh viên thực hiện: Trần Việt Anh
MSSV: BCS230111
Lớp: 23CS-GM
Dự án tập trung vào các bài tập và ứng dụng thực tế về kiểm thử phần mềm, bao gồm kiểm thử đơn vị, kiểm thử tĩnh, và kiểm thử tự động End-to-End.
- Bài 1: Nguyên lí của Kiểm Thử
- Bài 2: Quy Trình Kiểm Thử - Unit Test
- Bài 3: Kiểm Thử Tự Động - Cypress
Mục tiêu: Hiểu rõ các nguyên lí cơ bản trong kiểm thử phần mềm thông qua bài tập tương tác.
| Thông tin | Chi tiết |
|---|---|
| Đường dẫn bài tập | Can't Unsee |
| Số lần thực hiện | 3 |
| Ngày thực hiện | 05/01/2026 |
1. countExcellentStudents
- Đếm sinh viên xuất sắc
- Đếm số sinh viên có điểm ≥ 8.0
- Chỉ xử lý các giá trị hợp lệ trong khoảng [0, 10]
- Bỏ qua giá trị trống
(null)hoặc ngoài phạm vi
2. calculateValidAverage
- Tính điểm trung bình
- Tính trung bình của các điểm hợp lệ trong [0, 10]
- Bỏ qua giá trị trống
(null)hoặc không hợp lệ - Trả về 0 nếu không có điểm nào hợp lệ
| Công Nghệ | Phiên Bản | Mô Tả |
|---|---|---|
| Java | 8+ | Ngôn ngữ lập trình chính |
| Maven | 3.6+ | Công cụ quản lý dự án và phụ thuộc |
| JUnit | 5 | Framework kiểm thử đơn vị |
- Java Development Kit (JDK) phiên bản 8 trở lên
- Maven phiên bản 3.6 trở lên
1. Cài Đặt Java JDK
2. Cài Đặt Maven
Cách 1: Cài đặt thủ công (tất cả hệ điều hành)
- Tải từ https://maven.apache.org/
- Giải nén và lưu vào thư mục yêu thích
- Thiết lập biến
MAVEN_HOME - Thêm
%MAVEN_HOME%\bin(Windows) hoặc$MAVEN_HOME/bin(Linux/Mac) vàoPATH
Cách 2: Sử dụng Chocolatey (Windows)
winget install -e --id Chocolatey.Chocolatey
choco install maven3. Kiểm Tra Cài Đặt
java -version
mvn -versionTải dự án
git clone <đường-dẫn-repo>
cd unit-testBiên Dịch Dự Án
mvn clean compileChạy Tất Cả Ca Kiểm Thử
mvn testChạy Kiểm Thử Cụ Thể
mvn test -Dtest=StudentAnalyzerTest#testCountExcellentStudents_normalCaseXem Kết Quả Kiểm Thử
Báo cáo chi tiết được lưu tại: unit-test/target/surefire-reports/
| File | Mô Tả |
|---|---|
TEST-StudentAnalyzerTest.xml |
Báo cáo XML |
StudentAnalyzerTest.txt |
Báo cáo text |
Dự án có 26 ca kiểm thử tối ưu chia thành các nhóm:
| Nhóm Kiểm Thử | Số Lượng | Mô Tả |
|---|---|---|
| Kiểm thử cơ bản | 13 | Kiểm thử null, rỗng, all valid/invalid, có null elements |
| Kiểm thử giá trị biên | 7 | Kiểm thử ranh giới (8.0, 10.0) với precision cao |
| Kiểm thử phân vùng tương đương | 6 | Phân chia các vùng giá trị điển hình |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả |
|---|---|---|
testCountExcellentStudents_nullList |
null | 0 |
testCountExcellentStudents_emptyList |
[] | 0 |
testCountExcellentStudents_allExcellent |
[8.0, 9.5, 10.0] | 3 |
testCountExcellentStudents_noneExcellent |
[5.0, 6.0, 7.0] | 0 |
testCountExcellentStudents_mixedWithNull |
[8.5, null, 9.0, 7.0] | 2 |
testCountExcellentStudents_allNulls |
[null, null, null] | 0 |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả | Mục Đích |
|---|---|---|---|
testCountExcellentStudents_boundary_lowerLimit |
[7.9, 7.99, 8.0] | 1 | Kiểm tra cận dưới 8.0 |
testCountExcellentStudents_boundary_upperLimit |
[10.0, 10.0001, 10.01] | 1 | Kiểm tra cận trên 10.0 |
testCountExcellentStudents_boundary_precision |
[10.00001, 10.0000001] | 0 | Kiểm tra sai số precision |
| Tên Ca Kiểm Thử | Vùng | Dữ Liệu | Kết Quả |
|---|---|---|---|
testCountExcellentStudents_equivalence_lowExcellent |
[8.0-10.0] | [8.0] | 1 |
testCountExcellentStudents_equivalence_midExcellent |
[8.0-10.0] | [9.0] | 1 |
testCountExcellentStudents_equivalence_highExcellent |
[8.0-10.0] | [10.0] | 1 |
testCountExcellentStudents_equivalence_nonExcellent |
[0.0-7.9] | [0.0, 5.0, 7.9] | 0 |
testCountExcellentStudents_equivalence_invalid |
<0 hoặc >10 | [-5.0, 12.5] | 0 |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả |
|---|---|---|
testCalculateValidAverage_nullList |
null | 0.0 |
testCalculateValidAverage_emptyList |
[] | 0.0 |
testCalculateValidAverage_allValid |
[0.0, 5.0, 10.0] | 5.0 |
testCalculateValidAverage_someValid |
[5.0, -1.0, 10.0, 11.5] | 7.5 |
testCalculateValidAverage_allInvalid |
[-5.0, 11.0, 20.0] | 0.0 |
testCalculateValidAverage_withNulls |
[null, 6.0, null, 8.0] | 7.0 |
testCalculateValidAverage_allNulls |
[null, null, null] | 0.0 |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả | Mục Đích |
|---|---|---|---|
testCalculateValidAverage_boundary_exactBounds |
[0.0, 10.0] | 5.0 | Kiểm tra đúng ranh giới |
testCalculateValidAverage_boundary_outsideBounds |
[-0.01, 0.0, 10.0, 10.01] | 5.0 | Loại trừ ngoài ranh giới |
testCalculateValidAverage_boundary_precision |
[5.0, 10.0001, 10.0000001] | 5.0 | Phát hiện sai số |
testCalculateValidAverage_boundary_mixedPrecision |
[9.9999, 10.0, 10.0001] | 9.99995 | Kiểm tra tổ hợp precision |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả |
|---|---|---|
testCalculateValidAverage_equivalence_mixedScores |
[9.0, 8.5, 7.0, 11.0, -1.0] | 8.17 |
Kết quả: 26 tests đã được triển khai thành công, bao gồm kiểm thử cơ bản, giá trị biên, và phân vùng tương đương.
Mutation Testing:
- Thay đổi
<= 10.0→<= 10.0000001: 1 test FAILtestCalculateValidAverage_boundary_precisionphát hiện lỗi
- Thay đổi
>= 8.0→>= 7.5: 1 test FAILtestCountExcellentStudents_boundary_lowerLimitphát hiện lỗi
Coverage: 3 kỹ thuật kiểm thử - Boundary Value Analysis, Equivalence Partitioning, Decision Table Testing
| Tên Ca Kiểm Thử | Dữ Liệu Thử Nghiệm | Mô Tả |
|---|---|---|
testCountExcellentStudents_equivalence_lowNonExcellent |
0.0 | Cận dưới vùng không xuất sắc |
testCountExcellentStudents_equivalence_midNonExcellent |
5.0 | Giữa vùng không xuất sắc |
testCountExcellentStudents_equivalence_justBelowExcellent |
7.9 | Gần cận trên vùng không xuất sắc |
Cho countExcellentStudents() - Vùng Không Hợp Lệ:
| Tên Ca Kiểm Thử | Dữ Liệu Thử Nghiệm | Mô Tả |
|---|---|---|
testCountExcellentStudents_equivalence_negativeScores |
-5.0 | Điểm âm |
testCountExcellentStudents_equivalence_overScores |
12.5 | Điểm vượt quá 10.0 |
Cho calculateValidAverage() - Các Vùng:
| Tên Ca Kiểm Thử | Mô Tả |
|---|---|
testCalculateValidAverage_equivalence_allValid |
Tất cả điểm hợp lệ (5.0, 7.5, 8.0) |
testCalculateValidAverage_equivalence_mixedValid |
Hỗn hợp hợp lệ và không hợp lệ |
testCalculateValidAverage_equivalence_allInvalid |
Tất cả không hợp lệ (-1.0, 11.0, -5.0) |
testCalculateValidAverage_equivalence_empty |
Danh sách rỗng |
testCalculateValidAverage_equivalence_null |
Danh sách null |
| Tên Ca Kiểm Thử | Vùng | Dữ Liệu | Kết Quả |
|---|---|---|---|
testCountExcellentStudents_equivalence_lowExcellent |
[8.0-10.0] | [8.0] | 1 |
testCountExcellentStudents_equivalence_midExcellent |
[8.0-10.0] | [9.0] | 1 |
testCountExcellentStudents_equivalence_highExcellent |
[8.0-10.0] | [10.0] | 1 |
testCountExcellentStudents_equivalence_nonExcellent |
[0.0-7.9] | [0.0, 5.0, 7.9] | 0 |
testCountExcellentStudents_equivalence_invalid |
<0 hoặc >10 | [-5.0, 12.5] | 0 |
| Tên Ca Kiểm Thử | Dữ Liệu | Kết Quả |
|---|---|---|
testCalculateValidAverage_nullList |
null | 0.0 |
testCalculateValidAverage_emptyList |
[] | 0.0 |
testCalculateValidAverage_allValid |
[0.0, 5.0, 10.0] | 5.0 |
testCalculateValidAverage_someValid |
[5.0, -1.0, 10.0, 11.5] | 7.5 |
testCalculateValidAverage_allInvalid |
[-5.0, 11.0, 20.0] | 0.0 |
testCalculateValidAverage_withNulls |
[null, 6.0, null, 8.0] | 7.0 |
testCalculateValidAverage_allNulls |
[null, null, null] | 0.0 |
Mục đích: Phát hiện lỗi khi thay đổi giá trị biên với sai số cực nhỏ (0.0001 đến 0.00000001)
| Tên Ca Kiểm Thử | Dữ Liệu Thử Nghiệm | Mô Tả |
|---|---|---|
testCountExcellentStudents_boundary_10_000001 |
10.000001 | Vượt quá 10.0 (sai số |
testCountExcellentStudents_boundary_10_0001 |
10.0001 | Vượt quá 10.0 (sai số |
testCountExcellentStudents_boundary_10_00001 |
10.00001 | Vượt quá 10.0 (sai số |
testCountExcellentStudents_boundary_10_0000001 |
10.0000001 | Vượt quá 10.0 (sai số |
testCalculateValidAverage_boundary_10_000001 |
(5.0, 10.000001) | TB = 5.0 (bỏ 10.000001) |
testCalculateValidAverage_boundary_10_0001 |
(5.0, 10.0001) | TB = 5.0 (bỏ 10.0001) |
testCalculateValidAverage_boundary_10_00001 |
(5.0, 10.00001) | TB = 5.0 (bỏ 10.00001) |
testCalculateValidAverage_boundary_10_0000001 |
(5.0, 10.0000001) | TB = 5.0 (bỏ 10.0000001) |
testCalculateValidAverage_boundary_10_00000001 |
(5.0, 10.00000001) | TB = 5.0 (bỏ 10.00000001) |
testCalculateValidAverage_boundary_exactlyMax |
(10.0, 10.000001) | TB = 10.0 (chỉ tính 10.0) |
testCalculateValidAverage_boundary_preciseBoundary |
(9.9999, 10.0, 10.0001) | TB ≈ 9.99995 (bỏ 10.0001) |
Test Suite hiện tại (57 test cases):
- Phát hiện lỗi khi thay đổi giá trị ranh giới lớn (8.0 → 7.5: 1 test fail)
- Phát hiện lỗi với giá trị biên nhỏ (10.0 → 10.0000001: 2 tests fail)
-
testCalculateValidAverage_boundary_10_0000001: Expected 5.0 → Actual 7.50000005 -
testCalculateValidAverage_boundary_10_00000001: Expected 5.0 → Actual 7.500000005 - Kiểm thử đầy đủ các trường hợp biên với sai số từ
$10^{-4}$ đến$10^{-8}$ - Kiểm thử giá trị đặc biệt (null, trống, null elements)
- Sử dụng 3 kỹ thuật kiểm thử: Boundary Value Analysis, Equivalence Partitioning, Decision Table Testing
Kết quả thử nghiệm mutation:
- Thay đổi
<= 10.0thành<= 10.0000001: 2 tests fail → Test suite phát hiện được lỗi ✅ - Thay đổi
>= 8.0thành>= 7.5: 1 test fail → Test suite phát hiện được lỗi ✅
Kiểm thử tự động End-to-End cho ứng dụng web sử dụng Cypress framework.
- Node.js phiên bản 14+
- Một trình soạn thảo hỗ trợ (VS Code, WebStorm, v.v.)
1. Tạo Thư Mục Dự Án
mkdir cypress-exercise
cd cypress-exercise
npm init -y2. Cài Đặt Cypress
npm install cypress --save-dev3. Khởi Động Cypress
npx cypress openMục tiêu: Xác minh chức năng đăng nhập với thông tin hợp lệ
Các bước thực hiện:
- Truy cập https://www.saucedemo.com
- Nhập tên đăng nhập:
standard_user - Nhập mật khẩu:
secret_sauce - Click nút "Login"
- Xác minh: URL chứa
/inventory.html
Mục tiêu: Kiểm tra thông báo lỗi khi đăng nhập sai
Các bước thực hiện:
- Truy cập https://www.saucedemo.com
- Nhập tên đăng nhập:
invalid_user - Nhập mật khẩu:
wrong_password - Click nút "Login"
- Xác minh: Hiển thị lỗi "Username and password do not match"
Mục tiêu: Kiểm tra chức năng thêm sản phẩm vào giỏ
Các bước thực hiện:
- Đăng nhập:
standard_user/secret_sauce - Click "Add to cart" cho sản phẩm đầu tiên
- Xác minh: Badge giỏ hàng hiển thị số "1"
Mục tiêu: Kiểm tra bộ lọc và sắp xếp sản phẩm
Các bước thực hiện:
- Đăng nhập với thông tin hợp lệ
- Chọn bộ lọc "Price (low to high)"
- Xác minh: Sản phẩm đầu tiên có giá thấp nhất
Mục tiêu: Kiểm tra chức năng xóa sản phẩm trong giỏ
Các bước thực hiện:
- Đăng nhập:
standard_user/secret_sauce - Click "Add to cart" cho sản phẩm đầu tiên
- Xác minh: Badge giỏ hàng hiển thị số "1"
- Click "Remove"
- Xác minh: Badge giỏ hàng biến mất
Mục tiêu: Kiểm thử luồng thanh toán từ đầu đến cuối
Các bước thực hiện:
- Đăng nhập:
standard_user/secret_sauce - Thêm sản phẩm đầu tiên vào giỏ
- Click vào icon giỏ hàng
- Click "Checkout"
- Điền thông tin:
- First Name:
John - Last Name:
Doe - Zip:
12345
- First Name:
- Click "Continue"
- Xác minh: URL chứa
/checkout-step-two.html
- Làm quen với công cụ Apache JMeter
- Thực hiện kiểm thử hiệu năng website
- Phân tích các chỉ số hiệu năng cơ bản
- Đường dẫn: https://vnexpress.net/
- Loại đối tượng: Website cung cấp thông tin
- Công cụ: Apache JMeter 5.x
- Hệ điều hành: Windows
- Kết nối mạng: Internet cá nhân
- Số lượng người dùng: 10
- Số vòng lặp: 5
- Hành vi: Gửi HTTP GET đến trang chủ
Kết quả (từ summary.csv):
- Trung bình: 44 ms (tối thiểu 16, tối đa 96)
- Tỷ lệ lỗi: 0.00%
- Thông lượng: 10.56 yêu cầu/giây (req/s)
- Băng thông (BW): Nhận 3097.87 KB/s, Gửi 1.14 KB/s
- Số lượng người dùng: 50
- Ramp-up Period: 30 giây
- Hành vi: Truy cập trang chủ và một trang con
Kết quả (tổng hợp từ summary.csv cho "HTTP Request Empty 2" + "HTTP Request Da Bong"):
- Trung bình: ~3770 ms (tối thiểu 22, tối đa 13277)
- Tỷ lệ lỗi: ~56.10%
- Thông lượng: ~3.57 yêu cầu/giây (req/s)
- Băng thông (BW): Nhận ~642.52 KB/s, Gửi ~0.33 KB/s
- Số lượng người dùng: 20
- Thời gian chạy: 60 giây
- Hành vi: Truy cập 2 trang con khác nhau
Kết quả (tổng hợp từ summary.csv cho "HTTP Request Zalo" + "HTTP Request Anti Scam"):
- Trung bình: ~95 ms (tối thiểu 1, tối đa 13864)
- Tỷ lệ lỗi: ~86.40%
- Thông lượng: ~156.41 yêu cầu/giây (req/s)
- Băng thông (BW): Nhận ~5435.21 KB/s, Gửi ~25.49 KB/s
| Nhãn | Số mẫu | TB (ms) | Tối thiểu | Tối đa | Độ lệch chuẩn | Tỷ lệ lỗi | Thông lượng (yêu cầu/giây) |
|---|---|---|---|---|---|---|---|
| HTTP Request Empty | 50 | 44 | 16 | 96 | 19.19 | 0% | 10.56 |
| HTTP Request Empty 2 | 32 | 4819 | 52 | 13277 | 4496.35 | 71.88% | 1.71 |
| HTTP Request Zalo | 1467 | 152 | 2 | 13855 | 1339.26 | 86.30% | 78.53 |
| HTTP Request Da Bong | 9 | 34 | 22 | 62 | 10.80 | 0% | 1.86 |
| HTTP Request Anti Scam | 1450 | 38 | 1 | 13864 | 629.76 | 86.48% | 77.88 |
| TỔNG | 3008 | 144 | 1 | 13864 | 1232.57 | 84.54% | 160.97 |
- Tổng hợp kết quả từ summary.csv: Trung bình 144 ms; Tỷ lệ lỗi 84.54%; Thông lượng 160.97 yêu cầu/giây (req/s).
- TG1 (cơ bản): ổn định, không lỗi; phản hồi thấp (44 ms), thông lượng 10.56 req/s.
- TG2 (tải nặng): phản hồi ~3.77 s, lỗi cao (~56%), thông lượng thấp (~3.57 req/s) → cần rà soát cấu hình/kịch bản.
- TG3 (tùy chỉnh): thông lượng rất cao (~156 req/s) nhưng lỗi rất lớn (~86%) → khả năng endpoint chặn/truy cập chưa hợp lệ.
Apache JMeter là công cụ hiệu quả để kiểm thử hiệu năng website. Qua bài thực hành này, sinh viên đã hiểu cách thiết kế kịch bản kiểm thử và phân tích kết quả kiểm thử hiệu năng.
© 2026 TranMC







