Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý design by contract Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý design by contract Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý design by contract luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - NGUYỄN HÙNG CƢỜNG XÂY DỰNG TEST CASE KIỂM THỬ HỘP TRẮNG CHO CHƢƠNG TRÌNH EIFFEL ỨNG DỤNG NGUYÊN LÝ DESIGN BY CONTRACT Chuyên ngành: Công nghệ phần mềm LUẬN VĂN THẠC SĨ KHOA HỌC CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TS Huỳnh Quyết Thắng Hà Nội - Năm 2010 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract MỤC LỤC MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN NHẬN XÉT CỦA NGƢỜI HƢỚNG DẪN KHOA HỌC DANH MỤC CÁC HÌNH VẼ MỞ ĐẦU CHƢƠNG NGƠN NGỮ LẬP TRÌNH EIFFEL VÀ NGUN LÝ DESIGN BY CONTRACT 11 1.1 Ngôn ngữ lập trình Eiffel mơi trƣờng làm việc EiffelStudio 11 1.1.1 Lịch sử 11 1.1.2 Các phiên EiffelStudio 14 1.1.3 Các đặc điểm ngơn ngữ lập trình Eiffel 15 1.1.3.1 Cấu trúc lớp ngôn ngữ lập trình Eiffel 17 1.1.3.2 Các kiểu liệu 19 1.2 Nguyên lý Design by Contract 22 1.2.1 Một số chế mang lại tính tin cậy cho phần mềm 22 1.2.2 Tính đắn phần mềm 23 1.2.3 Công thức tính đắn 25 1.2.4 Nội dung nguyên lý Design by Contract 26 Tóm tắt chƣơng 29 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract CHƢƠNG KIỂM THỬ PHẦN MỀM - KIỂM THỬ HỘP TRẮNG 30 2.1 Kiểm thử phần mềm xây dựng test case từ use case 30 2.1.1 Giới thiệu kiểm thử 30 2.1.1.1 Các nguyên lý kiểm thử phần mềm 30 2.1.1.2 Các cấp độ kiểm thử phần mềm 32 2.1.2 Use case test case 37 2.1.3 Xây dựng test case từ use case 38 2.2 Kiểm thử hộp trắng 38 2.2.1 Kiểm thử dòng lệnh 39 2.2.2 Kiểm thử với module rẽ nhánh 39 2.2.3 Kiểm thử module điều kiện phức hợp 39 2.2.4 Kiểm thử đường dẫn lệnh (path codes) 40 2.2.5 Kiểm thử vòng lặp 41 2.3 So sánh kiểm thử hộp trắng - hộp đen 42 2.4 Kiểm thử hộp trắng với hệ thống hƣớng đối tƣợng ứng dụng Design by Contract 42 Tóm tắt chƣơng 45 CHƢƠNG XÂY DỰNG TEST CASE KIỂM THỬ HỘP TRẮNG CHO CHƢƠNG TRÌNH EIFFEL ỨNG DỤNG NGUYÊN LÝ DESIGN BY CONTRACT 46 3.1 Chƣơng trình Eiffel cài đặt thuật tốn số cấu trúc liệu 46 3.1.1 Giới thiệu 46 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract 3.1.2 Cấu trúc chương trình 48 3.2 Xây dựng test case kiểm thử hộp trắng cho chƣơng trình thao tác số cấu trúc liệu 49 3.2.1 Lớp DRIVER_DEMO thủ tục add_entry 51 3.2.1.1 Dữ liệu ràng buộc contract 53 3.2.1.2 Dữ liệu bên thủ tục 55 3.2.2 Lớp BINARY_SEARCH_TREE_DEMO 57 3.2.2.1 Dữ liệu ràng buộc contract 59 3.2.2.2 Dữ liệu bên 60 Tóm tắt chƣơng 64 CHƢƠNG KẾT QUẢ VÀ BÀN LUẬN 65 Nhiệm vụ hoàn thành 65 Các đóng góp khoa học 66 Hƣớng phát triển luận văn 66 TÀI LIỆU THAM KHẢO 67 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract LỜI CAM ĐOAN Tôi xin cam đoan cơng trình nghiên cứu riêng tơi Các số liệu, kết nêu luận văn trung thực chưa công bố công trình khác Tác giả luận văn Nguyễn Hùng Cƣờng Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract LỜI CẢM ƠN Đầu tiên em xin gửi lời cảm ơn tới thầy cô giáo trường Bách Khoa nói chung khoa cơng nghệ thơng tin nói riêng, người truyền thụ cho chúng em kiến thức nhất, giúp chúng em có tảng q trình làm việc cơng tác sau Em xin gửi lời cảm ơn đến PGS.TS Huỳnh Quyết Thắng, người truyền thụ kiến thức cho em mà cịn giúp đỡ tận tình suốt q trình em thực luận văn này: giúp đỡ chọn lựa hướng thực đề tài luận văn, cung cấp tài liệu, hướng dẫn kiến thức Và cuối muốn gửi lời cảm ơn chân thành tới bạn bè đặc biệt người thân gia đình ln quan tâm, động viên giúp đỡ tơi q trình hồn thành đồ án tốt nghiệp Do kiến thức khả làm việc có hạn, luận văn khơng tránh khỏi thiếu sót, điều chưa tối ưu, mong thầy cô giáo giúp đỡ bảo thêm để sau em tiếp tục hồn thiện đề tài Xin cảm ơn! Hà Nội ngày 26 tháng 10 năm 2010 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract NHẬN XÉT CỦA NGƢỜI HƢỚNG DẪN KHOA HỌC Ngƣời hƣớng dẫn khoa học PGS.TS Huỳnh Quyết Thắng Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract DANH MỤC CÁC HÌNH VẼ Hình 1: Mơi trường lập trình EiffelStudio 13 Hình 2: Mơ hình phân cấp cluster Eiffel 16 Hình 3: Cấu trúc chương trình viết Eiffel 17 Hình 4: EiffelStudio thích thuộc tính thủ tục lớp 19 Hình 5: Cấu trúc lớp LINKED_LIST hỗ trợ EiffelStudio 21 Hình 6: Contract DbC contract kinh doanh 27 Hình 7: Cài đặt nguyên lý Design by Contract ngôn ngữ Eiffel 28 Hình 8: Kiểm thử phần mềm 30 Hình 9: Kiểm thử hộp trắng 38 Hình 10: Bảng chân lý điều kiện phức hợp 40 Hình 11: Một ví dụ vịng lặp khơng xác định 40 Hình 12: Cấu trúc đường lệnh vịng lặp không xác định 41 Hình 13: Lựa chọn chương trình Eiffel mẫu 47 Hình 14: Giao diện danh sách lớp chương trình Structure 47 Hình 15: Cấu trúc lớp chương trình Structure 49 Hình 16: Cấu trúc lớp DRIVER_DEMO 51 Hình 17: Mã nguồn thủ tục add_entry lớp DRIVER_DEMO 52 Hình 18: Số lượng menu lệnh thuật tốn 53 Hình 19: EiffelStudio dừng dịch báo lỗi tiền điều kiện bị vi phạm 54 Hình 20: Các test case cho hai contract name_not_void real_help 55 Hình 21: Các liệu thủ tục add_entry kiểm thử 55 Hình 22: test case cho đầu vào thủ tục add_entry 56 Hình 23: Các trường hợp biến menu_size xảy 57 Hình 24: Cấu trúc lớp BINARY_SEARCH_TREE_DEMO 58 Hình 25: Mã nguồn thủ tục excute lớp BINARY_SEARCH_TREE_DEMO 59 Hình 26: Các test case cho contract valid_command 60 Hình 27: Cấu trúc đường dẫn lệnh thủ tục excute 61 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract MỞ ĐẦU i Lý chọn đề tài - Tìm hiểu ngơn ngữ lập trình Eiffel, nguyên lý Design by Contract lý thuyết kiểm thử hộp trắng - Xây dựng thực tế test case cho chương trình Eiffel có ứng dụng ngun lý Design by Contract đánh giá ảnh hưởng nguyên lý đến việc kiểm thử ii Lịch sử nghiên cứu - Tháng 11/2009: nhận giáo viên hướng dẫn đề tài - Từ 12/2009 → 2/2010: tìm hiểu ngơn ngữ lập trình Eiffel lý thuyết nguyên lý Design by Contract - Từ 3/2010 → 5/2010: tìm hiểu lý thuyết kiểm thử phần mềm - Từ 6/2010 → 7/2010: tìm hiểu chương trình Eiffel mẫu có ứng dụng ngun lý Design by Contract xây dựng test case kiểm thử hộp trắng cho chương trình - Từ 8/2010 → 10/2010: tổng hợp kết nghiên cứu hoàn thành luận văn iii Mục đích, đối tƣợng phạm vi nghiên cứu - Mục đích: tìm hiểu lý thuyết ứng dụng ngơn ngữ lập trình Eiffel, nguyên lý Design by Contract kiểm thử hộp trắng Nghiên cứu đề xuất hướng mở rộng phát triển lý thuyết tìm hiểu - Đối tượng: ngơn ngữ lập trình Eiffel, ngun lý Design by Contract kiểm thử hộp trắng Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract - Phạm vi nghiên cứu: thuộc lĩnh vực kiểm thử phần mềm, lĩnh vực Công nghệ phần mềm ngành Công nghệ thông tin iv Các luận điểm đóng góp tác giả - Các luận điểm bản: + Ngôn ngữ lập trình Eiffel + Nguyên lý Design by Contract + Lý thuyết kiểm thử hộp trắng - Đóng góp tác giả: + Xây dựng thành công test case kiểm thử hộp trắng cho thành phần chương trình Eiffel Structure + Đề xuất hướng phát triển cho luận văn: tự động sinh contract, đánh giá mức độ vi phạm contract v Phƣơng pháp nghiên cứu - Tìm hiểu thực hành ngơn ngữ lập trình Eiffel EiffelStudio - Tìm hiểu lý thuyết kiểm thử phần mềm Design by Contract thông qua tài liệu hướng dẫn - Tìm hiểu, chạy thử xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel Structure 10 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract 3.2.1.1 Dữ liệu đƣợc ràng buộc contract Chúng ta có contract cài đặt thủ tục: not_too_many_entries, name_not_void real_help - Contract not_too_many_entries: menu_size < Max_Number_of_Entries liên quan đến kích thước số menu hiển thị hình console ràng buộc thủ tục add_entry với hệ thống: thủ tục làm việc số lượng menu hiển thị khơng vượt q mức Để thực kiểm thử Contract này, giảm giá trị Max_Number_of_Entries khai báo khởi tạo từ 40 xuống 14, thực module với số menu lệnh thuật toán cài đặt menu là: General Trees Binary Trees Sets TWO_WAY_TREE_DEMO BINARY_TREE SET_DEMO 16 14 13 Hình 18: Số lƣợng menu lệnh thuật tốn Khi đó, với thuật tốn Sets, chương trình chạy bình thường contract not_too_many_entries thỏa mãn Tuy nhiên, hai thuật tốn cịn lại có số lượng menu lệnh vi phạm contract bị EiffeStudio báo lỗi chạy: thuật tốn General Trees có 16 > 14 menu lệnh thuật tốn Binary Trees có 14 menu lệnh vi phạm contract 53 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract Hình 19: EiffelStudio dừng dịch báo lỗi tiền điều kiện bị vi phạm Tuy nhiên nhận thấy: với hai module TWO_WAY_TREE_DEMO BINARY_TREE có số lượng menu lệnh khác kết kiểm thử lại giống Chứng tỏ EiffelStudio nhận contract module bị vi phạm không cho biết bị vi phạm vi phạm mức độ Nếu điều cải thiện giúp ích nhiều cho lập trình viên gỡ lỗi Đây hướng phát triển luận văn: contract bị vi phạm nào, phạm tới mức độ Điều đơi giúp lập trình viên định lượng số trạng thái biến chương trình, hữu ích việc tìm hiểu lại vấn đề - Hai contract liên quan tới liệu đầu vào module: name_not_void: entry /= Void real_help: help /= Void Tương tự trên, để kiểm thử tình bắt lỗi EiffelStudio với contract này, thay đổi mã nguồn chương trình nhằm triệu gọi thủ tục add_entry tình nêu bảng sau: 54 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract name_not_void: entry /= Void real_help: help /= Void T T F F T F T F Hình 20: Các test case cho hai contract name_not_void real_help Và tất nhiên, triệu gọi thủ tục add_entry mà contract bị vi phạm Eiffel dừng trình dịch báo lỗi chạy 3.2.1.2 Dữ liệu bên thủ tục Thủ tục add_entry dùng tới hai dạng liệu: liệu đầu vào biến toàn cục chương trình: Dữ liệu đầu vào Biến tồn cục entry help menu_size last_entry Hình 21: Các liệu thủ tục add_entry đƣợc kiểm thử Việc kiểm thử giá trị đầu vào liệu trình bày phần đánh giá contract thủ tục, nhiên contract chưa bao qt hết tình xảy chạy: xâu đầu vào entry help xâu chưa xác định (void), xâu rỗng, xâu bình thường xâu tràn giới hạn độ dài Eiffel cho phép Với hai xâu đầu vào bốn khả cho xâu, xây dựng test case gồm 16 ghi cho việc kiểm thử liệu đầu vào thủ tục: 55 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract entry help void void void void empty empty empty empty normal normal normal normal outbound outbound outbound outbound void empty normal outbound void empty normal outbound void empty normal outbound void empty normal outbound Kết không hợp lệ không hợp lệ không hợp lệ không hợp lệ không hợp lệ hợp lệ hợp lệ hợp lệ không hợp lệ hợp lệ hợp lệ hợp lệ khơng hợp lệ hợp lệ hợp lệ hợp lệ Hình 22: test case cho đầu vào thủ tục add_entry Với hai biến toàn cục menu_size last_entry xây dựng test case bao quát tất trường hợp xảy chạy Tuy nhiên để ý: biến last_entry xuất câu lệnh last_entry := menu_size nên thực không cần phải kiểm thử giá trị biến last_entry nhận thủ tục add_entry triệu gọi mà cần thực công việc với biến menu_size đủ Biến menu_size khai báo khởi tạo menu_size = 40 chương trình có câu lệnh tăng giá trị menu_size := menu_size + nên chắn chương trình khơng thể xảy trạng thái biến menu_size có giá trị âm Tuy nhiên nên kiểm thử tình nhằm tìm hiểu khả hoạt động chương trình có cố xảy dẫn tới biến nhận giá trị âm: lỗi phần 56 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract cứng, lỗi quyền truy nhập nhớ, lỗi trình dịch, lỗi tràn số Tức cần kiểm thử trạng thái xảy biến menu_size: menu_size Âm =0 > && < Max_Number_of_Entries = Max_Number_of_Entries > Max_Number_of_Entries tràn số kiểu INTEGER Hình 23: Các trƣờng hợp biến menu_size xảy Qua bước xây dựng test case cho thủ tục add_entry, thấy ứng dụng nguyên lý Design by Contract gỡ lỗi: thông thường gỡ lỗi, phải hiển thị số biến trung gian để đánh dấu xem đến chương trình bắt đầu gặp lỗi Tuy nhiên với chương trình ứng dụng nguyên lý Design by Contract, cài đặt contract tốt để ràng buộc trạng thái chạy tập điều kiện trình dịch thơng báo cho biết lỗi gặp đâu giúp người lập trình gỡ lỗi 3.2.2 Lớp BINARY_SEARCH_TREE_DEMO Module thao tác nhị phân tìm kiếm: thêm phần tử vào tìm kiếm giá trị xem có xuất khơng Đây module có giao tiếp trực tiếp với người dùng thông qua lựa chọn lệnh 57 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract Hình 24: Cấu trúc lớp BINARY_SEARCH_TREE_DEMO + Các biến put, has, show, quit: đánh dấu lựa chọn thao tác người dùng + Các thủ tục: - cycle: vịng lặp thực thuật tốn - tree_trace: thủ tục dị vết nhị phân tìm kiếm - fill_menu: hiển thị menu lệnh thuật toán - excute: thực thi lệnh thuật toán - get_element: thêm phần tử vào nhị phân tìm kiếm Dữ liệu khai báo tree_root : BINARY_SEARCH_TREE [INTEGER] liệu dạng nhị phân hỗ trợ sẵn thư viện EiffelStudio Thủ tục excute module BINARY_SEARCH_TREE_DEMO: 58 Xây dựng test case kiểm thử hộp trắng cho chương trình Eiffel ứng dụng nguyên lý Design by Contract execute (new_command: INTEGER) require valid_command: new_command >= put and new_command = put and new_command = put and new_command