Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 17

1. Hãy trình bày quy trình kiểm thử.

1. Lập kế hoạch kiểm thử (Test Planning)


Xác định phạm vi và mục tiêu kiểm thử: Định rõ những gì cần được kiểm thử và các mục tiêu kiểm thử.
Lập kế hoạch tài nguyên: Xác định và phân bổ nhân lực, phần mềm, phần cứng cần thiết.
Xác định chiến lược kiểm thử: Quyết định phương pháp và công cụ sẽ sử dụng trong quá trình kiểm
thử.
Xác định tiêu chí bắt đầu và kết thúc: Quy định các điều kiện để bắt đầu và kết thúc kiểm thử.
2. Phân tích & thiết kế kiểm thử (Test Analysis & Design)
Phân tích yêu cầu phần mềm: Xem xét và hiểu các yêu cầu phần mềm.
Xác định các tình huống kiểm thử: Dựa trên yêu cầu, xác định các trường hợp kiểm thử cụ thể.
Thiết kế các kịch bản kiểm thử: Tạo ra các kịch bản kiểm thử chi tiết từ các tình huống kiểm thử đã xác
định.
Chuẩn bị dữ liệu kiểm thử: Tạo và thu thập dữ liệu cần thiết để thực hiện kiểm thử.
3. Thực hiện kiểm thử (Test Execution)
Thiết lập môi trường kiểm thử: Cài đặt và chuẩn bị môi trường kiểm thử.
Thực hiện các kịch bản kiểm thử: Chạy các kịch bản kiểm thử theo kế hoạch.
Ghi nhận kết quả kiểm thử: Lưu trữ kết quả của từng kịch bản kiểm thử, bao gồm các lỗi phát hiện và
hành vi của hệ thống.
4. Báo cáo kiểm thử (Test Reporting)
Ghi nhận và báo cáo lỗi: Lập báo cáo về các lỗi phát hiện trong quá trình kiểm thử.
Quản lý lỗi: Theo dõi, ưu tiên, và xử lý các lỗi.
Đánh giá và tổng kết: Đánh giá kết quả kiểm thử, so sánh với tiêu chí đặt ra, và tạo báo cáo tổng kết về
quá trình và kết quả kiểm thử.
Đóng lại kiểm thử: Lưu trữ tài liệu kiểm thử, làm sạch dữ liệu kiểm thử, và kết thúc các hoạt động kiểm
thử.

2. Hãy liệt kê các kỹ thuật kiểm thử. Việc lựa chọn kỹ thuật để tạo ra các ca
kiểm thử phụ thuộc vào những yếu tố nào

Kỹ thuật kiểm thử hộp đen (Black Box Testing):

 Kiểm thử chức năng (Functional Testing): Xác minh các chức năng của phần mềm theo yêu cầu
đã xác định.
 Kiểm thử tích hợp (Integration Testing): Kiểm tra sự tương tác giữa các module trong hệ thống.
 Kiểm thử hệ thống (System Testing): Kiểm tra toàn bộ hệ thống sau khi tích hợp các module.
 Kiểm thử chấp nhận (Acceptance Testing): Đảm bảo phần mềm đáp ứng yêu cầu của khách
hàng và người dùng cuối.
 Kiểm thử hồi quy (Regression Testing): Kiểm tra phần mềm sau khi có sự thay đổi để đảm bảo
không có lỗi mới phát sinh.
 Kiểm thử khói (Smoke Testing): Kiểm tra nhanh các chức năng chính của phần mềm để đảm
bảo hoạt động cơ bản.

Kỹ thuật kiểm thử hộp trắng (White Box Testing):

 Kiểm thử đơn vị (Unit Testing): Kiểm tra từng đơn vị nhỏ nhất của phần mềm, thường là từng
hàm hoặc từng đoạn mã.
 Kiểm thử dòng chảy dữ liệu (Data Flow Testing): Kiểm tra cách dữ liệu được chuyển từ nơi này
đến nơi khác trong mã.
 Kiểm thử điều kiện (Condition Testing): Kiểm tra các điều kiện logic trong mã nguồn.
 Kiểm thử đường dẫn (Path Testing): Kiểm tra tất cả các đường dẫn có thể trong mã nguồn.
Kỹ thuật kiểm thử kinh nghiệm (Experience-based Testing):

 Kiểm thử thăm dò (Exploratory Testing): Tester tự do kiểm thử phần mềm mà không cần tuân
thủ theo kế hoạch chi tiết.
 Kiểm thử lỗi dựa trên kinh nghiệm (Error Guessing): Tester dự đoán các lỗi có thể có dựa trên
kinh nghiệm và kiến thức về hệ thống.

Kỹ thuật kiểm thử dựa trên mô hình (Model-based Testing):

 Kiểm thử dựa trên yêu cầu (Requirement-based Testing): Sử dụng các yêu cầu để tạo ra các ca
kiểm thử.
 Kiểm thử trạng thái (State Transition Testing): Kiểm tra các trạng thái và chuyển tiếp trạng thái
của phần mềm.
 Kiểm thử đồ thị nguyên nhân - kết quả (Cause-effect Graphing): Sử dụng các đồ thị nguyên
nhân - kết quả để tạo ra các ca kiểm thử.

Kỹ thuật kiểm thử dựa trên rủi ro (Risk-based Testing):

 Kiểm thử tập trung vào rủi ro (Risk-based Testing): Tập trung kiểm thử các phần có rủi ro cao
nhất của phần mềm.

Việc lựa chọn kỹ thuật kiểm thử phụ thuộc vào các yếu tố sau:

1. Bản chất của phần mềm: Tính chất và chức năng của phần mềm sẽ quyết định kỹ thuật nào phù
hợp nhất.
2. Yêu cầu và tiêu chuẩn chất lượng: Các yêu cầu và tiêu chuẩn mà phần mềm cần phải đáp ứng.
3. Rủi ro và tầm quan trọng: Mức độ rủi ro và tầm quan trọng của các phần khác nhau trong phần
mềm.
4. Nguồn lực và thời gian: Khả năng nguồn lực và thời gian có sẵn để thực hiện kiểm thử.
5. Mức độ phức tạp: Độ phức tạp của phần mềm và hệ thống kiểm thử.
6. Kinh nghiệm và kỹ năng của đội ngũ kiểm thử: Khả năng và kinh nghiệm của đội ngũ kiểm thử
trong việc sử dụng các kỹ thuật cụ thể.
7. Ngân sách: Số tiền có sẵn để thực hiện quá trình kiểm thử.

