You are on page 1of 33

2ƯE

TRƯỜNG ĐẠI HỌC DUY TÂN


---------------------------

ĐỒ ÁN NHÓM
MÔN: Công Cụ Và Phương Pháp Thiết Kế Quản Lí (Phần Mềm)
Đề tài: “TÌM HIỂU VỀ CÔNG CỤ KIỂM THỬ TESTCOMPLETE.”

GVHD : Phạm Thị Minh Thương


LỚP : CS 434 G
SVTH :
1. Nguyễn Trần Khánh Vinh - 8473 2. Nguyễn Hữu Sỹ - 8462
3. Nguyễn Hoàng Phương - 2759 4. Lê Phú Quang - 3508
5. Nguyễn Xuân Chiến - 8450 6. Nguyễn Văn Thảo - 8829
7. Võ Trần Minh Hiếu - 2207
Đà Nẵng, ngày 13 tháng 9 năm 2023.

PHÂN CHIA CÔNG VIỆC GIỮA CÁC THÀNH VIÊN TRONG NHÓM:
% ĐÓNG
STT HỌ VÀ TÊN MSSV NỘI DUNG TÌM HIỂU
GÓP
1 Nguyễn Trần Khánh Vinh 8473 Chương 3 100%
2 Nguyễn Hoàng Phương 2759 Chương 4 100%
3 Nguyễn Hữu Sỹ 8462 Chương 1 100%
4 Lê Phú Quang 3508 Chương 1 100%
5 Võ Trần Minh Hiếu 2207 Chương 2 100%
6 Nguyễn Văn Thảo 8829 Chương 2 100%
7 Nguyễn Xuân Chiến 8450 Chương 3 100%
MỤC LỤC
A. GIỚI THIỆU ĐỀ TÀI.............................................................................................2
B. CƠ SỞ LÝ THUYẾT..............................................................................................3
1. LÝ THUYẾT VỀ KIỂM THỬ PHẦN MỀM....................................................3
1.1 Kiểm thử phần mềm là gì?............................................................................3
1.2 Phân loại kỹ thuật kiểm thử..........................................................................3
1.3 Cấp độ kiểm thử phần mềm..........................................................................4
1.4 Quy trình kiểm thử phần mềm.....................................................................5
2. LÝ THUYẾT VỀ KIỂM THỬ TỰ ĐỘNG........................................................6
2.1 Khái quát về kiểm thử phần mềm tự động..................................................6
2.2 Kiểm thử tự động là gì?.................................................................................6
2.3 Tại sao phải kiểm thử tự động......................................................................6
2.4 Nguyên tắc kiểm thử tự động........................................................................8
2.5 Quy trình kiểm thử tự động..........................................................................8
2.6 So sánh kiểm thử thủ công và kiểm thử tự động.........................................9
C. CƠ SỞ THỰC TIỄN.............................................................................................10
3. GIỚI THIỆU CHUNG VỀ PHẦN MỀM KIỂM THỬ TEST COMPLETE
..................................................................................................................................10
3.1 Giới thiệu về Test Complete........................................................................10
3.2 Lịch sử hình thành.......................................................................................10
3.3 Đặc điểm của Test Complete.......................................................................11
3.4 Ưu nhược điểm Test Complete...................................................................12
3.5 Cài đặt...........................................................................................................12
4. THỰC NGHIỆM TEST COMPLETE.............................................................13
4.1 Code website bán vé lễ hội...........................................................................13
4.2 Kiểm thử.......................................................................................................28
D.TÀI LIỆU THAM KHẢO.....................................................................................31
A. GIỚI THIỆU ĐỀ TÀI
Hiện nay, sự phát triển mạnh mẽ và biến đổi nhanh chóng của các xu hướng công nghệ
thông tin trên toàn cầu đã tạo ra cơ hội và thách thức đối với Việt Nam. Do đó, chú trọng và
khẩn trương triển khai các dự án và chương trình quốc gia để thúc đẩy việc ứng dụng hiệu
quả Công nghệ thông tin trong mọi khía cạnh của cuộc sống kinh tế, chính trị, và xã hội.
Việc này đặc biệt đòi hỏi sự phát triển trong lĩnh vực kiểm thử phần mềm, đặc biệt là
kiểm thử tự động. Mặc dù khái niệm này không còn mới mẻ tại Việt Nam, nhưng vẫn chưa
phổ biến đầy đủ. Thực tế cho thấy số lượng đơn vị đào tạo chuyên nghiệp và các chuyên gia
trong lĩnh vực kiểm thử phần mềm còn hạn chế và không đáp ứng đủ nhu cầu của các dự án
doanh nghiệp.
Nếu so sánh với tiêu chuẩn quốc tế, tỷ lệ giữa các lập trình viên và người kiểm thử phần
mềm là 1:3 (tức mỗi 3 lập trình viên có 1 người kiểm thử), đôi khi thậm chí tỷ lệ này là 1:1
đối với các dự án cụ thể. Tuy nhiên, tại Việt Nam, tỷ lệ tuyển dụng người kiểm thử phần
mềm chỉ đạt khoảng 1,5. Mặc dù kiểm thử và đảm bảo chất lượng được coi là quan trọng
trong việc đạt được thành công cho các dự án phần mềm, nhưng không phải tất cả các công
ty đều có đủ kiến thức và điều kiện để thực hiện quy trình này.
Tuy nhiên, Việt Nam có những ưu điểm cạnh tranh như nguồn nhân lực giá rẻ với trình
độ kỹ thuật sẵn có, đầu tư vào phát triển hạ tầng nhanh chóng, môi trường đầu tư an toàn,
chất lượng dịch vụ xuất sắc và tỷ lệ nghị viên thấp. Điều này đặt Việt Nam trong tư cách một
đối tác tiềm năng và hấp dẫn trong ngành kiểm thử phần mềm.
Sau quá trình nghiên cứu, nhóm quyết định chọn đề tài "Tìm hiểu về công cụ Test
Complete" để thực hiện một báo cáo cuối khóa học. Chúng tôi mong đợi nhận được ý kiến,
đóng góp và ghi nhận từ giáo viên và bạn bè để hoàn thiện báo cáo của nhóm.
B. CƠ SỞ LÝ THUYẾT
1. LÝ THUYẾT VỀ KIỂM THỬ PHẦN MỀM
1.1 Kiểm thử phần mềm là gì?
Kiểm thử phần mềm là quá trình kiểm tra sản phẩm phần mềm. Đảm bảo sản phẩm không có
lỗi trước khi giao cho khách hàng. Nó bao gồm việc kiểm tra, phân tích, quan sát và đánh giá
các khía cạnh khác nhau của sản phẩm. Người kiểm thử phần mềm (Tester) sử dụng kết hợp
các công cụ thủ công (manual) và tự động (automation). Sau khi tiến hành kiểm thử, Tester
báo cáo kết quả cho team phát triển.
Mục đích cuối của quá trình kiểm thử phần mềm này là đảm bảo sản phẩm (phần mềm, ứng
dụng) được tạo ra theo đúng mong muốn của khách hàng và hoạt động hiệu quả. Giảm thiểu
tối đa các lỗi trên sản phẩm.
1.2 Phân loại kỹ thuật kiểm thử
Có nhiều phân loại kỹ thuật kiểm thử phần mềm khác nhau, tùy thuộc vào mục tiêu và
phương pháp sử dụng.
 Kiểm thử chức năng (Functional Testing):
