Để phát hiện lỗi sai cũng như kiểm duyệt các chương trình trước khi đưa vào thực tế sử dụng người ta thường sử dụng các phương pháp kiểm thử. Nội dung bài giảng của Bài 30: Kiểm thử và gỡ lỗi chương trình sẽ giúp các em tìm hiểu một số phương pháp kiểm thử và gỡ lỗi chương trình. Mời các em cùng tham khảo!
Tóm tắt lý thuyết
1.1. Một vài phương pháp kiểm thử chương trình
- Kiểm thử (test) có nghĩa là kiểm tra và chạy thử
- Lỗi tiếng Anh là bug (bug có nghĩa đen là con bọ)
- Debug là de (lấy ra) bug (con bọ) = gỡ lỗi chương trình. Vậy debug là tìm bug và tháo bỏ bug ra khỏi chương trình
- Có rất nhiều phương pháp và công cụ khác nhau để kiểm thử chương trình. Các công cụ này không những có mục đích tìm ra lỗi (hay bug) của chương trình mà còn có tác dụng phòng ngừa và ngăn chặn các lỗi phát sinh tiếp trong tương lai.
* Một vài phương pháp kiểm thử chương trình
a) Quan sát mã lỗi Runtime và bắt lỗi ngoại lệ
- Nếu chương trình có lỗi Runtime (tức là đang chạy bị dừng lại), cần quan sát các mã lỗi (mã lỗi ngoại lệ) để kiểm tra vị trí dòng lệnh sinh ra lỗi này. Từ đó phân tích, tìm và sửa lỗi.
- Một số mã lỗi ngoại lệ thường gặp:
Mã lỗi ngoại lệ |
Mô tả lỗi |
ZeroDivisionError |
Lỗi này xảy ra khi lệnh thực hiện phép chia cho giá trị 0. |
IndexError |
Lỗi xảy ra khi lệnh cố gắng truy cập phần tử của danh sách nhưng chỉ số vượt quá giới hạn. |
NameError |
Lỗi xảy ra khi chương trình muốn tìm một tên nhưng không thấy. Ví dụ khi lệnh gọi một hàm nhưng không có hàm đó. |
TypeError |
Lỗi kiểu dữ liệu. Một số ví dụ lỗi loại này: - Lệnh truy câp một phần tử của danh sách nhưng chỉ số không là số nguyên. - Lệnh tính biểu thức số nhưng lại có một toán hạng không phải là số. |
ValueError |
Lỗi liên quan đến giá trị của đối tượng. Lỗi khi thực hiện lệnh chuyển đổi kiểu dữ liệu, đối số của hàm có giá trị mà hàm không hỗ trợ. Ví dụ khi thực hiện lệnh int("1.55") sẽ sinh lỗi loại này. |
IndentationError |
Lỗi khi các dòng lệnh thụt vào không thằng hàng hoặc không đúng vị trí. |
SyntaxError |
Lỗi cú pháp. |
- Ví dụ: Một số mã lỗi trong thực tế
+ Mã lỗi IndexError:
+ Mã lỗi ValueError
b) Kiểm thử chương trình với các bộ dữ liệu test
- Chương trình cần được thử với một số bộ dữ liệu test gồm đầu vào tiêu biểu phụ thuộc đặc thù của bài toán và kết quả đầu ra đã biết trước.
- Các bộ test có thể có đầu vào theo các tiêu chí khác nhau như độ lớn và tính đa dạng của dữ liệu, cần chú ý một số điểm sau:
+ Cần có nhiều bộ test (theo các tiêu chí khác nhau như độ lớn, tính đa dạng của dữ liệu, ...).
+ Cần có bộ test ngẫu nhiên. Việc sinh ngẫu nhiên dữ liệu đầu vào trong miền xác định của chương trình làm tăng khả năng tìm lỗi nếu có.
+ Cần có bộ test dữ liệu ở vùng biên. Ví dụ dữ liệu đầu vào là cặp (x, y) xác định trên miền 0 < x, y < 1. Khi đó, cần kiểm tra chương trình với bộ dữ liệu biên là (0; 0), (0; 1 ), ( 1 ; 0) và (1; 1). Thực tế cho thấy thường phát sinh lỗi tại các vùng biên hoặc lân cận của biên. Một ví dụ khác của dữ liệu biên là cần tìm các bộ test với n và các giá trị (x1, x2, xn) rất lớn (vùng cận biên lớn).
c) In các thông số trung gian
- Bổ sung vào giữa các dòng lệnh các lệnh print() để in ra các biến trung gian, qua đó kiểm tra các quy trình hay thuật toán được viết có đúng không.
- Giả sử chương trình có đầu vào là (x1, x2, xn), đầu ra là (a1, a2, am) nhưng có sử dụng các biến trung gian (y1, y2, yk). Khi đó với mỗi bộ test đầu vào, chúng ta sẽ bổ sung vào các dòng lệnh của chương trình để in ra các giá trị trung gian:
(x1, x2, xn), (y1, y2, ... yk), (a1,a2, ..., am).
- Thông qua các giá trị trung gian trong quá trình thực hiện chương trình, nếu kết quả cuối cùng có lỗi thì sẽ dễ tìm ra lỗi đó.
d) Sử dụng công cụ break point (điểm dừng)
- Công cụ break point cho phép tạo ra các "điểm dừng" bên trong chương trình. Khi chạy, chương trình sẽ tạm dừng lại tại các "điểm dừng" cho phép người kiểm thử có thể quan sát các thông tin khác bên trong chương trình, qua đó kiểm tra tính đúng đắn của chương trình.
- Trên thực tế sử dụng phương pháp điểm dừng thường kết hợp với phương pháp in các giá trị trung gian sẽ là hiệu quả hơn để kiểm thử chương trình.
Một số ghi nhớ: - Sử dụng công cụ in các biến trung gian. - Sử dụng công cụ sinh các bộ dữ liệu test. - Sử dụng công cụ điểm dừng trong phần mềm soạn thảo lập trình. - Quan sát các mã lỗi của chương trình nếu phát sinh. |
---|
1.2. Ví dụ minh họa
- Quan sát ví dụ sau để biết được cách in ra các giá trị trung gian và sử dụng công cụ tạo điểm dừng để kiểm thử
- Ví dụ: Nhập từ bàn phím hai số tự nhiên m, n tính ƯCLN của hai số này.
Gọi gcd (m, n) là ƯCLN của hai số tự nhiên m, n. Thuật toán của bài toán này dựa trên thuật toán sau:
(1) gcd(m, m) = m.
(2) Nếu n > m thì gcd(m, n) = gcd(m, n-m).
(3) Nếu n < m thì gcd(m, n) = gcd(m-n, n).
Phần cơ bản nhất của chương trình sẽ íà một vòng lặp while, vòng lặp sẽ kết thúc khi m = n. Chương trỉnh như sau:
Chúng ta sẽ tiến hành kiểm thử chương trình này. Cần tập trung kiểm tra kĩ khối lệnh của lệnh lặp while.
* Cách 1: In ra các giá trị trung gian để kiểm soát chương trình.
Bổ sung biến k và hai lệnh print() vào chương trình như mô tả như sau:
Kết quả thực hiện chương trình trên như sau:
Sau khi có kết quả chương trình ta sẽ quan sát sự thay đổi của các giá trị các biến k, m, n trong quá trình thực hiện chương trình để phát hiện lỗi (nếu có)., đồng thời hiểu được lỗi này và tìm cách sửa lỗi.
* Cách 2: Sử dụng công cụ tạo điểm dừng của phần mềm soạn thảo lập trình. Thiết lập điểm dừng tại dòng 4 của chương trình như hình sau. Đây là vị trí bắt đầu chuẩn bị vào vòng lặp.
Khi chạy chương trình sẽ dừng lại trước mỗi vòng lặp, chúng ta sẽ ghi lại các giá trị m, n vào một bảng như bảng sau. Khi kết thúc hết vòng lặp thì kết quả chương trình chính là giá trị m.
Bài tập minh họa
Bài tập 1: Theo em, làm thế nào để kiểm tra (test) và gỡ lỗi (debug) một chương trình? Môi trường lập trình có công cụ nào hỗ trợ việc đó không?
Hướng dẫn giải:
Để kiểm tra (test) và gỡ lỗi (debug) một chương trình có nhiều phương pháp, tiêu biểu như:
- Quan sát mã lỗi Runtime và bắt ngoại lệ
- Sử dụng nhiều bộ test dữ liệu
- In các thông số trung gian
- Tạo các điểm dừng để quan sát thông tin khác bên trong chương trình
Các công cụ hỗ trợ: công cụ in biến trung gian, sinh các bộ dữ liệu test, break point
Bài tập 2: Nêu các lưu ý khi kiểm thử chương trình với các bộ dữ liệu test?
Hướng dẫn giải:
- Cần có nhiều bộ test (theo các tiêu chí khác nhau như độ lớn, tính đa dạng của dữ liệu, ...).
- Cần có bộ test ngẫu nhiên. Việc sinh ngẫu nhiên dữ liệu đầu vào trong miền xác định của chương trình làm tăng khả năng tìm lỗi nếu có.
- Cần có bộ test dữ liệu ở vùng biên. Ví dụ dữ liệu đầu vào là cặp (x, y) xác định trên miền 0 < x, y < 1. Khi đó, cần kiểm tra chương trình với bộ dữ liệu biên là (0; 0), (0; 1 ), ( 1 ; 0) và (1; 1). Thực tế cho thấy thường phát sinh lỗi tại các vùng biên hoặc lân cận của biên. Một ví dụ khác của dữ liệu biên là cần tìm các bộ test với n và các giá trị (x1, x2, xn) rất lớn (vùng cận biên lớn).
Luyện tập
Qua bài học các em cần nắm được các về:
- Biết được một vài phương pháp đơn giản kiểm thử chương trình.
- Biết được một vài cách gỡ lỗi đơn giản một chương trình.
3.1. Trắc nghiệm Bài 30 Tin học 10 KNTT
Các em có thể hệ thống lại nội dung kiến thức đã học được thông qua bài kiểm tra Trắc nghiệm Tin học 10 Kết nối tri thức Chủ đề 5 Bài 30 cực hay có đáp án và lời giải chi tiết.
-
- A. Để tự động sửa lỗi chương trình
- B. Để tìm ra lỗi của chương trình
- C. Để tìm ra lỗi và tự động sửa lỗi chương trình
- D. Để tìm ra lỗi và phòng ngừa, ngăn chặn các lỗi phát sinh trong tương lai
-
- A. Lỗi không thể sửa được
- B. Đây lỗi chia hết cho 0
- C. Lỗi dữ liệu
- D. Lỗi giá trị của đối tượng
-
- A. Đó là vị trí chương trình chạy tới đó thì kết thúc
- B. Đó là vị trí chương trình dừng lại để người lập trình quan sát phát hiện lỗi
- C. Đó là vị trí chương trình mỗi khi chạy đến dòng lệnh đó sẽ kêu pip pip
- D. Đó là vị trí chương trình tạm dừng, người lập trình sẽ quan sát các biến của chương trình và có thể điều khiển để chương trình tiếp tục chạy
Câu 4-10: Mời các em đăng nhập xem tiếp nội dung và thi thử Online để củng cố kiến thức về bài học này nhé!
3.2. Bài tập SGK Bài 30 Tin học 10 KNTT
Các em có thể xem thêm phần hướng dẫn Giải bài tập Tin học 10 Kết nối tri thức Chủ đề 5 Bài 30 để giúp các em nắm vững bài học và các phương pháp giải bài tập.
Khởi động trang 145 SGK Tin học 10 Kết nối tri thức - KNTT
Hoạt động trang 145 SGK Tin học 10 Kết nối tri thức - KNTT
Luyện tập trang 148 SGK Tin học 10 Kết nối tri thức - KNTT
Vận dụng trang 148 SGK Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.1 trang 61 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.2 trang 61 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.3 trang 61 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.4 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.5 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.6 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.7 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.8 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.9 trang 62 SBT Tin học 10 Kết nối tri thức - KNTT
Giải bài tập 30.10 trang 63 SBT Tin học 10 Kết nối tri thức - KNTT
Hỏi đáp Bài 30 Tin học 10 KNTT
Trong quá trình học tập nếu có thắc mắc hay cần trợ giúp gì thì các em hãy comment ở mục Hỏi đáp, Cộng đồng Tin học HOC247 sẽ hỗ trợ cho các em một cách nhanh chóng!
Chúc các em học tập tốt và luôn đạt thành tích cao trong học tập!
-- Mod Tin Học 10 HỌC247