3. Ca kiểm thử là gì ? Hãy trình bày về các thông tin về một ca kiểm thử tiêu
biểu

Một ca kiểm thử (test case) là một bộ dữ liệu đầu vào cụ thể, cùng với các bước thực hiện và kết
quả dự kiến, được thiết kế để kiểm tra tính đúng đắn của một tính năng hoặc chức năng trong
phần mềm. Mỗi ca kiểm thử đại diện cho một tình huống hay trường hợp cụ thể mà người kiểm
thử muốn kiểm tra, và có thể bao gồm các bước thực hiện chi tiết để xác định xem phần mềm
hoạt động như mong đợi hay không.

Thông tin về một ca kiểm thử tiêu biểu:

1. Tên ca kiểm thử: Đăng nhập vào hệ thống


2. Mục đích: Đảm bảo rằng người dùng có thể đăng nhập thành công vào hệ thống bằng
cách cung cấp thông tin đăng nhập hợp lệ.
3. Điều kiện tiên quyết: Hệ thống đã được cài đặt và đang chạy.
4. Dữ liệu đầu vào:
o Tên đăng nhập: user123
o Mật khẩu: password123
5. Bước thực hiện:

1. Mở trang đăng nhập của ứng dụng.


2. Nhập tên đăng nhập và mật khẩu vào các trường tương ứng.
3. Nhấn nút "Đăng nhập".
6. Kết quả dự kiến: Người dùng được chuyển đến trang chủ của hệ thống và được xem là
đã đăng nhập thành công.
7. Điều kiện sau kiểm thử: Người dùng có thể thực hiện các hoạt động trong hệ thống sau
khi đăng nhập thành công.

4. Trình bày các mức kiểm thử.

1. Kiểm thử đơn vị (Unit Testing):

 Mục tiêu: Kiểm thử các đơn vị nhỏ nhất của phần mềm, thường là các hàm hoặc các module
riêng lẻ.
 Người thực hiện: Thường do các lập trình viên thực hiện.
 Công cụ hỗ trợ: JUnit, NUnit, TestNG, v.v.
 Đặc điểm: Tập trung vào việc kiểm tra chức năng cụ thể và logic của từng đơn vị mã nguồn.

2. Kiểm thử tích hợp (Integration Testing):

 Mục tiêu: Kiểm tra sự tương tác giữa các đơn vị đã được kiểm thử đơn vị, đảm bảo chúng hoạt
động đúng khi kết hợp với nhau.
 Người thực hiện: Thường do các tester hoặc lập trình viên thực hiện.
 Công cụ hỗ trợ: Selenium, JUnit, TestNG, v.v.
 Đặc điểm: Có hai phương pháp chính là kiểm thử từ trên xuống (top-down) và kiểm thử từ dưới
lên (bottom-up). Ngoài ra, có thể sử dụng kiểm thử sandwich, một sự kết hợp của hai phương
pháp trên.

3. Kiểm thử hệ thống (System Testing):

 Mục tiêu: Kiểm tra toàn bộ hệ thống phần mềm để đảm bảo rằng nó đáp ứng các yêu cầu đã đặt
ra.
 Người thực hiện: Do các tester chuyên nghiệp thực hiện.
 Công cụ hỗ trợ: HP ALM, JIRA, TestRail, v.v.
 Đặc điểm: Bao gồm nhiều loại kiểm thử như kiểm thử chức năng, kiểm thử hiệu năng, kiểm thử
bảo mật, kiểm thử khả năng sử dụng, v.v.

4. Kiểm thử chấp nhận (Acceptance Testing):

 Mục tiêu: Xác nhận rằng hệ thống phần mềm đáp ứng yêu cầu và mong đợi của khách hàng và
người dùng cuối.
 Người thực hiện: Thường do khách hàng hoặc người dùng cuối thực hiện.
 Công cụ hỗ trợ: Có thể sử dụng các công cụ quản lý kiểm thử như TestRail, JIRA, nhưng kiểm thử
chấp nhận thường là quá trình thủ công.
 Đặc điểm: Có hai loại kiểm thử chính là kiểm thử alpha (thực hiện bởi nhân viên nội bộ) và kiểm
thử beta (thực hiện bởi khách hàng hoặc người dùng thực tế).

5. Trình bày về các kỹ thuật khảo sát đặc tả.

1. Phỏng vấn (Interviews):

 Mô tả: Kỹ thuật này bao gồm việc gặp gỡ và trò chuyện trực tiếp với các bên liên quan để thu
thập thông tin về yêu cầu của hệ thống.
 Ưu điểm: Cho phép thu thập thông tin chi tiết và rõ ràng từ người dùng.
 Nhược điểm: Tốn thời gian và phụ thuộc vào kỹ năng giao tiếp của người phỏng vấn.

2. Hội thảo (Workshops):

 Mô tả: Các cuộc họp nhóm nơi các bên liên quan cùng tham gia để thảo luận và xác định yêu
cầu.
 Ưu điểm: Tạo điều kiện cho sự hợp tác và đồng thuận giữa các bên liên quan.
 Nhược điểm: Có thể khó quản lý nếu có quá nhiều người tham gia hoặc các ý kiến xung đột.

3. Bảng câu hỏi và khảo sát (Questionnaires and Surveys):

 Mô tả: Sử dụng các câu hỏi có cấu trúc để thu thập thông tin từ một nhóm lớn các bên liên
quan.
 Ưu điểm: Có thể tiếp cận một lượng lớn người dùng trong thời gian ngắn.
 Nhược điểm: Câu trả lời có thể không chi tiết và thiếu sự tương tác trực tiếp.

4. Quan sát (Observation):

 Mô tả: Quan sát trực tiếp cách người dùng làm việc và sử dụng hệ thống hiện tại.
 Ưu điểm: Cung cấp cái nhìn thực tế về quy trình và các vấn đề hiện tại.
 Nhược điểm: Người dùng có thể không hành động tự nhiên khi bị quan sát.

5. Phân tích tài liệu (Document Analysis):

 Mô tả: Xem xét và phân tích các tài liệu hiện có như báo cáo, biểu đồ, và tài liệu hướng dẫn.
 Ưu điểm: Cung cấp thông tin chi tiết về hệ thống hiện tại và các yêu cầu.
 Nhược điểm: Tài liệu có thể lỗi thời hoặc không đầy đủ.

