Bài 7: Kiểm thử và sửa lỗi


    Giảng viên: Nguyễn Thị Minh Huyền
    nguyenthiminhhuyen@hus.edu.vn
               Đỗ Tha...
Tài liệu tham khảo
   BigJava – chương 10




    2009-2010   OOP - http://mim.hus.edu.vn/elearning   2
Kiểm thử đơn vị
   Công cụ kiểm thử quan trọng nhất
   Kiểm thử từng phương thức đơn hoặc 1 tập
    các phương thức phối...
Ví dụ: Tạo các dụng cụ kiểm
thử
   Để tính căn bậc 2 của a dùng thuật toán sau:
           Phỏng đoán 1 giá trị x có thể...
Kiểm thử chương trình
   Xem RootApproximator.java, Numeric.java,
    RootApproximatorTester.java (ch10/root1)
   Lớp Ro...
Chuẩn bị dữ liệu vào cho kiểm
thử (1)
   Có nhiều cách thức để chuẩn bị các tình
    huống cho kiểm thử (test case)
   C...
Chuẩn bị dữ liệu vào cho kiểm
thử (2)
   Cách 2: Tạo các tình huống thử tự động
           Nếu dữ liệu vào thuộc phạm vi...
Chuẩn bị dữ liệu vào cho kiểm
thử (3)
   Chọn các tình huống thử tốt là 1 kĩ năng quan trọng
    để tìm lỗi chương trình
...
Đọc dữ liệu thử từ tệp
   Đặt dữ liệu thử trong 1 tệp trông “đẹp” hơn.
   Chuyển hướng dòng dữ liệu vào
           java...
Đánh giá các tình huống thử
   Làm sao biết được kết quả ra là đúng?
           Tính bằng tay
           Chọn các dữ li...
Độ bao trùm kiểm thử
   Kiểm thử hộp đen: Kiểm tra chức năng phần mềm
    mà không xét đến cấu trúc cài đặt bên trong
  ...
Kiểm thử đơn vị với JUnit
   http://junit.org
   Triết lí: Mỗi khi cài đặt 1 lớp thì cũng tạo ngay 1 lớp
    kiểm thử đi...
