Bài học trước em đã biết khái niệm lỗi ngoại lệ khi chạy chương trình Python. Tuy nhiên, một chương trình chạy không có lỗi ngoại lệ (chương trình không bị dừng) thì không có nghĩa là chương trình không có lỗi. Thậm chí các “lỗi” không tường minh này (các lỗi này được gọi bug) càng khó phát hiện và khó sửa.
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?
*Để 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.
1.MỘT VÀI PHƯƠNG PHÁP KIỂM THỬ 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.
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.
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) In các thông số trung gian
Bổ sung vào giữa các dòng 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ớ:
2. VÍ DỤ MINH HỌA
Xét ví dụ sau: 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 bài 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ẽ là 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
Chúng ta sẽ tiến hành kiểm thử chương trình này.
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:
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ư 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.
Cả hai cách để kiểm soát lỗi là in các giá trị trung gian và thiết lập điểm dừng đều hiệu quả.
1. Chương trình của em khi chạy phát sinh lỗi ngoại lệ ZeroDivisionError. Đó là lỗi gì và em sẽ xử lí như thế nào?
2. Chương trình sau có lỗi không? Nếu có thì tìm và sửa lỗi.
1. - Đây là lỗi chia cho 0.
- Tìm vị trí lỗi chia cho 0, có thể sửa lại chương trình bằng phép chia với các số khác 0.
2. -Chương trình trên có lỗi lôgic.
-Sửa lại: chuyển kiểu dữ liệu số nguyên cho 2 giá trị m, n được nhập vào.
1. 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ệ
b). Kiểm thử chương trình với các bộ dữ liệu test
c). In các thông số trung gian
d). Sử dụng công cụ break point (điểm dừng)
2. Ví dụ minh hoạ
Luyện tập
1. Làm phần VẬN DỤNG (SGK trang 148)
2. Xem trước bài 31 (SGK trang 149)
Thực hành viết chương trình đơn giản
Các em làm 10 câu hỏi trắc nghiệm Online để củng cố bài.
1. Đăng nhập vào trang thaycai.net
2. Nháy chuột vào Học Online
3. Nháy chuột vào 2. Ôn bài vui nhộn tin học 10 – sách Kết nối tri thức
4. Nháy chuột vào 30. Trắc nghiệm: Bài 30-Kiểm thử và gỡ lỗi chương trình.