6. Kỹ thuật Use Case (Use Case Technique):

 Mô tả: Sử dụng các kịch bản (use case) để mô tả cách hệ thống sẽ được sử dụng trong các tình
huống thực tế.
 Ưu điểm: Giúp xác định rõ ràng các yêu cầu chức năng từ góc nhìn của người dùng.
 Nhược điểm: Có thể không phù hợp cho việc xác định các yêu cầu phi chức năng.

7. Phân tích công việc (Task Analysis):

 Mô tả: Phân tích các công việc mà người dùng thực hiện để đạt được mục tiêu cụ thể.
 Ưu điểm: Cung cấp cái nhìn chi tiết về các quy trình công việc và các bước cần thiết.
 Nhược điểm: Có thể phức tạp và tốn nhiều thời gian.

8. Brainstorming:

 Mô tả: Các buổi họp nhóm để tạo ra ý tưởng và giải pháp mới.
 Ưu điểm: Khuyến khích sáng tạo và thu thập nhiều ý tưởng khác nhau.
 Nhược điểm: Có thể dẫn đến quá nhiều ý tưởng mà không có sự tập trung.

9. Phân tích SWOT (SWOT Analysis):

 Mô tả: Phân tích các điểm mạnh, điểm yếu, cơ hội và mối đe dọa liên quan đến hệ thống.
 Ưu điểm: Giúp hiểu rõ bối cảnh và các yếu tố ảnh hưởng đến yêu cầu.
 Nhược điểm: Có thể không cung cấp chi tiết cụ thể về các yêu cầu.

10. Kỹ thuật Delphi (Delphi Technique):

 Mô tả: Sử dụng các vòng phản hồi từ một nhóm chuyên gia để đạt được sự đồng thuận về các
yêu cầu.
 Ưu điểm: Thu thập ý kiến từ các chuyên gia mà không cần gặp mặt trực tiếp.
 Nhược điểm: Quá trình có thể kéo dài và phức tạp.

6. Trình bày về các loại kiểm thử hộp trắng tĩnh phổ biến: (Phản biện hình
thức, Phản biện chéo, Thông qua, Thanh tra, Các chuẩn và hướng dẫn trong
lập trình, Danh sách các hạng mục chung cho việc khảo sát mã nguồn)

 Phản biện hình thức (Static Analysis):

 Định nghĩa: Phản biện hình thức là quá trình kiểm tra mã nguồn để phát hiện các lỗi,
điều kiện không mong muốn hoặc tiềm ẩn trong mã mà không cần thực thi chương trình.
 Các công cụ: Thường sử dụng các công cụ phân tích mã nguồn tự động như SonarQube,
Pylint, ESLint, Coverity, và các công cụ kiểm tra mã hợp chuẩn.

 Phản biện chéo (Peer Review):

 Định nghĩa: Phản biện chéo là quá trình các nhà phát triển hoặc kiểm thử viên khác nhau
xem xét mã nguồn để phát hiện lỗi và cải thiện chất lượng mã.
 Phương pháp: Thường được thực hiện thông qua các cuộc họp, đánh giá mã từ các
thành viên khác trong nhóm phát triển hoặc các bên ngoài.

 Thông qua (Walkthrough):

 Định nghĩa: Thông qua là một loại phản biện chéo tập trung vào việc kiểm tra và phân
tích mã nguồn một cách chi tiết, nhằm tăng cường hiểu biết về mã và phát hiện lỗi.
 Mục đích: Các nhóm thực hiện walkthrough để đảm bảo rằng mọi người trong nhóm đều
hiểu mã nguồn và không bỏ sót lỗi.

 Thanh tra (Inspection):


 Định nghĩa: Thanh tra là một loại phản biện chéo có cấu trúc hơn, tập trung vào việc
kiểm tra từng phần của mã nguồn để tìm lỗi cụ thể hoặc không phù hợp với quy tắc.
 Phương pháp: Các cuộc thanh tra thường theo một tiêu chuẩn hoặc hướng dẫn cụ thể để
đảm bảo rằng tất cả các khía cạnh của mã đều được kiểm tra.

 Các chuẩn và hướng dẫn trong lập trình:

 Định nghĩa: Các chuẩn và hướng dẫn lập trình như MISRA-C (cho C/C++), PEP-8 (cho
Python), và các hướng dẫn lập trình nội bộ của công ty cũng có thể được sử dụng làm
phương tiện để kiểm tra mã nguồn.
 Áp dụng: Đảm bảo rằng mã nguồn tuân thủ các quy tắc lập trình và tiêu chuẩn đã được
thiết lập, giúp cải thiện tính ổn định và bảo trì của phần mềm.

 Danh sách các hạng mục chung cho việc khảo sát mã nguồn:

 Định nghĩa: Các hạng mục này là những điểm cụ thể trong mã nguồn mà các kỹ sư kiểm
thử hộp trắng tĩnh thường kiểm tra để đảm bảo chất lượng mã.
 Ví dụ: Bao gồm kiểm tra cấu trúc điều khiển (như các câu lệnh if, switch), xử lý lỗi, quản
lý bộ nhớ, bảo mật, hiệu suất, và tuân thủ các quy tắc lập trình.

7. Các kỹ thuật kiểm thử hàm: kiểm thử giá trị biên (Kiểm thử giá trị biên
mạnh, Kiểm thử giá trị biên tổ hợp, Kiểm thử các giá trị đặc biệt), kiểm thử
lớp tương đương (Kiểm thử lớp tương đương yếu, Kiểm thử lớp tương
đương mạnh, Kiểm thử lớp tương đương đơn giản), kiểm thử bằng bảng
quyết định, kiểm thử tổ hợp.

1. Kiểm thử giá trị biên (Boundary Value Testing):

Kiểm thử giá trị biên mạnh (Strong Boundary Value Testing):

 Mô tả: Kiểm tra các giá trị ở cả hai đầu của miền giá trị có thể có của các biến đầu vào,
bao gồm giá trị nhỏ nhất, giá trị lớn nhất và các giá trị ngay sát với chúng.

Kiểm thử giá trị biên tổ hợp (Combination of Boundary Value Testing):

 Mô tả: Kết hợp các giá trị biên của nhiều biến đầu vào để kiểm tra sự tương tác giữa
chúng.

