Trắc nghiệm Tin học 10 Kết nối tri thức Bài 30: Kiểm thử và gỡ lỗi chương trình - Đề 02
Trắc nghiệm Tin học 10 Kết nối tri thức Bài 30: Kiểm thử và gỡ lỗi chương trình - Đề 02 bao gồm nhiều câu hỏi hay, bám sát chương trình. Cùng làm bài tập trắc nghiệm ngay.
Câu 1: Trong quá trình phát triển chương trình, kiểm thử (testing) chủ yếu nhằm mục đích gì?
- A. Chỉ để đảm bảo chương trình chạy nhanh nhất có thể.
- B. Để làm đẹp giao diện người dùng.
- C. Tìm ra lỗi và đảm bảo chương trình hoạt động đúng theo yêu cầu.
- D. Để viết tài liệu hướng dẫn sử dụng cho chương trình.
Câu 2: Đâu là điểm khác biệt cốt lõi giữa kiểm thử (testing) và gỡ lỗi (debugging)?
- A. Kiểm thử chỉ thực hiện sau khi gỡ lỗi xong.
- B. Kiểm thử là quá trình sửa lỗi, còn gỡ lỗi là quá trình tìm lỗi.
- C. Kiểm thử chỉ dùng cho lỗi cú pháp, gỡ lỗi dùng cho lỗi logic.
- D. Kiểm thử nhằm phát hiện sự tồn tại của lỗi, còn gỡ lỗi nhằm tìm nguyên nhân và sửa lỗi.
Câu 3: Khi chạy đoạn code Python sau, lỗi gì sẽ xảy ra?
```python
prnt("Hello World")
```
- A. Syntax Error (Lỗi cú pháp)
- B. NameError (Lỗi tên)
- C. TypeError (Lỗi kiểu dữ liệu)
- D. ZeroDivisionError (Lỗi chia cho 0)
Câu 4: Quan sát đoạn code sau và cho biết lỗi gì có thể xảy ra khi chạy với giá trị `n = 0`?
```python
def chia_hai_so(a, n):
ket_qua = a / n
return ket_qua
print(chia_hai_so(10, 0))
```
- A. Syntax Error
- B. IndexError
- C. ZeroDivisionError
- D. TypeError
Câu 5: Đoạn code sau sẽ gây ra lỗi gì?
```python
danh_sach = [1, 2, 3]
print(danh_sach[3])
```
- A. KeyError
- B. IndexError
- C. AttributeError
- D. ValueError
Câu 6: Khi chạy đoạn code sau, lỗi gì sẽ xuất hiện?
```python
so = 5
chuoi = "10"
ket_hop = so + chuoi
```
- A. Syntax Error
- B. NameError
- C. ZeroDivisionError
- D. TypeError
Câu 7: Đoạn code sau sẽ báo lỗi gì?
```python
def chao_mung():
print("Xin chào")
chao_mung_ai_do()
```
- A. NameError
- B. Syntax Error
- C. TypeError
- D. AttributeError
Câu 8: Một chương trình được viết để tính tổng các số từ 1 đến N. Khi chạy với N=5, chương trình cho kết quả là 10 thay vì 15. Đây có khả năng là loại lỗi nào?
- A. Syntax Error
- B. Runtime Error
- C. Logic Error
- D. Compilation Error
Câu 9: Tại sao việc sử dụng các bộ dữ liệu test đa dạng, bao gồm cả trường hợp điển hình, trường hợp biên và trường hợp không hợp lệ, lại quan trọng trong kiểm thử chương trình?
- A. Để làm cho quá trình kiểm thử nhanh hơn.
- B. Chỉ cần test với dữ liệu điển hình là đủ.
- C. Chủ yếu để kiểm tra tốc độ xử lý của chương trình.
- D. Để tăng khả năng phát hiện lỗi, đặc biệt là các lỗi xảy ra ở các trường hợp đặc biệt hoặc không mong muốn.
Câu 10: Đối với một hàm tính căn bậc hai của một số, bộ dữ liệu test nào sau đây không phải là trường hợp biên hoặc trường hợp không hợp lệ cần kiểm thử?
- A. Số âm (ví dụ: -4)
- B. Số dương lớn (ví dụ: 100)
- C. Số 0
- D. Kiểu dữ liệu không phải số (ví dụ: "abc")
Câu 11: Khi gỡ lỗi một chương trình, việc đặt điểm dừng (breakpoint) và chạy từng bước (step-by-step execution) giúp ích gì cho lập trình viên?
- A. Giúp tự động sửa lỗi chương trình.
- B. Chỉ làm chậm quá trình chạy chương trình.
- C. Giúp theo dõi luồng thực thi của chương trình và giá trị của các biến tại từng thời điểm cụ thể.
- D. Làm cho mã nguồn dễ đọc hơn.
Câu 12: Bạn đang gỡ lỗi một chương trình phức tạp. Sau khi chạy thử với một bộ dữ liệu, chương trình không cho kết quả mong muốn. Bước tiếp theo hợp lý nhất trong quy trình gỡ lỗi là gì?
- A. Xác định vị trí có khả năng xảy ra lỗi trong mã nguồn.
- B. Xóa toàn bộ mã nguồn và viết lại từ đầu.
- C. Thêm thật nhiều lệnh `print()` vào khắp nơi trong code.
- D. Bỏ qua lỗi và chuyển sang tính năng khác.
Câu 13: Loại lỗi nào sau đây thường khó phát hiện nhất chỉ bằng cách chạy thử chương trình với dữ liệu điển hình?
- A. Syntax Error
- B. NameError
- C. Logic Error
- D. ZeroDivisionError
Câu 14: Một kịch bản kiểm thử (test case) thường bao gồm những thành phần chính nào?
- A. Chỉ cần dữ liệu đầu vào.
- B. Chỉ cần kết quả đầu ra mong muốn.
- C. Chỉ cần mô tả chức năng cần kiểm thử.
- D. Dữ liệu đầu vào, kết quả đầu ra mong muốn và các bước thực hiện (nếu cần).
Câu 15: Công cụ gỡ lỗi (debugger) nào giúp bạn tạm dừng chương trình tại một dòng code cụ thể để kiểm tra trạng thái của chương trình?
- A. Điểm dừng (Breakpoint)
- B. Lệnh print()
- C. Trình biên dịch (Compiler)
- D. Trình soạn thảo mã nguồn (Code editor)
Câu 16: Bạn viết một chương trình tính diện tích hình tròn với bán kính R. Công thức là `dien_tich = 3.14 * R * R`. Nếu người dùng nhập R là chuỗi "5", lỗi gì có khả năng xảy ra?
- A. ZeroDivisionError
- B. IndexError
- C. NameError
- D. TypeError (do nhân số với chuỗi)
Câu 17: Khi kiểm thử một hàm xử lý danh sách, bộ dữ liệu test nào sau đây thuộc loại "trường hợp biên"?
- A. Một danh sách chứa 1000 phần tử.
- B. Một danh sách chứa các số nguyên tố.
- C. Một danh sách rỗng hoặc một danh sách chỉ có một phần tử.
- D. Một danh sách chứa các chuỗi.
Câu 18: Bạn đang cố gắng gỡ lỗi một vòng lặp `for` mà bạn nghi ngờ nó không chạy đúng số lần. Công cụ hoặc kỹ thuật nào sau đây hiệu quả nhất để kiểm tra giá trị của biến đếm sau mỗi lần lặp?
- A. Kiểm tra lại cú pháp của vòng lặp.
- B. Đặt điểm dừng bên trong vòng lặp và theo dõi biến đếm trong debugger.
- C. Chỉ chạy chương trình và quan sát kết quả cuối cùng.
- D. Thay đổi kiểu dữ liệu của biến đếm.
Câu 19: Một chương trình yêu cầu người dùng nhập một số nguyên dương. Nếu người dùng nhập chuỗi
- A. ZeroDivisionError
- B. IndexError
- C. NameError
- D. ValueError (Lỗi giá trị không hợp lệ)
Câu 20: Lợi ích chính của việc gỡ lỗi từng bước (stepping over, stepping into) trong debugger là gì?
- A. Tự động sửa lỗi cho bạn.
- B. Làm cho chương trình chạy nhanh hơn.
- C. Cho phép bạn đi sâu vào chi tiết việc thực thi của từng dòng lệnh hoặc hàm, giúp xác định chính xác nơi lỗi xảy ra.
- D. Giúp chương trình tự động tạo ra các bộ test.
Câu 21: Khi chương trình Python gặp một lỗi ngoại lệ (exception) mà không có cơ chế xử lý lỗi (ví dụ: khối `try...except`), điều gì thường xảy ra?
- A. Chương trình sẽ tự động sửa lỗi và tiếp tục chạy.
- B. Chương trình sẽ dừng đột ngột và hiển thị thông báo lỗi (traceback).
- C. Chương trình sẽ bỏ qua lỗi và tiếp tục thực thi các dòng lệnh khác.
- D. Chương trình sẽ tự động khởi động lại.
Câu 22: Bạn viết một hàm kiểm tra xem một năm có phải là năm nhuận hay không. Theo quy tắc, năm nhuận là năm chia hết cho 4, trừ các năm chia hết cho 100 mà không chia hết cho 400. Bộ dữ liệu test nào sau đây là đầy đủ nhất để kiểm tra hàm này?
- A. 2000, 2004, 2023
- B. 1900, 2000, 2100
- C. 2020, 2024, 2028
- D. 1900 (chia hết 100, không chia hết 400 - không nhuận), 2000 (chia hết 400 - nhuận), 2023 (không chia hết 4 - không nhuận), 2024 (chia hết 4, không chia hết 100 - nhuận).
Câu 23: Lệnh `print()` có thể được sử dụng như một công cụ gỡ lỗi cơ bản. Tuy nhiên, nó có nhược điểm gì so với việc sử dụng debugger chuyên nghiệp?
- A. Cần phải thêm/bớt lệnh `print()` trong code, có thể làm thay đổi code gốc và tạo ra output rườm rà; không thể tạm dừng chương trình tương tác.
- B. Không thể in ra giá trị của biến.
- C. Chỉ hoạt động với các lỗi cú pháp.
- D. Làm cho chương trình chạy nhanh hơn một cách đáng kể.
Câu 24: Trong quá trình gỡ lỗi, sau khi đã xác định và sửa lỗi, bước cuối cùng quan trọng là gì?
- A. Gửi chương trình cho người dùng sử dụng ngay lập tức.
- B. Xóa bỏ tất cả các bộ dữ liệu test cũ.
- C. Kiểm thử lại chương trình với các bộ dữ liệu test ban đầu (và có thể thêm bộ test mới) để xác nhận lỗi đã được sửa và không phát sinh lỗi mới.
- D. Thay đổi hoàn toàn cấu trúc của chương trình.
Câu 25: Loại lỗi nào thường được phát hiện bởi trình thông dịch (interpreter) hoặc trình biên dịch (compiler) trước khi chương trình kịp thực thi?
- A. Syntax Error
- B. Runtime Error
- C. Logic Error
- D. Semantic Error
Câu 26: Cho đoạn code:
```python
def tinh_giam_gia(gia, phan_tram):
if phan_tram > 100:
phan_tram = 100
gia_sau_giam = gia - (gia * phan_tram / 100)
return gia_sau_giam
print(tinh_giam_gia(200, 50))
print(tinh_giam_gia(100, 120))
```
Khi chạy đoạn code này, kết quả in ra cho lần gọi thứ hai (`tinh_giam_gia(100, 120)`) là bao nhiêu? (Đây là câu hỏi kiểm tra khả năng phân tích logic code).
- A. -20.0
- B. 0.0
- C. 100.0
- D. Sẽ xảy ra lỗi.
Câu 27: Bạn viết một hàm nhận vào một danh sách số và trả về số lớn nhất trong danh sách đó. Bộ dữ liệu test nào sau đây sẽ giúp bạn kiểm tra xem hàm có xử lý đúng trường hợp danh sách chỉ có một phần tử không?
- A. [] (danh sách rỗng)
- B. [1, 5, 2, 8]
- C. [7]
- D. [10, 10, 10]
Câu 28: Gỡ lỗi là một kỹ năng quan trọng. Điều gì sau đây không phải là một phương pháp gỡ lỗi hiệu quả?
- A. Sử dụng công cụ debugger để theo dõi biến và luồng thực thi.
- B. Giải thích code của bạn cho người khác (hoặc cho chính bạn như thể cho người khác).
- C. Cô lập phần code nghi ngờ có lỗi để kiểm tra riêng.
- D. Thay đổi code một cách ngẫu nhiên cho đến khi chương trình chạy mà không báo lỗi.
Câu 29: Việc kiểm thử hồi quy (regression testing) là gì và tại sao nó lại cần thiết sau khi sửa lỗi hoặc thêm tính năng mới?
- A. Kiểm thử lại các tính năng đã có để đảm bảo việc thay đổi/sửa lỗi không làm phát sinh lỗi mới hoặc phá vỡ chức năng cũ.
- B. Chỉ kiểm thử các tính năng mới được thêm vào.
- C. Chỉ kiểm thử các lỗi đã sửa để đảm bảo chúng không tái diễn.
- D. Kiểm thử hiệu suất của chương trình.
Câu 30: Trong Python, lỗi `KeyError` thường xảy ra khi nào?
- A. Khi chia cho số 0.
- B. Khi cố gắng truy cập một khóa (key) không tồn tại trong từ điển (dictionary).
- C. Khi chỉ số truy cập vượt quá phạm vi của danh sách.
- D. Khi sử dụng một biến chưa được khai báo.