- Kiểm thử Đen (Black Box Testing): Kiểm thử tập trung vào đầu vào và đầu ra của
phần mềm mà không quan tâm đến cấu trúc nội bộ. Người kiểm thử không cần biết về mã
nguồn.
- Kiểm thử Trắng (White Box Testing): Kiểm thử dựa trên kiến thức về cấu trúc nội bộ
của phần mềm. Người kiểm thử cần biết về mã nguồn để thiết lập các trường hợp kiểm thử.
 Kiểm thử phi chức năng (Non-Functional Testing):
- Kiểm thử Hiệu suất (Performance Testing): Đánh giá khả năng của phần mềm với tải
công việc và hiệu suất trong các điều kiện khác nhau, bao gồm kiểm thử tải, kiểm thử áp
suất, và kiểm thử thời gian thực.
- Kiểm thử Bảo mật (Security Testing): Kiểm tra để đảm bảo rằng phần mềm được bảo
vệ khỏi các mối đe dọa bảo mật, bao gồm kiểm thử xác thực, kiểm thử ủy quyền và kiểm thử
xâm nhập.
- Kiểm thử Tương tác (Usability Testing): Đánh giá khả năng sử dụng và trải nghiệm
người dùng của phần mềm, đảm bảo rằng nó thân thiện và dễ sử dụng.
- Kiểm thử Tích hợp (Integration Testing): Kiểm tra sự tương tác giữa các phần của
phần mềm để đảm bảo tính đúng đắn và liên kết chính xác.
 Kiểm thử quy trình (Process-Oriented Testing):
- Kiểm thử Đơn vị (Unit Testing): Kiểm tra từng đơn vị nhỏ nhất của mã nguồn,
thường được thực hiện bởi các nhà phát triển.
- Kiểm thử Hệ thống (System Testing): Kiểm tra toàn bộ hệ thống phần mềm trong môi
trường giống với môi trường thực tế.
- Kiểm thử Hợp nhất (Integration Testing): Kiểm tra tương tác giữa các phần tử của hệ
thống.
 Kiểm thử tự động (Automated Testing):
- Sử dụng công cụ và kịch bản kiểm thử tự động để thực hiện các bài kiểm tra. Loại kiểm
thử này giúp tiết kiệm thời gian và tăng tính nhất quán của kiểm thử.
 Kiểm thử hướng dữ liệu (Data-Driven Testing):
- Sử dụng dữ liệu đầu vào từ các nguồn khác nhau để kiểm tra các tình huống và trường
hợp khác nhau của ứng dụng.
 Kiểm thử kiến thức (Exploratory Testing):
- Kiểm thử dựa trên kiến thức và kinh nghiệm của người kiểm thử, thường không có kịch
bản kiểm thử cụ thể.
1.3 Cấp độ kiểm thử phần mềm
Thực tế, KTPM không đơn giản như nhiều người thường nghĩ, công việc này có nhiều cấp
độ khác nhau, tùy thuộc vào phạm vi và mục tiêu kiểm thử của dự án phần mềm. Trong một
dự án kiểm thử phần mềm bao gồm mức độ:
 Kiểm thử Đơn vị (Unit Testing):
- Đây là cấp độ kiểm thử tập trung vào từng đơn vị nhỏ nhất của mã nguồn, chẳng hạn
như các hàm hoặc phương thức cụ thể. Mục tiêu là đảm bảo rằng từng đơn vị hoạt động
đúng cách và trả về kết quả chính xác.
 Kiểm thử Tích hợp (Integration Testing):
- Tại cấp độ này, các đơn vị đã được kiểm thử ở cấp độ đơn vị được kết hợp và kiểm tra
xem chúng hoạt động chính xác khi được tích hợp lại với nhau. Mục tiêu là phát hiện và
khắc phục lỗi tương tác giữa các thành phần của hệ thống.
 Kiểm thử Hệ thống (System Testing):
- Cấp độ này kiểm tra toàn bộ hệ thống phần mềm trong môi trường giống với môi
trường thực tế. Mục tiêu là đảm bảo tính đúng đắn và hoàn thiện của hệ thống trong các điều
kiện thực tế.
 Kiểm thử Hệ thống Tổng thể (End-to-End Testing):
- Kiểm tra toàn bộ quy trình hoặc luồng công việc của hệ thống từ đầu đến cuối để đảm
bảo tính liên kết và sự hoạt động hợp nhất của các phần tử trong hệ thống.
 Kiểm thử Tích hợp Giao diện (Interface Testing):
- Tại cấp độ này, kiểm tra sự tương tác giữa các thành phần của hệ thống và giao diện
của chúng để đảm bảo tính đúng đắn và tích hợp chính xác.
 Kiểm thử Tác vụ Chức năng (Functional Testing):
- Kiểm tra các chức năng của hệ thống dưới góc độ chức năng để đảm bảo rằng chúng
hoạt động đúng cách và tuân thủ các yêu cầu.
 Kiểm thử Phi chức năng (Non-Functional Testing):