Kiểm thử các giá trị đặc biệt (Special Value Testing):

 Mô tả: Kiểm tra các giá trị mà người dùng hoặc hệ thống có thể coi là đặc biệt hoặc
ngoại lệ, như các giá trị 0, giá trị trống, hoặc các ký tự đặc biệt.

2. Kiểm thử lớp tương đương (Equivalence Class Testing):

Kiểm thử lớp tương đương yếu (Weak Equivalence Class Testing):
 Mô tả: Chia các giá trị đầu vào thành các lớp tương đương mà trong mỗi lớp, hệ thống
được kỳ vọng sẽ xử lý giống nhau. Chỉ cần kiểm tra một giá trị từ mỗi lớp.

Kiểm thử lớp tương đương mạnh (Strong Equivalence Class Testing):

 Mô tả: Kiểm tra tất cả các giá trị trong mỗi lớp tương đương để đảm bảo tất cả các giá trị
đều được xử lý đúng.

Kiểm thử lớp tương đương đơn giản (Simple Equivalence Class Testing):

 Mô tả: Chia các giá trị đầu vào thành các lớp tương đương đơn giản và kiểm tra một số ít
giá trị đại diện từ mỗi lớp.

3. Kiểm thử bằng bảng quyết định (Decision Table Testing):

 Mô tả: Sử dụng bảng quyết định để xác định tất cả các kết hợp có thể có của các điều
kiện và hành động tương ứng trong hệ thống. Kiểm thử dựa trên việc kiểm tra mỗi cặp
điều kiện-hành động.

4. Kiểm thử tổ hợp (Combination Testing):

 Mô tả: Kiểm thử tất cả các tổ hợp có thể có của các giá trị đầu vào để đảm bảo rằng hệ
thống xử lý đúng trong mọi tình huống.

8. Trình bày quy trình kiểm thử dựa trên mô hình và lấy ví dụ minh hoạ

1. Xác định yêu cầu kiểm thử

Trong giai đoạn này, nhóm kiểm thử tập trung vào việc hiểu yêu cầu và các tính năng của phần
mềm để xác định các kịch bản kiểm thử.

2. Lập kế hoạch kiểm thử

Mô tả: Lập kế hoạch để xác định phạm vi, tài nguyên, lịch trình và các phương pháp kiểm thử cụ
thể.

3. Thiết kế các ca kiểm thử

Mô tả: Thiết kế các ca kiểm thử dựa trên các yêu cầu và các trường hợp sử dụng được xác định
trước đó.

4. Triển khai và thực thi kiểm thử

Mô tả: Thực hiện các ca kiểm thử đã thiết kế, ghi nhận kết quả và báo cáo lại cho nhóm phát
triển.

5. Phân tích và báo cáo kết quả kiểm thử

Mô tả: Đánh giá kết quả kiểm thử để xác định các lỗi, vấn đề và hiệu suất của phần mềm.
6. Kiểm tra hệ thống và kiểm thử hệ thống tích hợp

Mô tả: Kiểm tra các tương tác giữa các thành phần của hệ thống và xác minh tính tương thích.

7. Phê duyệt và triển khai

Mô tả: Phê duyệt kết quả kiểm thử và triển khai phần mềm.

Ví dụ minh họa:

Giả sử bạn là một nhà phát triển đang làm việc trên một dự án ứng dụng di động cho một cửa
hàng bán lẻ. Sau khi xây dựng các tính năng cơ bản như đăng nhập, tìm kiếm sản phẩm và thanh
toán, bạn cần kiểm tra tính năng tìm kiếm sản phẩm. Quy trình kiểm thử sẽ bao gồm:

 Xác định yêu cầu kiểm thử: Yêu cầu chính là đảm bảo tính năng tìm kiếm sản phẩm hoạt động
chính xác và mượt mà.
 Lập kế hoạch kiểm thử: Xác định số lượng và loại ca kiểm thử cần thiết, lựa chọn công cụ kiểm
thử phù hợp.
 Thiết kế các ca kiểm thử: Thiết kế các ca kiểm thử để kiểm tra tính năng tìm kiếm theo tên sản
phẩm, danh mục, giá cả và sự phù hợp với các tiêu chí khác.
 Triển khai và thực thi kiểm thử: Thực thi các ca kiểm thử và ghi nhận kết quả.
 Phân tích và báo cáo kết quả kiểm thử: Phân tích kết quả để xác định và báo cáo lỗi và vấn đề
liên quan đến tính năng tìm kiếm sản phẩm.
 Kiểm tra hệ thống và kiểm thử hệ thống tích hợp: Kiểm tra tích hợp giữa tính năng tìm kiếm và
các chức năng khác như thanh toán để đảm bảo hoạt động ổn định.
 Phê duyệt và triển khai: Phê duyệt và triển khai bản phát hành sau khi đã đảm bảo tính ổn định
và chất lượng của tính năng tìm kiếm sản phẩm.

9. Trình bày các phương pháp đặc tả mô hình phổ biến.

1. Biểu đồ lớp (Class Diagram):

 Mô tả: Một loại biểu đồ UML dùng để mô tả cấu trúc tĩnh của hệ thống bằng cách hiển
thị các lớp, thuộc tính, phương thức, và các mối quan hệ giữa các đối tượng.
 Ứng dụng: Thường được sử dụng để thiết kế và phân tích cấu trúc của hệ thống trước khi
viết mã.

2. Biểu đồ trạng thái (State Diagram):

 Mô tả: Biểu đồ UML mô tả các trạng thái khác nhau của một đối tượng trong suốt vòng
đời của nó và các sự kiện chuyển đổi giữa các trạng thái.
 Ứng dụng: Hữu ích trong việc mô hình hóa hành vi của các đối tượng có trạng thái phức
tạp.

3. Biểu đồ hoạt động (Activity Diagram):

 Mô tả: Biểu đồ UML mô tả luồng công việc hay hoạt động trong một hệ thống, bao gồm
các hoạt động song song và điều kiện rẽ nhánh.
 Ứng dụng: Sử dụng để mô hình hóa quy trình kinh doanh và luồng công việc.
4. Biểu đồ tuần tự (Sequence Diagram):

 Mô tả: Biểu đồ UML thể hiện sự tương tác giữa các đối tượng trong một hệ thống theo
trình tự thời gian. Nó hiển thị các đối tượng tham gia, thông điệp trao đổi giữa chúng, và
thời gian thực hiện.
 Ứng dụng: Hữu ích trong việc thiết kế và phân tích các trường hợp sử dụng và các kịch