Theo vết chương trình
   In các thông báo lần theo các bước thực hiện chương
    trình
           if (status == SINGLE){...
Ghi nhật kí (logging)
   Các thông báo log có thể ngừng kích hoạt khi thực
    hiện xong việc kiểm thử
   Dùng đối tượng...
Ghi nhật kí (2)
   Khi theo vết thực hiện 1 chương trình,
    các sự kiện quan trọng nhất là điểm vào
    và điểm ra 1 ph...
Sử dụng công cụ dò lỗi
(debugger)
   Công cụ dò lỗi:
           Cho phép chạy/tạm dừng/chạy lại 1
            chương trì...
Breakpoint: điểm dừng của debugger
Khảo sát biến




2009-2010   OOP - http://mim.hus.edu.vn/elearning   19
Dò lỗi
   Khi chạy công cụ dò lỗi một chương trình, chương trình đó được
    thực hiện bình thường cho đến khi gặp dòng l...
Ví dụ dò lỗi
   Lớp Word đếm số âm tiết trong 1 từ
           Mỗi cụm nguyên âm (a, e, i, o, u, y) liền nhau
           ...
Thực hiện dò lỗi chương trình
   Với xâu vào là "hello yellow peach.", kết quả
    lỗi:
           Syllables in hello: 1...
Các lỗi khác?
   Giá trị của end = 3 chứ không phải 4
   text chứa "hell" thay vì "hello"
           => countSyllables ...
Dò lỗi...
   Sửa lỗi và thực hiện lại chương trình với xâu
    vào ban đầu "hello yellow peach."
   Còn lỗi => lặp lại q...
Oop 7
Oop 7
Oop 7
Upcoming SlideShare
Loading in …5
×

Oop 7

1,046 views

Published on

slide java o lop

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,046
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
64
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Oop 7

  1. 1. Bài 7: Kiểm thử và sửa lỗi Giảng viên: Nguyễn Thị Minh Huyền nguyenthiminhhuyen@hus.edu.vn Đỗ Thanh Hà dothanhha@hus.edu.vn
  2. 2. Tài liệu tham khảo  BigJava – chương 10 2009-2010 OOP - http://mim.hus.edu.vn/elearning 2
  3. 3. Kiểm thử đơn vị  Công cụ kiểm thử quan trọng nhất  Kiểm thử từng phương thức đơn hoặc 1 tập các phương thức phối hợp với nhau  Không kiểm thử chương trình tổng thể mà kiểm thử từng lớp riêng biệt  Với mỗi lần kiểm thử, tạo 1 lớp đơn giản gọi là dụng cụ kiểm thử (test harness)  Dụng cụ kiểm thử cung cấp tham biến cho các phương thức được kiểm tra 2009-2010 OOP - http://mim.hus.edu.vn/elearning 3
  4. 4. Ví dụ: Tạo các dụng cụ kiểm thử  Để tính căn bậc 2 của a dùng thuật toán sau:  Phỏng đoán 1 giá trị x có thể gần với giá trị căn bậc 2 cần tìm (VD x = a)  Giá trị căn bậc 2 phải nằm giữa x và a/x  Thay x bằng điểm giữa (x+a/x)/2  Lặp lại quá trình trên cho đến khi 2 giá trị xấp xỉ ở 2 bước lặp liền nhau có giá trị rất gần nhau 2009-2010 OOP - http://mim.hus.edu.vn/elearning 4
  5. 5. Kiểm thử chương trình  Xem RootApproximator.java, Numeric.java, RootApproximatorTester.java (ch10/root1)  Lớp RootApproximator có cho kết quả đúng với với mọi dữ liệu vào?  Cần thử với nhiều giá trị  Lặp phép thử nhiều lần với dữ liệu nhập từng lần không phải là ý tưởng hay:  Nếu có lỗi thì sau khi sửa lỗi cần nhớ các dữ liệu đã thử để làm lại các phép thử  Giải pháp: Viết dụng cụ thử để dễ lặp lại các phép thử đơn vị 2009-2010 OOP - http://mim.hus.edu.vn/elearning 5
  6. 6. Chuẩn bị dữ liệu vào cho kiểm thử (1)  Có nhiều cách thức để chuẩn bị các tình huống cho kiểm thử (test case)  Cách 1: Viết cứng các dữ liệu thử vào dụng cụ thử  Mỗi lần phát hiện lỗi, khi sửa xong chỉ cần thực hiện lại dụng cụ thử  Có thể đặt dữ liệu thử trong 1 tệp riêng  Xem RootApproximatorHarness1.java (ch10/root2) 2009-2010 OOP - http://mim.hus.edu.vn/elearning 6
  7. 7. Chuẩn bị dữ liệu vào cho kiểm thử (2)  Cách 2: Tạo các tình huống thử tự động  Nếu dữ liệu vào thuộc phạm vi hẹp, có thể viết chương trình lặp để duyệt qua 1 phần dữ liệu đại diện  Xem RootApproximatorHarness2.java (ch10/root2)  Cách 3: Sinh ngẫu nhiên tình huống thử  Dữ liệu vào thuộc phạm vi rộng  Xem RootApproximatorHarness3.java (ch10/root2) 2009-2010 OOP - http://mim.hus.edu.vn/elearning 7
  8. 8. Chuẩn bị dữ liệu vào cho kiểm thử (3)  Chọn các tình huống thử tốt là 1 kĩ năng quan trọng để tìm lỗi chương trình  Xét tất cả các đặc tính của phương thức đang kiểm thử  Xét các tình huống tiêu biểu (VD với chương trình tính căn bậc 2: 100, ¼, 0.01, 2, 10E12)  Xét các tình huống biên: dữ liệu nằm ở phần biên của tập giá trị cho phép (VD tính căn 0)  Người lập trình thường mắc lỗi khi xử lí các điều kiện biên: chia cho 0, lấy kí tự từ xâu rỗng, truy cập đến con trỏ null  Xét các tình huống dữ liệu không hợp lệ (VD tính căn -2). 2009-2010 OOP - http://mim.hus.edu.vn/elearning 8
  9. 9. Đọc dữ liệu thử từ tệp  Đặt dữ liệu thử trong 1 tệp trông “đẹp” hơn.  Chuyển hướng dòng dữ liệu vào  java Program < data.txt  Một số IDE không hỗ trợ chuyển hướng dòng vào. Trong trường hợp đó cần dùng cửa sổ lệnh  Chuyển hướng dòng dữ liệu ra:  java Program > output.txt  VD:  Xem RootApproximatorHarness4.java (ch10/root2)  Dữ liệu vào: tệp test.in  Chạy chương trình:  java RootApproximatorHarness4 < test.in > test.out 2009-2010 OOP - http://mim.hus.edu.vn/elearning 9
  10. 10. Đánh giá các tình huống thử  Làm sao biết được kết quả ra là đúng?  Tính bằng tay  Chọn các dữ liệu vào mà đã biết kết quả ra  Kiểm tra xem các kết quả ra có thoả mãn một số thuộc tính nào đó (VD: bình phương của căn bậc hai 1 số phải bằng số đó)  Sử dụng 1 “nhà tiên tri” (Oracle): dùng 1 phương thức chậm hơn nhưng tin cậy để tính kết quả tương ứng (VD: Dùng Math.pow(x, 0.5) để tính căn bậc 2).  VD:  Xem RootApproximatorHarness5.java, RootApproximatorHarness6.java (ch10/root3) 2009-2010 OOP - http://mim.hus.edu.vn/elearning 10
  11. 11. Độ bao trùm kiểm thử  Kiểm thử hộp đen: Kiểm tra chức năng phần mềm mà không xét đến cấu trúc cài đặt bên trong  Kiểm thử hộp trắng: Xét đến cấu trúc bên trong khi thiết kế tình huống kiểm thử  Độ bao trùm kiểm thử (test coverage): đánh giá bao nhiêu phần của chương trình đã được kiểm thử  Đảm bảo mỗi phần của chương trình đều được thử nghiệm ít nhất 1 lần bởi 1 tình huống thử  VD: đảm bảo mỗi nhánh lệnh trong chương trình đều đã được thực hiện trong ít nhất 1 tình huống thử 2009-2010 OOP - http://mim.hus.edu.vn/elearning 11
  12. 12. Kiểm thử đơn vị với JUnit  http://junit.org  Triết lí: Mỗi khi cài đặt 1 lớp thì cũng tạo ngay 1 lớp kiểm thử đi kèm  Có trong nhiều IDE như BlueJ và Eclipse  VD:  Xem ch10/junit, chạy chương trình kiểm thử trong BlueJ và Eclipse 2009-2010 OOP - http://mim.hus.edu.vn/elearning 12
  13. 13. Theo vết chương trình  In các thông báo lần theo các bước thực hiện chương trình  if (status == SINGLE){ System.out.println("status is SINGLE"); . . . } . . .  Nhược điểm: Phải bỏ các thông báo đó khi kiểm thử xong, nếu có lỗi khác lại phải thêm các thông báo vào  Giải pháp: Dùng lớp Logger để có thể tắt đi các thông báo vết mà không cần xoá khỏi chương trình 2009-2010 OOP - http://mim.hus.edu.vn/elearning 14
  14. 14. Ghi nhật kí (logging)  Các thông báo log có thể ngừng kích hoạt khi thực hiện xong việc kiểm thử  Dùng đối tượng Logger.global  Ghi lại 1 thông báo:  Logger.global.info("status is SINGLE");  Ngầm định, các thông báo log được in ra. Khi cần tắt các thông báo này dùng lệnh:  Logger.global.setLevel(Level.OFF);  Tránh log quá nhiều hoặc quá ít  Một số người lập trình thích dò lỗi (debugging) hơn 2009-2010 OOP - http://mim.hus.edu.vn/elearning 15
  15. 15. Ghi nhật kí (2)  Khi theo vết thực hiện 1 chương trình, các sự kiện quan trọng nhất là điểm vào và điểm ra 1 phương thức  Ở đầu phương thức, in ra giá trị các tham biến  Ở cuối phương thức, in ra kết quả trả lại  VD: xem chương trình trong ch10/log 2009-2010 OOP - http://mim.hus.edu.vn/elearning 16
  16. 16. Sử dụng công cụ dò lỗi (debugger)  Công cụ dò lỗi:  Cho phép chạy/tạm dừng/chạy lại 1 chương trình và phân tích các trạng thái (giá trị các biến) trong quá trình chạy  3 khái niệm chính:  Điểm dừng (breakpoints)  Thực hiện từng bước một (single-stepping)  Khảo sát biến (inspecting variables) 2009-2010 OOP - http://mim.hus.edu.vn/elearning 17
  17. 17. Breakpoint: điểm dừng của debugger
  18. 18. Khảo sát biến 2009-2010 OOP - http://mim.hus.edu.vn/elearning 19
  19. 19. Dò lỗi  Khi chạy công cụ dò lỗi một chương trình, chương trình đó được thực hiện bình thường cho đến khi gặp dòng lệnh được đánh dấu điểm dừng thì tạm ngừng. Khi đó, ta có thể:  Khảo sát giá trị các biến  Thực hiện từng dòng lệnh một  Hoặc tiếp tục chạy cho đến khi gặp điểm dừng sau  Khi chương trình kết thúc, công cụ dò lỗi cũng kết thúc  Các điểm dừng vẫn được kích hoạt cho đến khi bị xoá đi  Có 2 dạng lệnh chạy từng bước một:  Step Over: gặp lời gọi phương thức thì thực hiện trong 1 bước  Step Into: gặp lời gọi phương thức thì thực hiện từng lệnh một trong phương thức đó 2009-2010 OOP - http://mim.hus.edu.vn/elearning 20
  20. 20. Ví dụ dò lỗi  Lớp Word đếm số âm tiết trong 1 từ  Mỗi cụm nguyên âm (a, e, i, o, u, y) liền nhau được đếm là 1 âm tiết  Tuy nhiên, chữ e ở cuối từ không được đếm là 1 âm tiết  Nếu thuật toán cho giá trị đếm = 0 thì tăng thành 1  Hàm dựng bỏ đi các kí tự không phải là chữ cái ở đầu và cuối  Xem tệp Word.java và WordTester.java (ch10/debugger) 2009-2010 OOP - http://mim.hus.edu.vn/elearning 21
  21. 21. Thực hiện dò lỗi chương trình  Với xâu vào là "hello yellow peach.", kết quả lỗi:  Syllables in hello: 1 Syllables in yellow: 1 Syllables in peach: 1  Đặt breakpoint vào dòng đầu tiên của phương thức countSyllables trong lớp Word  Thực hiện chương trình, khi dừng tại breakpoint thì thực hiện từng bước cho đến lệnh kiểm tra nếu kí tự cuối bằng 'e'  Khảo sát biến ch chứa kí tự cuối: ch = 'l' => lỗi 2009-2010 OOP - http://mim.hus.edu.vn/elearning 22
  22. 22. Các lỗi khác?  Giá trị của end = 3 chứ không phải 4  text chứa "hell" thay vì "hello"  => countSyllables trả lại 1 là bình thường  => lỗi nằm ở chỗ khác  Bắt đầu lại chương trình, đặt breakpoint tại đầu hàm dựng của lớp Word.  Nhập xâu đầu vào "hello."  Ngừng lại sau khi thực hiện xong vòng lặp thứ 2 trong hàm dựng  Khảo sát i và j: giá trị đúng  Tại sao text được đặt bằng "hell" ??? 2009-2010 OOP - http://mim.hus.edu.vn/elearning 24
  23. 23. Dò lỗi...  Sửa lỗi và thực hiện lại chương trình với xâu vào ban đầu "hello yellow peach."  Còn lỗi => lặp lại quá trình dò lỗi như trên, sửa lỗi cho đến khi thu được kết quả đúng:  Syllables in hello: 2 Syllables in yellow: 2 Syllables in peach.: 1  Đến đây có thể kết luận là chương trình đã hết lỗi không??? 2009-2010 OOP - http://mim.hus.edu.vn/elearning 26

×