- Kiểm tra các khía cạnh phi chức năng của phần mềm, chẳng hạn như hiệu suất, bảo
mật, khả năng mở rộng, và sự thân thiện với người dùng.
 Kiểm thử Hóa (User Acceptance Testing - UAT):
- Tại cấp độ này, người dùng cuối hoặc người mua hàng kiểm tra và chấp nhận phần
mềm để đảm bảo rằng nó đáp ứng các yêu cầu và mục tiêu kinh doanh của họ.
Hình 1.1- 4 cấp độ cơ bản của kiểm thử phần mềm
Cấp độ kiểm thử được chọn phụ thuộc vào quá trình phát triển phần mềm, mục tiêu kiểm thử
cụ thể, và nguồn lực có sẵn. Tất cả các cấp độ này đóng vai trò quan trọng trong việc đảm
bảo tính ổn định và chất lượng của phần mềm trước khi nó được phát hành cho người sử
dụng cuối.
1.4 Quy trình kiểm thử phần mềm
Trong quy trình kiểm thử phần mềm, các kiểm thử viên sử dụng các mô hình kiểm thử phần
mềm để hướng dẫn và tổ chức công việc kiểm thử. Hiện nay, có nhiều mô hình kiểm thử
phần mềm khác nhau, chẳng hạn như mô hình thác nước, mô hình xoắn ốc,... và có thể kết
hợp các mô hình này tùy thuộc vào quy mô và tính cấp thiết của dự án.
Dù quy trình kiểm thử có thể biến đổi theo dự án cụ thể, quy trình kiểm thử cơ bản vẫn bao
gồm các bước chính sau đây:
-Phân Tích Yêu Cầu Sản Phẩm: Nghiên cứu và phân tích tài liệu về yêu cầu sản phẩm
để hiểu rõ yêu cầu và tiêu chí chất lượng của khách hàng.
-Lập Kế Hoạch Kiểm Thử: Xác định phạm vi dự án, nguồn lực cần thiết, phương
pháp tiếp cận, và lên kế hoạch chi tiết cho quy trình kiểm thử.
-Thiết Kế Kịch Bản Kiểm Thử: Xây dựng các kịch bản kiểm thử dựa trên yêu cầu và
tài liệu thiết kế, và chuẩn bị dữ liệu và tài liệu cần thiết.
-Sắp Đặt Môi Trường Kiểm Thử: Thiết lập môi trường kiểm thử phần mềm để đảm
bảo rằng nó phù hợp với sản phẩm và yêu cầu kiểm thử.
Thực Hiện Kiểm Thử: Thực hiện các kịch bản kiểm thử, ghi lại kết quả và xác định các lỗi.
-So Sánh Kết Quả Và Báo Cáo: Xác định và báo cáo các lỗi được tìm thấy, đánh giá
tiêu chí hoàn thành, và xem xét quy trình kiểm thử.
-Hoàn Tất Kiểm Thử: Đánh giá tiêu chí hoàn thành và kết thúc quy trình kiểm thử,
báo cáo kết quả kiểm thử và rút kinh nghiệm.
Quy trình này giúp đảm bảo rằng sản phẩm phần mềm đáp ứng các yêu cầu chất lượng và
yêu cầu của khách hàng trước khi được triển khai hoặc bàn giao.
2. LÝ THUYẾT VỀ KIỂM THỬ TỰ ĐỘNG
2.1 Khái quát về kiểm thử phần mềm tự động
Kiểm thử phần mềm tốn nhiều chi phí nhân công, thời gian. Trong một số dự án, chi phí
kiểm thử phần mềm chiếm 40% tổng giá trị của dự án. Nếu cần ứng dụng an toàn hơn, chi
phí kiểm thử còn cao hơn nữa. Do đó một trong các mục tiêu của kiểm thử là tự động hóa
nhiều, nhờ đó mà giảm thiểu chi phí, giảm lỗi, đặc biệt giúp việc kiểm thử hồi qui dễ dàng
và nhanh chóng hơn. Tự động hóa việc kiểm thử là dùng phần mềm điều khiển việc thi hành
kiểm thử, so sánh kết quả có được với kết quả mong muốn, thiết lập các điều kiện đầu vào,
các kiểm soát kiểm thử và các chức năng báo cáo kết quả...
2.2 Kiểm thử tự động là gì?
Kiểm thử tự động là một quá trình kiểm tra chất lượng và tính ổn định của phần mềm bằng
cách sử dụng các công cụ và kịch bản kiểm thử được thiết lập và thực hiện tự động, thay vì
thực hiện thủ công bởi con người. Mục tiêu chính của kiểm thử tự động là đảm bảo rằng
phần mềm hoạt động đúng cách và tuân thủ các yêu cầu đã đặt ra mà không cần sự can thiệp
thủ công liên tục.
Quá trình kiểm thử tự động bao gồm việc tạo các kịch bản kiểm thử tự động, các tập lệnh,
hoặc các tệp kiểm thử mà máy tính có thể thực hiện mà không cần sự giám sát của con
người. Các kịch bản này có thể kiểm tra các khía cạnh khác nhau của phần mềm như chức
năng, hiệu suất, tương tác người dùng, bảo mật, và nhiều khía cạnh khác.
Một số công cụ phổ biến được sử dụng trong kiểm thử tự động bao gồm Selenium (được sử
dụng cho kiểm thử giao diện người dùng web), JUnit (được sử dụng cho kiểm thử đơn vị
trong Java), Appium (được sử dụng cho kiểm thử ứng dụng di động), và nhiều công cụ khác.
Lợi ích của kiểm thử tự động bao gồm tính hiệu quả, tính nhất quán, khả năng lặp lại, và sự
kiểm tra tự động hóa, đồng thời giúp tối ưu hóa quá trình kiểm thử và giảm nguy cơ sai sót
do con người gây ra. Tuy nhiên, việc thiết lập và duy trì các kịch bản kiểm thử tự động đòi
hỏi sự đầu tư ban đầu và sự phối hợp giữa các nhóm phát triển và kiểm thử.
2.3 Tại sao phải kiểm thử tự động
Kiểm thử tự động được thực hiện với mục đích chính là đảm bảo tính ổn định, chất lượng và
đáp ứng yêu cầu của phần mềm trong quá trình phát triển và sau khi sản phẩm đã được phát
hành.
Mục Đích Chính của Kiểm Thử Tự Động:
 Phát hiện Lỗi Sớm:
- Kiểm thử tự động giúp phát hiện lỗi và sự cố một cách nhanh chóng trong quá trình phát
triển. Điều này giúp giảm chi phí sửa lỗi và đảm bảo tính ổn định của phần mềm.
 Tăng Hiệu Quả:
- Tính hiệu quả là một mục tiêu quan trọng của kiểm thử tự động. Nó giúp tiết kiệm thời
gian và công sức của nhóm kiểm thử bằng cách thực hiện các bài kiểm tra tự động, loại bỏ
sự can thiệp thủ công liên tục.
 Kiểm Thử Liên Tục (Continuous Testing):
- Kiểm thử tự động tích hợp vào quy trình liên tục phát triển và liên tục triển khai
(CI/CD), đảm bảo rằng mọi thay đổi mã nguồn được kiểm tra tự động trước khi được tích
hợp vào sản phẩm chính.
 Tự Động Hóa Tác Vụ Lặp Lại:
- Các tác vụ lặp lại, chẳng hạn như kiểm thử tích hợp định kỳ hoặc kiểm thử hệ thống, có
thể được tự động hóa để giảm công việc thủ công đơn điệu và tốn thời gian.
 Khả Năng Lặp Lại:
- Kiểm thử tự động giúp thực hiện các bài kiểm tra một cách lặp lại trong nhiều tình
huống và trường hợp khác nhau, đảm bảo tính ổn định và đáng tin cậy của phần mềm.
Khi Nào Cần Kiểm Thử Tự Động:
 Trong Quá Trình Phát Triển Phần Mềm:
- Kiểm thử tự động nên được thực hiện liên tục trong suốt quá trình phát triển để đảm bảo
rằng mọi thay đổi mã nguồn không gây ra lỗi mới và đáp ứng yêu cầu kỹ thuật.
 Khi Có Sự Thay Đổi Mã Nguồn:
- Khi có bất kỳ thay đổi nào trong mã nguồn của phần mềm, kiểm thử tự động nên được
thực hiện để đảm bảo tính ổn định và đáp ứng.
 Khi Phát Hành Sản Phẩm Mới Hoặc Cập Nhật:
- Trước khi sản phẩm mới được phát hành hoặc bản cập nhật được triển khai, kiểm thử tự
động giúp đảm bảo rằng sản phẩm đáp ứng các yêu cầu và không có lỗi quan trọng.
 Đối Với Ứng Dụng Web và Di Động:
- Kiểm thử tự động thường được sử dụng rộng rãi để kiểm tra ứng dụng web và di động
trên nhiều nền tảng và trình duyệt khác nhau.
 Khi Cần Đảm Bảo Hiệu Suất và Bảo Mật:
- Kiểm thử tự động cũng có thể được sử dụng để kiểm tra hiệu suất ứng dụng trong điều
kiện tải và bảo mật để đảm bảo rằng dữ liệu và thông tin của người dùng được bảo vệ..
2.4 Nguyên tắc kiểm thử tự động
Khi thực hiện kiểm thử tự động trong phát triển phần mềm, có một số nguyên tắc quan trọng
mà các nhóm kiểm thử tự động thường tuân theo để đảm bảo hiệu quả và độ tin cậy của quy
trình kiểm thử. Dưới đây là một số nguyên tắc quan trọng trong kiểm thử tự động:
-Lựa Chọn Cẩn Thận Các Kỹ Thuật và Công Cụ Kiểm Thử: Chọn kỹ thuật và công cụ kiểm
thử phù hợp với dự án cụ thể và mục tiêu kiểm thử. Điều này bao gồm việc đánh giá tích hợp
và hỗ trợ cho các công nghệ và ứng dụng cụ thể.
-Tích Hợp Kiểm Thử Sớm Trong Quy Trình Phát Triển: Bắt đầu kiểm thử tự động càng sớm
càng tốt trong quy trình phát triển để phát hiện và sửa chữa lỗi sớm. Điều này giúp giảm chi
phí và thời gian sửa lỗi sau này.
-Xây Dựng Kịch Bản Kiểm Thử Tốt: Tạo các kịch bản kiểm thử tự động rõ ràng, dễ đọc, và
dễ bảo trì. Đảm bảo rằng các kịch bản kiểm thử phủ sóng đầy đủ các chức năng và tính năng
của ứng dụng.
-Tự Động Hóa Các Kịch Bản Kiểm Thử Quan Trọng: Ưu tiên tự động hóa các kịch bản
kiểm thử quan trọng và thường xuyên sử dụng để đảm bảo tính nhất quán và tiết kiệm thời
gian.
-Quản Lý Dữ Liệu Kiểm Thử: Đảm bảo rằng dữ liệu kiểm thử được quản lý một cách hiệu
quả và có thể dễ dàng thay đổi khi cần thiết.
-Thực Hiện Kiểm Thử Tự Động Trong Môi Trường Cô Đặc: Đảm bảo rằng kiểm thử tự
động được thực hiện trong môi trường cô đặc tương tự như môi trường thực tế.
-Tự Động Hóa Việc Xác Nhận Kết Quả: Sử dụng tự động hóa để xác nhận kết quả kiểm thử
và tạo báo cáo tự động về kết quả kiểm thử.
-Liên Tục Cập Nhật và Bảo Trì Kịch Bản Kiểm Thử: Theo dõi và cập nhật các kịch bản
kiểm thử khi có thay đổi trong ứng dụng hoặc yêu cầu kiểm thử.
-Sử Dụng Source Control và Quản Lý Phiên Bản: Quản lý mã nguồn của các kịch bản kiểm
thử bằng hệ thống quản lý phiên bản để theo dõi các thay đổi và phục hồi khi cần thiết.
-Học Hỏi Và Tối Ưu Hóa Liên Tục: Luôn cải thiện quy trình kiểm thử tự động bằng cách
học hỏi từ kết quả kiểm thử trước và tối ưu hóa cách tiếp cận kiểm thử.
2.5 Quy trình kiểm thử tự động
Trong 1 môi trường lí tưởng thì kiểm thử sẽ song song với chu trình phát triển của 1 phần
mềm
-Tạo kịch bản kiểm thử: Giai đoạn này dùng công cụ kiểm thử để ghi lại các thao tác lên
phần mềm cần kiểm tra và tự động sinh ra kịch bản kiểm thử
-Chỉnh sửa kịch bản: Chỉnh sửa để kịch bản kiểm thử thực hiện kiểm tra theo đúng yêu cầu
đặt ra. Cụ thể, làm theo trường hợp kiểm thử cần thực hiện
-Chạy kịch bản kiểm thử: Chạy kịch bản kiểm thử để kiểm tra phần mềm có đưa ra đúng như
kết quả mong muốn không
-Đánh giá kết quả: Đánh giá kết quả sau khi chạy kịch bản kiểm thử.
2.6 So sánh kiểm thử thủ công và kiểm thử tự động
Tiêu Chí Kiểm Thử Thủ Công Kiểm Thử Tự Động
Thực Hiện Bởi Con người Máy tính thông qua công cụ
Tính Hiệu Quả Tốn thời gian và công sức lớn Hiệu quả trong việc lặp lại và
trong môi trường phát triển
nhanh chóng
Tính Nhất Quán Có thể gây sai sót do con người Đảm bảo tính nhất quán
Khả Năng Lặp Lại Khó khăn Dễ dàng
Tự Động Hoá Tác Không thể tự động hoá Có khả năng tự dộng hoá
Vụ Lặp Lại
Chi Phí Chi phí ban đầu thấp nhưng có Chi phí ban đầu cao, nhưng tiết
thể tăng khi cần thêm người thử kiệm chi phí trong thời gian dài
nghiệm
Phát Hiện Lỗi Sớm Thường sau khi phần mềm đã Phát hiện lỗi sớm trong quá trình
được phát triển một phần phát triển
Phạm Vi Kiểm tra Thường xuyên kiểm tra chức Có thể áp dụng cho nhiều loại
thử nghiệm năng và kiểm tra người dùng kiểm tra, bao gồm các chức năng
giao diện kiểm tra, hiệu suất, bảo mật và
nhiều khía cạnh khác
C. CƠ SỞ THỰC TIỄN
3. GIỚI THIỆU CHUNG VỀ PHẦN MỀM KIỂM THỬ TEST COMPLETE
3.1 Giới thiệu về Test Complete
TestComplete là môi trường thử nghiệm tự động cho nhiều loại ứng dụng và công nghệ, bao
gồm (nhưng không giới hạn) Windows, .NET, WPF, Visual C++, Visual Basic, Delphi, C+
+Builder, Java và các ứng dụng và dịch vụ Web.
TestComplete được định hướng lại cho các thử nghiệm chức năng và đơn vị. Nó cung cấp sự
hỗ trợ vượt trội cho việc kiểm tra quy trình kiểm tra hàng ngày và hỗ trợ nhiều loại thử
nghiệm khác: thử nghiệm dựa trên dữ liệu, thử nghiệm phân tán và các loại thử nghiệm
khác.
Bạn tạo các bài kiểm tra bằng cách ghi lại hoặc chỉnh sửa các lệnh kiểm tra trong bảng và
chỉnh sửa TestComplete. Các thử nghiệm có thể được chạy từ bên trong TestComplete hoặc
chúng có thể được xuất sang một ứng dụng bên ngoài và chạy ở đó.
TestComplete nhận dạng các đối tượng và điều khiển trong các ứng dụng đã được thử
nghiệm và đưa ra các lệnh đặc biệt để mô phỏng hành động của người dùng đối với họ. Nó
cũng cung cấp các công cụ kiểm tra cho phép bạn dễ dàng xác định trạng thái ứng dụng
trong quá trình thử nghiệm.
Nếu phương tiện tích hợp không đủ để mô phỏng hành động của người dùng trên ứng dụng
được thử nghiệm hoặc kiểm tra trạng thái ứng dụng, bạn có thể tận dụng quyền truy cập vào
các đối tượng, phương thức và thuộc tính bên trong của ứng dụng để thực hiện các tác vụ
cần thiết.
3.2 Lịch sử hình thành
TestComplete là một công cụ kiểm tra phần mềm tự động được phát triển bởi SmartBear
Software. Lịch sử hình thành của TestComplete bắt đầu từ những năm đầu của thế kỷ 21 và
đã trải qua một hành trình phát triển đầy đủ thành công và đổi mới. Dưới đây là cái nhìn
tổng thể về lịch sử của TestComplete:
-TestComplete 1 (Năm 2001): Phiên bản đầu tiên của TestComplete, hỗ trợ kiểm thử
ứng dụng Windows và trang web.
-TestComplete 7 (Năm 2009): Đã mở rộng hỗ trợ cho kiểm thử ứng dụng di động đầu
tiên cho iOS và Android.
-TestComplete 10 (Năm 2013): Bổ sung công cụ kiểm thử ảnh và tích hợp với Git.
-TestComplete 12 (Năm 2017): Tích hợp với các công cụ quản lý mã nguồn như
Jenkins và TeamCity, tăng cường tích hợp và triển khai liên tục.
-TestComplete (Năm 2021): Tiếp tục phát triển và cải tiến để duy trì vị trí hàng đầu
trong lĩnh vực kiểm thử phần mềm và hỗ trợ cho nhiều nền tảng khác nhau bao gồm cả ứng
dụng di động và web.
-Hiện Tại: TestComplete là một trong những công cụ kiểm thử phần mềm hàng đầu
trên thị trường, được sử dụng rộng rãi trong cả các dự án phát triển phần mềm nhỏ và lớn.
Sự phát triển và cải tiến liên tục của TestComplete đảm bảo rằng nó vẫn giữ vị trí quan trọng
trong việc đảm bảo chất lượng phần mềm trong tương lai.
3.3 Đặc điểm của Test Complete
Các tính năng chính
- Kiểm tra từ khóa: Kiểm tra từ khóa
- Trình soạn thảo tập lệnh đầy đủ tính năng: Chỉnh sửa đầy đủ các bản kịch bản
- Test Record and Playback: Cho phép ghi và chạy lại quá trình kiểm tra
- Tính năng gỡ lỗi script: Gỡ lỗi
- Access to Methods and Properties of Internal Objects: Truy cập các phương thức và thuộc
tính của bên trong đối tượng
- Hỗ trợ Unicode: Hỗ trợ gỡ bỏ Unicode
- Hỗ trợ theo dõi vấn đề
Hỗ trợ thử nghiệm dạng
- Kiểm tra chức năng (hoặc GUI): Kiểm tra chức năng
- Kiểm tra hồi quy: Kiểm tra phục hồi
- Kiểm tra đơn vị: Kiểm tra đơn vị
- Kiểm tra phân tán: Kiểm tra phân tán
- Kiểm tra tải: Kiểm tra tải truyền tải
- Kiểm tra web: Kiểm tra tra cứu trên nền Web
- Kiểm tra chức năng và tải của các dịch vụ web: Kiểm tra các chức năng và truyền tải
tải Web service
- Kiểm tra phạm vi bảo hiểm
-Kiểm tra theo hướng dữ liệu
- Manual Testing: Kiểm tra bằng tay
- Keyword testing: Kiểm tra từ khóa
Các ngôn ngữ viết mã hỗ trợ
- VBScript
- JScript
- DelphiScript
- C++Script
- C#Script
3.4 Ưu nhược điểm Test Complete
Ưu Điểm TestComplete:
-Hỗ trợ Đa Nền Tảng: TestComplete hỗ trợ kiểm thử ứng dụng trên nhiều nền tảng khác
nhau, bao gồm Windows, web, iOS và Android. Điều này làm cho nó phù hợp cho các dự án
phát triển đa nền tảng.
-Giao Diện Thân Thiện: Giao diện đồ họa dễ sử dụng và trực quan, giúp người dùng tạo và
quản lý các kịch bản kiểm thử một cách dễ dàng.
-Tích Hợp Dễ Dàng: TestComplete tích hợp tốt với các công cụ quản lý mã nguồn như Git
và hệ thống quản lý dự án phổ biến như Jenkins và TeamCity. Điều này tạo điều kiện thuận
lợi cho quá trình CI/CD.
-Kiểm Thử Tích Hợp: Cung cấp khả năng kiểm tra tích hợp giữa các thành phần của hệ
thống để đảm bảo tính đúng đắn và liên kết chính xác.
-Kiểm Thử Hiệu Năng: Hỗ trợ kiểm thử hiệu suất, đánh giá khả năng và hiệu suất của ứng
dụng trong các điều kiện khác nhau.
-Kiểm Thử Bảo Mật: Hỗ trợ kiểm thử bảo mật để đảm bảo rằng ứng dụng được bảo vệ khỏi
các mối đe dọa bảo mật.
Nhược Điểm TestComplete:
-Giá Cả Khá Cao: TestComplete không phải là một công cụ miễn phí và có giá cả khá cao,
điều này có thể làm tăng chi phí cho dự án phát triển.
-Học Cách Sử Dụng Các Tính Năng Nâng Cao: Cần một thời gian để học cách sử dụng các
tính năng nâng cao của TestComplete, đặc biệt nếu bạn không quen thuộc với công cụ này.
-Hỗ Trợ Hạn Chế Cho Một Số Công Nghệ: TestComplete có thể hỗ trợ hạn chế cho một số
công nghệ và ngôn ngữ lập trình cụ thể, điều này có thể gây khó khăn đối với dự án đòi hỏi
tích hợp đa dạng.
-Yêu Cầu Kiến Thức Về Lập Trình: Để tận dụng hết khả năng của TestComplete, bạn cần
kiến thức về lập trình, đặc biệt là trong việc viết các kịch bản kiểm thử phức tạp.
3.5 Cài đặt
Để cài đặt và sử dụng phần mềm TestComplete, bạn cần tuân thủ các bước sau:
Lưu ý: Trước khi bắt đầu, hãy kiểm tra xem bạn đã có giấy phép cho phần mềm này hay
chưa, vì TestComplete là một phần mềm thương mại và bạn cần một giấy phép để sử dụng.
-Tải Phần Mềm TestComplete: Truy cập trang web chính thức của TestComplete
(https://smartbear.com/product/testcomplete/overview/) để tải phiên bản mà bạn muốn cài
đặt.
-Chạy Trình Cài Đặt: Sau khi tải xong, mở tệp cài đặt mà bạn đã tải về.
Theo hướng dẫn trình cài đặt, bạn sẽ được hỏi về vị trí cài đặt, các tùy chọn cài đặt, và giấy
phép.
-Nhập Giấy Phép: Khi được yêu cầu, nhập thông tin giấy phép của bạn. Điều này bao gồm
mã sản phẩm và bất kỳ thông tin khác mà bạn nhận được khi mua phần mềm.
-Hoàn Tất Cài Đặt: Khi trình cài đặt hoàn tất, bạn có thể mở TestComplete từ menu Start
(hoặc trong các hệ điều hành khác, theo cách tương ứng).
-Bắt Đầu Sử Dụng TestComplete: Sau khi mở TestComplete, bạn sẽ thấy giao diện của nó
và có thể bắt đầu tạo và thực hiện các kịch bản kiểm thử.
-Thiết Lập Môi Trường Kiểm Thử: Trước khi bắt đầu kiểm thử, bạn cần thiết lập môi trường
kiểm thử, bao gồm việc kết nối đến ứng dụng hoặc trang web bạn muốn kiểm thử.
-Tạo Kịch Bản Kiểm Thử: Sử dụng TestComplete để tạo các kịch bản kiểm thử, định nghĩa
các hành động, và xác định các trường hợp kiểm thử.
-Chạy Kiểm Thử: Bạn có thể chạy các kịch bản kiểm thử tự động và xem kết quả từ
TestComplete.
4. THỰC NGHIỆM TEST COMPLETE
4.1 Code website bán vé lễ hội
4.1.1 Html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-
awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="styles.css">
<title>Festival</title>
</head>
<body>
<div>
<header id="home">
<div class="w3-top w3-light-gray">
<div class="w3-row w3-padding w3-white">
<div class="w3-col s3">
<a href="#home" class="w3-button w3-block w3-white">Home</a>
</div>
<div class="w3-col s3">
<a href="#gallery" class="w3-button w3-block w3-
white">Gallery</a>
</div>
<div class="w3-col s3">
<a href="#ticket" class="w3-button w3-block w3-
white">Ticket</a>
</div>
<div class="w3-col s3">
<a href="#book" class="w3-button w3-block w3-white">Book</a>
</div>
</div>
</div>
</header>
</div>
<main>
<div class="hero">
<div class="hero-description">

<div class="hero-text">
<h1 class="hero-header">
From <span style="color:#FDB813 ">sun up to sun down,</span> we
have the best party in town.
</h1>
<p>Sunday FEB 13</p>
<p><i class="fa fa-map-marker fa-fw w3-text-white w3-xlarge w3-
margin-bottom w3-margin-right"></i>40 Glenwood Street
Coventry, RI 02816</p>
<a href="#book" class="w3-btn w3-red w3-margin-top w3-round"
style="width: 40%;">
Buy Ticket
</a>
</div>

</div>

</div>
<div class="main">
<div class="about" id="gallery">

<h2>Gallery</h2>

<div class="gallery">
<div class="about-image-1">
<img src="https://spaces.w3schools.com/images/4_M8uIfPEZw.jpg"
loading="lazy" alt="Photo by Muneeb Syed | Unsplash"/>

</div>
<div class="about-image-2">
<div class="image-list">
<img src="https://spaces.w3schools.com/images/Fh-Q-xfdh_o.jpg"
loading="lazy" alt="Photo by Pien Muller | Unsplash"/>
</div>
<div class="image-list">
<img src="https://spaces.w3schools.com/images/GrIty4BNJEE.jpg"
loading="lazy" alt="Photo by Francisco Moreno | Unsplash"/>
</div>
</div>
</div>

</div>
<div class="poster">

<h2>Singers & musicians</h2>

<div class="poster-main">
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/NeTf7NGXrtc.jpg"
loading="lazy" alt="Photo by Taylor | Unsplash"/>
<div class="poster-text">

<h3>Ruth R. Channel
</h3>

</div>
</div>
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/DzkBxH3yUfU.jpg"
loading="lazy" alt="Photo by hafizh armynazrie | Unsplash"/>
<div class="poster-text">
<h3>Karolyn B
</h3>
</div>
</div>
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/zndslHAXhAw.jpg"
loading="lazy" alt="Photo by Obafemi Moyosade | Unsplash"/>
<div class="poster-text">
<h3>Edwin B. McKenzie
</h3>
</div>
</div>
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/OHOArMflSpM.jpg"
loading="lazy" alt="Photo by Joshua Hanson | Unsplash"/>
<div class="poster-text">

<h3>William J. Smith
</h3>

</div>
</div>
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/bf8APnBxoCk.jpg"
loading="lazy" alt="Photo by Thiago Borrere Alvim | Unsplash"/>
<div class="poster-text">

<h3>John L. Garrick
</h3>

</div>
</div>
<div class="poster-list">
<img src="https://spaces.w3schools.com/images/1s9TY8FRBNs.jpg"
loading="lazy" alt="Photo by Music HQ | Unsplash"/>
<div class="poster-text">

<h3>Ruth R. Channel
</h3>

</div>
</div>

</div>
</div>
<div class="sponsor">
<div class="title">
<h2>sponsors</h2>
</div>

<div class="sponsor-main">
<div class="sponsor-image">
<img src="https://bom.so/5xR43B" loading="lazy" alt="W3Schools"/>

</div>
<div class="sponsor-image">
<img src="https://bom.so/nKdmrw" loading="lazy" alt="W3Schools"/>
</div>
<div class="sponsor-image">
<img src="https://bom.so/bJ8tTL" loading="lazy" alt="W3Schools"/>

</div>
<div class="sponsor-image">
<img src="https://bom.so/lgRqjK" loading="lazy" alt="W3Schools"/>

</div>

</div>
</div>

<div class="ticket" id="ticket">

<h2>ticket packages</h2>

<div class="ticket-main">
<div class="ticket-list ticket-pro">
<h4 class="ticket-header">VIP</h4>
<div class="ticket-icon">
<img src="img/vip-card.png" loading="lazy" alt="vip-card"/>
</div>
<div class="ticket-text">
<li>Free set</li>
<li>Free Drink and Food</li>
<li>Photoshoot</li>
</div>
<a href="#book" class="w3-btn w3-red w3-margin-top w3-round"
style="width: 100%;">

Buy Ticket
</a>
<div class="ticket-price">
<p>$40</p>
</div>
</div>
<div class="ticket-list ">
<h4 class="ticket-header">
Family
</h4>
<div class="ticket-icon">
<img src="img/family-group.svg" loading="lazy" alt="family"/>
</div>
<div class="ticket-text">
<li>Free set</li>
<li>10 Free photo shoot</li>
<li>Photo shoot</li>
</div>
<a href="#book" class="w3-btn w3-red w3-margin-top w3-round"
style="width: 100%;">

Buy Ticket
</a>
<div class="ticket-price">
<p>$40</p>
</div>
</div>
<div class="ticket-list">
<h4 class="ticket-header">Reserved</h4>
<div class="ticket-icon">
<img src="img/guarantee.png" loading="lazy" alt="guarantee"/>
</div>
<div class="ticket-text">
<li>Enjoy concert</li>
<li>Free Drink and Food</li>
<li>Live screen</li>
</div>
<a href="#book" class="w3-btn w3-red w3-margin-top w3-round"
style="width: 100%;">

Buy Ticket
</a>
<div class="ticket-price">
<p>$40</p>
</div>
</div>
</div>

</div>

<div class="buy-ticket" id="book">

<h2>Buy a Ticket</h2>

<div class="buy-ticket-main">

<div class="buy-ticket-image">
<img src="https://spaces.w3schools.com/images/usOGcvSdvnk.jpg"
loading="lazy" alt="Photo by Vidar Nordli-Mathisen | Unsplash"/>
</div>
<div class="buy-ticket-form">
<p>Please fill this form, we will send your digital ticket to your email
address</p>
<form>
<div>
<label for="fname">Full name:</label><br>
<input type="text" id="fname" name="fname" placeholder="Full Name">

</div>
<label for="Email">Email</label>
<br>
<input type="Email" id="email" name="Emial"
placeholder="example@something.com"><br>
<div>
<label for="cars">Choose Ticket type:</label>
<select>
<option value="vip" class="option">VIP</option>
<option value="family"class="option">Family</option>
<option value="Reserved"class="option">Reserved</option>

</select>
</div>
<button class="w3-btn w3-red w3-round" style="width: 50%; margin-top:
75px;">Submit</button>
</form>
</div>
</div>

</div>

</div>
</main>

</body>
</html>
4.1.2 Code Css
/*CSS variables section*/
:root {
color:white;
background: #ECECEC;
}

/*Extra Large screens - Extra large desktops*/


/*General CSS and CSS reset*/

html {
scroll-behavior: smooth;
}

* {
margin: 0;
padding: 0;
}
.hero{
height:600px;
background-image: url("https://spaces.w3schools.com/images/hTv8aaPziOQ.jpg");
background-repeat: no-repeat;
background-size: cover;
background-position:center ;
overflow: hidden;
}
.hero-description{
height: 600px;
background-color:rgba(4,7,32,0.7) ;
display: flex;
justify-content: space-between;
flex-wrap: wrap-reverse;
justify-content: flex-end;

.hero-text{
width: 60%;
}
.hero-text p{
width: 70%;
}
h2 {
height: 150px;
color: black;
display: flex;
font-size: 45px;
text-transform: uppercase;
font-weight: 800;
align-items:center;

}
.hero-header{

margin-top: 120px;
padding-right: 50px;
text-transform: uppercase;
font-size: 60px;
font-weight: 800;
}
.main{
width: 90%;
margin: auto;
}
.about{

overflow: hidden;

.gallery{
display: flex;
justify-content: space-evenly;
flex-wrap: wrap;

.about-image-1{
height: 600px;
width: 500px;
}
.about-image-1 img{
width: 100%;
height: 100%;
object-fit: cover;
}
.about-image-2{
display: flex;
height: 600px;
flex-direction: column;
justify-content: space-between;

}
.image-list{
height: 280px;
width: 500px;
}
.image-list img{
width:100%;
height: 100%;
object-fit: cover;
}
.poster-main{
display: flex;
justify-content: space-evenly;
flex-wrap: wrap;
}
.poster-list{
width: 320px;
height: 400px;
position: relative;
margin:20px;
box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;

}
.poster-list img{
width: 100%;
height: 100%;
object-fit: cover;
}
.poster-text{
height:80px;
position: absolute;
bottom: 0;
overflow: hidden;
left:0;
background: transparent;
right: 0;
background:rgba(0,0,0,0.7);

padding:20px

}
.sponsor-main{
display:flex;
justify-content: space-evenly;
flex-wrap: wrap;

}
.sponsor-image{
width: 15%;
padding: 30px;
margin: 10px 10px;
border-radius: 20px;
box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;

}
.sponsor-image img{
width: 100%;
height: 100%;
object-fit: contain;
}
.ticket-main{
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}

.ticket-list{
width:300px;
height: 350px;
margin:30px;
background-color: #ffffcc!important;
box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;
border-radius: 20px;
border:1px solid grey;
padding: 30px;
color: black;
position: relative;
overflow: hidden;
}
.ticket-header{
color:black;
text-transform: uppercase;
font-size: 20px;
font-weight: 700;
text-align: center;
padding: 10px 0px;

}
.ticket-icon{
width:80px;
height: 80px;
margin:auto;
}
.ticket-text{
margin-top: 20px;
}
.ticket-text li{
font-size: 16px;
}

.ticket-icon img{
width: 100%;
height: 100%;
object-fit: contain;

}
.ticket-price{
color:white;
position: absolute;
top:0px;
left:0px;
padding:10px 30px;
font-weight: 800;
background: black;

}
.buy-ticket-main{
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
align-items: center;
}
label{
font-weight: 800;
}
form{
padding-top: 25px;
}
.buy-ticket-image
{
width:400px;
height: 350px;
}
.buy-ticket-image img{
width: 100%;
height: 100%;
object-fit: cover;
}
.buy-ticket-form{
color:black;
margin:20px;
}

input{
padding:10px !important;
margin: 10px 0px;
height: 40px;
border:1px solid ;
width:60%;
}
/*MEDIA QUERIES*/
/*Large screens - Desktop*/

@media screen and (min-width: 1500px) {


.hero-text{
width: 60%;

}
.about{
width:90%;
}
.about-image-1{
width: 30%;

}
.about-image-2{
flex-direction: row;
width: 70%;
height: 600px;

.image-list{
height: 600px;
margin:auto;

.gallery{
justify-content: center;

}
.about{
width: 90%;
margin: auto;
}

}
/*medium screens - Laptops*/
@media screen and (max-width: 1024px) {
.about-image-1{
width: 100%;
height: 500px;
}
.image-list{
height: 240px;
}
.about-image-2{
height: 500px;
flex-direction: row;
width: 100%;
}
.image-list{
width: 100%;
}
.gallery{
justify-content: space-evenly;
}
.hero-text{
width: 70%;
}
.hero-header{
font-size: 45px;
}

/*Small screens - tablets*/


@media screen and (max-width: 768px) {

.about{
width: 90%;
margin: auto;
}
.about-image-1{
width: 100%;
height: 500px;
margin-bottom: 10px;

}
.about-image-2{
height: 250px;
}
.image-list{
width: 49%;
justify-content: space-between;
}
.about-image-2{
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.sponsor-image{
margin-bottom: 30px;
}
.hero-description{
justify-content: center;
}
.hero-text{
width:80%;
}
.hero-header{
font-size: 30px;
}
h2{
font-size: 30px;
height: 100px;
}
.poster-list{
width: 250px;
}

/*Extra small screens - phones*/


@media screen and (max-width: 480px) {
.gallery{
justify-content: center;
}
.about{
width:90%;
margin: auto;
}
.about-image-2{
height: 250px;
}
h2{
font-size: 30px;
height: 80px;
}
.hero-description{
justify-content: center;
align-items: center;
}
.hero-text{
width:90%;
}
.poster-text h3{
font: 16px !important;
}
h3{
width: 100%;
}
}
4.2 Kiểm thử
D.TÀI LIỆU THAM KHẢO
1. https://support.smartbear.com/
2. https://codegym.vn/blog/2022/08/25/cac-cap-do-kiem-thu-phan-mem/
3. https://hphuong271003.w3spaces.com/

You might also like