bản cụ thể.

5. Biểu đồ cộng tác (Collaboration Diagram):

 Mô tả: Biểu đồ UML tập trung vào cấu trúc của sự tương tác giữa các đối tượng. Nó cho
thấy các đối tượng và mối quan hệ của chúng, cùng với các thông điệp trao đổi.
 Ứng dụng: Thường được sử dụng khi cần nhấn mạnh cấu trúc của sự tương tác hơn là
trình tự thời gian.

6. Biểu đồ thành phần (Component Diagram):

 Mô tả: Biểu đồ UML hiển thị các thành phần của hệ thống và các mối quan hệ giữa
chúng. Các thành phần này có thể là các module, lớp, hoặc các đối tượng khác.
 Ứng dụng: Sử dụng để mô hình hóa kiến trúc của hệ thống và cách các thành phần khác
nhau tương tác.

7. Biểu đồ triển khai (Deployment Diagram):

 Mô tả: Biểu đồ UML mô tả cách thức triển khai các thành phần phần mềm lên phần
cứng. Nó hiển thị các nút phần cứng, các thành phần được triển khai trên các nút này, và
các mối quan hệ giữa chúng.
 Ứng dụng: Sử dụng để mô hình hóa kiến trúc vật lý của hệ thống, đặc biệt là trong các
hệ thống phân tán.

8. Biểu đồ trường hợp sử dụng (Use Case Diagram):

 Mô tả: Biểu đồ UML mô tả các yêu cầu chức năng của hệ thống dưới dạng các trường
hợp sử dụng và các tác nhân (người dùng hoặc hệ thống khác) tương tác với chúng.
 Ứng dụng: Hữu ích trong việc thu thập và xác định các yêu cầu chức năng của hệ thống
từ góc nhìn của người dùng.

9. Mô hình dữ liệu thực thể - quan hệ (Entity-Relationship Diagram - ERD):

 Mô tả: Biểu đồ mô tả cấu trúc dữ liệu của hệ thống, bao gồm các thực thể, thuộc tính, và
các mối quan hệ giữa các thực thể.
 Ứng dụng: Sử dụng để thiết kế và phân tích cấu trúc cơ sở dữ liệu.

10. Làm thế nào để sinh ca kiểm thử từ mô hình.

1. Hiểu mô hình phần mềm


 Đánh giá mô hình phần mềm: Đầu tiên, bạn cần hiểu rõ mô hình phát triển phần mềm đang sử
dụng (ví dụ: mô hình Waterfall, Agile, Spiral, etc.). Mỗi mô hình có các giai đoạn và các tài liệu
khác nhau, và sẽ có các yêu cầu kiểm thử riêng biệt.

2. Thu thập thông tin từ mô hình

 Xem xét tài liệu mô hình: Xem qua các tài liệu của mô hình như tài liệu yêu cầu, bản thiết kế, tài
liệu kiểm thử, tài liệu kỹ thuật và các bản mô tả chức năng để hiểu các tính năng và yêu cầu của
phần mềm.

3. Xác định các ca kiểm thử

 Phân tích yêu cầu: Dựa trên mô hình và tài liệu, phân tích các yêu cầu để xác định các
kịch bản kiểm thử. Các kịch bản này phải bao gồm các trường hợp sử dụng và các kịch
bản khác mà người dùng cuối có thể sử dụng để tương tác với hệ thống.
 Sử dụng mô hình để xác định các ca kiểm thử: Dựa trên các yêu cầu, sử dụng mô hình
để xác định các ca kiểm thử cụ thể cho từng phần của hệ thống. Ví dụ, trong mô hình
Agile, bạn có thể sử dụng các user story để tạo các ca kiểm thử; trong mô hình Waterfall,
sử dụng các tài liệu yêu cầu và thiết kế để tạo các ca kiểm thử.

4. Thiết kế và viết các ca kiểm thử

 Thiết kế các ca kiểm thử: Viết các bộ dữ liệu đầu vào, các bước thực hiện và các kết
quả dự kiến cho mỗi ca kiểm thử. Các ca kiểm thử nên phản ánh các trường hợp sử dụng
thực tế và các yêu cầu chức năng của phần mềm.
 Đảm bảo toàn diện: Đảm bảo rằng các ca kiểm thử bao gồm các trường hợp biên, các
tình huống bất thường và các kịch bản tương tự mà người dùng cuối có thể gặp phải khi
sử dụng phần mềm.

5. Thực hiện kiểm thử

 Triển khai và thực hiện các ca kiểm thử: Sử dụng các ca kiểm thử được thiết kế để thực hiện
kiểm thử phần mềm. Ghi nhận các kết quả kiểm thử và đánh giá tính năng và hiệu suất của phần
mềm dựa trên các ca kiểm thử đã triển khai.

6. Phân tích kết quả kiểm thử

 Phân tích và báo cáo kết quả: Phân tích các kết quả kiểm thử để xác định và báo cáo về các lỗi,
vấn đề và các cải tiến cần thiết để cải thiện chất lượng phần mềm.

11. Trình bày kiến trúc của một bộ công cụ kiểm thử tự động

1. Giao diện người dùng (User Interface - UI):

 Mô tả: Giao diện người dùng là phần mà người sử dụng (thường là kỹ sư kiểm thử) tương tác để
thiết lập, quản lý và thực thi các ca kiểm thử.
 Chức năng: Cung cấp các công cụ để tạo, chỉnh sửa và quản lý các kịch bản kiểm thử. Đây là nơi
người dùng nhập dữ liệu đầu vào cho các ca kiểm thử, chọn các tập lệnh để thực hiện, xem và
phân tích kết quả kiểm thử.
2. Thư viện và công cụ hỗ trợ (Libraries and Support Tools):

 Mô tả: Bao gồm các thư viện và công cụ phần mềm cần thiết để thực hiện các ca kiểm thử và xử
lý kết quả.
 Chức năng: Cung cấp các API và thư viện cho việc tương tác với ứng dụng kiểm thử, giao tiếp với
các hệ thống bên ngoài (như cơ sở dữ liệu, API, các ứng dụng khác), quản lý dữ liệu mẫu (sample
data), và phân tích kết quả kiểm thử.

3. Bộ thực thi kiểm thử (Test Execution Engine):

 Mô tả: Phần quản lý và thực thi các ca kiểm thử được định nghĩa từ giao diện người dùng.
 Chức năng: Điều khiển quá trình thực thi các ca kiểm thử, gửi các lệnh và dữ liệu đầu vào tới
ứng dụng cần kiểm thử, thu thập và ghi lại kết quả từ ứng dụng sau khi thực thi các ca kiểm thử.

4. Bộ quản lý kết quả (Result Management):

 Mô tả: Phần quản lý và phân tích các kết quả từ các ca kiểm thử.
 Chức năng: Lưu trữ, hiển thị và phân tích các kết quả kiểm thử, bao gồm cả các báo cáo chi tiết
và tổng quan về trạng thái của các ca kiểm thử. Cung cấp các công cụ để phân tích sự thay đổi
trong kết quả theo thời gian và đối chiếu với các lần chạy trước đó.

5. Cơ sở dữ liệu (Database):

 Mô tả: Lưu trữ và quản lý dữ liệu liên quan đến các ca kiểm thử và kết quả.
 Chức năng: Bao gồm lưu trữ các kịch bản kiểm thử, dữ liệu đầu vào, kết quả kiểm thử và các
thông tin liên quan. Dữ liệu này có thể được sử dụng để phân tích hiệu suất, đánh giá tiến độ và
so sánh giữa các phiên bản phần mềm khác nhau.

6. Giao tiếp và tích hợp (Integration and Communication):

 Mô tả: Cung cấp các cơ chế để liên kết và tích hợp với các công cụ và hệ thống khác trong quy
trình phát triển phần mềm.
 Chức năng: Hỗ trợ giao tiếp với các công cụ quản lý dự án (Project Management Tools), hệ
thống quản lý mã nguồn (Version Control Systems), các công cụ tự động hóa khác (Automation
Tools), và các hệ thống triển khai (Deployment Systems).

12. Trình bày về kiểm thử tích hợp

1. Loại hình kiểm thử tích hợp:

 Kiểm thử tích hợp nhỏ (Incremental Integration Testing): Các thành phần phần mềm
được kết hợp từng bước một và kiểm tra tính tương thích, sự hoạt động của từng cặp
thành phần. Các lỗi có thể được phát hiện và sửa chữa ngay khi các thành phần mới được
thêm vào hệ thống.
 Kiểm thử hạt nhân (Big Bang Integration Testing): Tất cả các thành phần được kết
hợp lại với nhau một cách đồng thời và kiểm tra hoạt động của toàn bộ hệ thống. Phương
pháp này thường được sử dụng khi các thành phần đã ổn định và kiểm thử cuối cùng
trước khi phát hành.
 Kiểm thử hợp nhất (Top-Down Integration Testing): Kiểm thử bắt đầu từ thành phần
cấp cao nhất của hệ thống và từ từ tích hợp các thành phần con hơn. Các phần còn lại có
thể được giả lập hoặc sử dụng giả thay thế để giúp trong việc kiểm thử.
 Kiểm thử đáy lên (Bottom-Up Integration Testing): Kiểm thử bắt đầu từ các thành
phần cấp thấp nhất và từ từ tích hợp các thành phần cao hơn. Các chức năng quan trọng
nhất thường được thử nghiệm sớm hơn và có thể được giả lập để giúp kiểm thử.

2. Chiến lược kiểm thử:

 Kiểm thử hàm (Component Integration Testing): Kiểm tra tích hợp các module hoặc
thành phần con của hệ thống để đảm bảo rằng chúng hoạt động đúng đắn khi được kết
nối với nhau.
 Kiểm thử giao tiếp (Interface Integration Testing): Xác nhận tính tương thích của các
giao diện giữa các thành phần khác nhau để đảm bảo truyền thông và trao đổi dữ liệu
diễn ra một cách chính xác.
 Kiểm thử dịch vụ (Service Integration Testing): Kiểm tra tích hợp các dịch vụ hoặc
các thành phần dịch vụ của hệ thống để đảm bảo rằng chúng hoạt động như mong đợi khi
được sử dụng cùng nhau.

3. Các bước thực hiện kiểm thử tích hợp:

 Lập kế hoạch kiểm thử: Xác định các thành phần cần kiểm thử, chiến lược kiểm thử
phù hợp và tài nguyên cần thiết cho quá trình kiểm thử tích hợp.
 Thiết lập môi trường kiểm thử: Chuẩn bị môi trường kiểm thử với các bản sao của các
thành phần và dữ liệu giả lập (nếu cần).
 Thực hiện kiểm thử: Thực hiện các ca kiểm thử theo kế hoạch đã lập trình và ghi lại kết
quả.
 Phân tích và báo cáo kết quả: Đánh giá kết quả kiểm thử, báo cáo các lỗi phát hiện và
đề xuất các biện pháp khắc phục.

4. Lợi ích của kiểm thử tích hợp:

 Phát hiện lỗi sớm: Giúp phát hiện và sửa chữa các lỗi tích hợp từ giai đoạn sớm của quá
trình phát triển phần mềm.
 Đảm bảo tính tương thích: Xác nhận tính tương thích giữa các thành phần và các yêu
cầu chức năng của hệ thống.
 Tăng khả năng mở rộng: Cho phép kiểm tra và xác nhận rằng hệ thống có thể mở rộng
một cách hợp lý với các thành phần mới được thêm vào.
 Nâng cao chất lượng: Cải thiện chất lượng của sản phẩm bằng cách giảm thiểu các lỗi
tích hợp và đảm bảo tính hoạt động ổn định.

13. Trình bày về kiểm thử hệ thống là gì, những nội dung cần kiểm thử là gì?

Kiểm thử hệ thống là quá trình kiểm tra toàn diện và tổng thể của hệ thống phần mềm để đảm
bảo rằng nó hoạt động đúng đắn và đáp ứng được các yêu cầu kỹ thuật và chức năng đã đặt ra.
Đây là giai đoạn cuối cùng trong quy trình phát triển phần mềm trước khi triển khai vào môi
trường sản xuất. Mục tiêu chính của kiểm thử hệ thống là xác nhận tính toàn vẹn của hệ thống và
đảm bảo rằng nó đáp ứng được mong đợi của người sử dụng cuối cùng.
Các nội dung cần kiểm thử trong kiểm thử hệ thống bao gồm:

1. Chức năng (Functional Testing):


o Kiểm tra xem hệ thống hoạt động như mong đợi hay không, bao gồm các chức năng cơ
bản và nâng cao.
o Đảm bảo rằng các tính năng hoạt động đúng và không có lỗi.
o Kiểm tra các kịch bản sử dụng để đảm bảo các tính năng là hoàn chỉnh và phản ứng như
mong đợi.

2. Tích hợp (Integration Testing):


o Kiểm tra tích hợp giữa các thành phần phần mềm để đảm bảo chúng hoạt động một
cách hợp lý khi được kết hợp lại với nhau.
o Đảm bảo rằng các giao tiếp giữa các thành phần là ổn định và dữ liệu được truyền tải
chính xác.

3. Bảo mật (Security Testing):


o Kiểm tra các lỗ hổng bảo mật trong hệ thống để đảm bảo rằng nó an toàn và bảo mật
khi hoạt động trong môi trường thực tế.
o Xác định và giảm thiểu các rủi ro bảo mật như lỗ hổng SQL injection, XSS (Cross-Site
Scripting), CSRF (Cross-Site Request Forgery) và các vấn đề liên quan đến quản lý danh
tính.

4. Độ tin cậy (Reliability Testing):


o Kiểm tra tính ổn định và độ tin cậy của hệ thống trong điều kiện tải cao và thời gian dài.
o Xác định khả năng phục hồi sau khi xảy ra lỗi và đảm bảo rằng hệ thống không bị sập
hoàn toàn khi có vấn đề xảy ra.

5. Hiệu năng (Performance Testing):


o Kiểm tra khả năng của hệ thống xử lý số lượng lớn người dùng và giao dịch trong cùng
một thời gian.
o Đánh giá và tối ưu hóa tốc độ phản hồi của hệ thống, thời gian phản hồi và khả năng
chịu tải.

6. Tính tương thích (Compatibility Testing):


o Kiểm tra tính tương thích của hệ thống với các nền tảng phần cứng, phần mềm và môi
trường khác nhau.
o Đảm bảo rằng hệ thống hoạt động đúng trên các trình duyệt web, hệ điều hành và thiết
bị khác nhau mà người dùng có thể sử dụng.

7. Hồi phục sau sự cố (Recovery Testing):


o Kiểm tra khả năng của hệ thống phục hồi sau khi xảy ra sự cố như mất điện, sự cố phần
cứng hoặc phần mềm.
o Đảm bảo rằng dữ liệu không bị mất và hệ thống có thể khôi phục lại sau khi có sự cố.

14. Bạn hãy trình bày về mục tiêu của kiểm thử an toàn và các nội dung các loại
kiểm thử an toàn.

Kiểm thử an toàn (Security Testing) là quá trình kiểm tra hệ thống, ứng dụng hoặc môi trường để
phát hiện các lỗ hổng bảo mật có thể bị khai thác bởi các kẻ tấn công. Mục tiêu chính của kiểm
thử an toàn là bảo vệ hệ thống khỏi các cuộc tấn công và đảm bảo tính bảo mật của thông tin
quan trọng. Các nội dung chính của kiểm thử an toàn bao gồm:

1. Phát hiện lỗ hổng bảo mật: Kiểm thử an toàn tập trung vào việc tìm ra các lỗ hổng bảo
mật trong hệ thống, chẳng hạn như các lỗ hổng về xác thực, ủy quyền, kiểm soát truy cập,
hay các lỗ hổng mã độc.
2. Đánh giá rủi ro (Risk Assessment): Quá trình này giúp định danh và đánh giá các rủi ro
tiềm ẩn mà các lỗ hổng bảo mật có thể gây ra, từ đó đưa ra các biện pháp phòng ngừa và
cải tiến.
3. Kiểm tra và xác minh tuân thủ: Kiểm thử an toàn cũng có thể liên quan đến việc kiểm
tra xem hệ thống, ứng dụng hoặc công nghệ tuân thủ các tiêu chuẩn bảo mật nhất định
như PCI-DSS (Payment Card Industry Data Security Standard) hay GDPR (General Data
Protection Regulation).
4. Kiểm tra khả năng chống chịu (Resilience Testing): Kiểm thử này tập trung vào việc
kiểm tra khả năng của hệ thống chống lại các cuộc tấn công hoặc các hành động tấn công
mạng nhằm giảm thiểu tác động của chúng.
5. Kiểm thử bảo mật ứng dụng (Application Security Testing): Tập trung vào việc phát
hiện và khắc phục các lỗ hổng bảo mật trong ứng dụng phần mềm, bao gồm cả việc kiểm
tra mã nguồn và kiểm tra hành vi ứng dụng.
6. Kiểm thử bảo mật hệ thống (Network Security Testing): Tập trung vào kiểm tra các
thiết bị mạng, cấu hình hệ thống, và các cơ chế bảo mật mạng để đảm bảo tính bảo mật
toàn diện của hệ thống.

15. Phân biệt kiểm thử hệ thống, kiểm thử chấp nhận và kiểm thử hồi quy

 Kiểm thử hệ thống (System Testing):

 Mục đích: Kiểm thử hệ thống nhằm kiểm tra toàn bộ hệ thống hoạt động như mong đợi
hay không trước khi triển khai.
 Phạm vi: Tập trung vào kiểm tra hệ thống toàn diện, bao gồm cả tích hợp giữa các thành
phần.
 Đối tượng: Kiểm thử hệ thống thường áp dụng cho hệ thống đã hoàn thiện để đảm bảo
tính ổn định và chức năng của toàn bộ hệ thống.

 Kiểm thử chấp nhận (Acceptance Testing):

 Mục đích: Kiểm thử chấp nhận là để xác nhận rằng hệ thống hoặc phần mềm đáp ứng
các yêu cầu và mong đợi của người dùng cuối.
 Phạm vi: Thường được thực hiện từ góc nhìn của người dùng cuối hoặc khách hàng để
đảm bảo tính hợp lý và sự phù hợp của hệ thống.
 Loại kiểm thử: Có thể bao gồm kiểm thử chấp nhận người dùng (User Acceptance
Testing - UAT) hoặc kiểm thử chấp nhận hệ thống (System Acceptance Testing - SAT).

 Kiểm thử hồi quy (Regression Testing):

 Mục đích: Kiểm thử hồi quy nhằm đảm bảo rằng các thay đổi, sửa đổi hoặc bổ sung mới
không ảnh hưởng đến tính chất hoạt động của các tính năng đã kiểm tra trước đó.
 Phạm vi: Tập trung vào kiểm tra các tính năng, chức năng đã kiểm tra trong quá trình
phát triển để đảm bảo tính ổn định và không có tác động phụ từ các thay đổi mới.
 Thực hiện: Thường được thực hiện tự động để tiết kiệm thời gian và đảm bảo tính nhất
quán trong quá trình kiểm thử.

Tên ca kiểm Kết quả mong


STT Mô tả Dữ liệu đầu vào
thử đợi
Hệ thống từ chối
Kiểm tra chống
Kiểm thử SQL đầu vào và không
1 lại tấn công SQL '; DROP TABLE users; --
Injection thực thi câu lệnh
injection
SQL độc hại
Hệ thống không
Kiểm thử XSS
Kiểm tra chống <script>alert('XSS');</script> thực thi đoạn mã
2 (Cross-Site
lại tấn công XSS script và xử lý
Scripting)
đúng đầu vào
Thông báo lỗi
Kiểm tra xử lý
Kiểm thử ký hoặc danh sách
3 các ký tự đặc biệt @#$%^&*()
tự đặc biệt trống, không có
trong từ khóa
sản phẩm phù hợp
Kiểm tra xử lý từ Thông báo lỗi
Kiểm thử từ
4 khóa có độ dài Chuỗi ký tự dài 256 ký tự hoặc xử lý cắt bỏ
khóa quá dài
vượt quá giới hạn từ khóa
Hiển thị tất cả sản
Tìm kiếm mà
Kiểm thử từ phẩm hoặc thông
5 không nhập từ (để trống)
khóa trống báo yêu cầu nhập
khóa
từ khóa
Hệ thống từ chối
Kiểm tra xử lý
Kiểm thử khả hoặc xử lý đúng
các từ khóa có
6 năng bảo mật select, delete, update đầu vào, không
nội dung nhạy
đầu vào gây ảnh hưởng
cảm
bảo mật
Kiểm tra xem hệ Hệ thống yêu cầu
Kiểm thử tính thống có yêu cầu (Tài khoản người dùng chưa đăng đăng nhập trước
7
xác thực xác thực trước nhập) khi thực hiện tìm
khi tìm kiếm kiếm
Hệ thống từ chối
Kiểm tra từ khóa hoặc xử lý đúng
Kiểm thử từ SELECT * FROM products WHERE
8 chứa các từ khóa '1'='1' đầu vào, không
khóa SQL
SQL thực thi câu lệnh
SQL
Kiểm tra thời
Kiểm thử thời gian phản hồi của Thời gian phản
9 "sách"
gian phản hồi hệ thống khi tìm hồi dưới 2 giây
kiếm
Kiểm tra hệ Hệ thống vẫn
thống khi có hoạt động ổn định
Kiểm thử khả
10 nhiều người dùng "sách" và phản hồi trong
năng chịu tải
tìm kiếm đồng thời gian chấp
thời nhận được
Tên ca kiểm Kết quả mong
STT Mô tả Dữ liệu đầu vào
thử đợi
Hệ thống từ chối
Kiểm tra chống lại đầu vào và
Kiểm thử
1 tấn công SQL '; DROP TABLE users; -- không thực thi
SQL Injection
injection câu lệnh SQL
độc hại
Hệ thống không
Kiểm thử XSS
Kiểm tra chống lại <script>alert('XSS');</script> thực thi đoạn mã
2 (Cross-Site
tấn công XSS script và xử lý
Scripting)
đúng đầu vào
Kiểm tra xử lý các
ký tự đặc biệt Thông báo lỗi
Kiểm thử ký
3 trong tên tài @#$%^&*() hoặc từ chối đầu
tự đặc biệt
khoản và mật vào
khẩu
Kiểm thử tên Đăng nhập mà Thông báo yêu
4 tài khoản không nhập tên tài (để trống tên tài khoản) cầu nhập tên tài
trống khoản khoản
Đăng nhập mà Thông báo yêu
Kiểm thử mật
5 không nhập mật (để trống mật khẩu) cầu nhập mật
khẩu trống
khẩu khẩu
Đăng nhập với tên
Kiểm thử tên Thông báo lỗi
tài khoản có độ
6 tài khoản quá Chuỗi ký tự dài 256 ký tự hoặc xử lý cắt bỏ
dài vượt quá giới
dài tên tài khoản
hạn
Đăng nhập với
Thông báo lỗi
Kiểm thử mật mật khẩu có độ
7 Chuỗi ký tự dài 256 ký tự hoặc xử lý cắt bỏ
khẩu quá dài dài vượt quá giới
mật khẩu
hạn
Thông báo tài
Kiểm thử tên Đăng nhập với tên
khoản hoặc mật
8 tài khoản và tài khoản và mật Tên tài khoản: user, Mật khẩu:
wrongpassword khẩu không
mật khẩu sai khẩu không đúng
đúng
Kiểm tra từ khóa Hệ thống từ chối
chứa các từ khóa hoặc xử lý đúng
Kiểm thử từ SELECT * FROM users WHERE
9 SQL trong tên tài '1'='1' đầu vào, không
khóa SQL
khoản hoặc mật thực thi câu lệnh
khẩu SQL
Kiểm tra thời gian
Kiểm thử thời phản hồi của hệ Thời gian phản
10 Tên tài khoản và mật khẩu hợp lệ
gian phản hồi thống khi đăng hồi dưới 2 giây
nhập
11 Kiểm thử khả Kiểm tra hệ thống Nhiều tài khoản và mật khẩu hợp lệ Hệ thống vẫn
năng chịu tải khi có nhiều hoạt động ổn
người dùng đăng định và phản hồi
nhập đồng thời trong thời gian
Tên ca kiểm Kết quả mong
STT Mô tả Dữ liệu đầu vào
thử đợi
chấp nhận được
Kiểm tra quản lý Phiên làm việc
Kiểm thử bảo
phiên làm việc sau được quản lý an
12 mật phiên Tên tài khoản và mật khẩu hợp lệ
khi đăng nhập toàn, không bị
đăng nhập
thành công chiếm đoạt
Kiểm tra xem mật
Mật khẩu được
Kiểm thử mã khẩu có được mã
13 Tên tài khoản và mật khẩu hợp lệ mã hóa trước khi
hóa mật khẩu hóa trước khi gửi
gửi tới máy chủ
đi hay không

You might also like