1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án xây dựng công cụ kiểm thử dòng điền khiển tự động java

62 44 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 62
Dung lượng 1,61 MB

Nội dung

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Dương Tuấn Anh XÂY DỰNG CÔNG CỤ KIỂM THỬ DÒNG ĐIỀU KHIỂN TỰ ĐỘNG CHO CÁC ĐƠN VỊ CHƯƠNG TRÌNH JAVA KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin HÀ NỘI - 2016 HÀ NỘI – 2016 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Dương Tuấn Anh XÂY DỰNG CƠNG CỤ KIỂM THỬ DỊNG ĐIỀU KHIỂN TỰ ĐỘNG CHO CÁC ĐƠN VỊ CHƯƠNG TRÌNH JAVA KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Cơng Nghệ Thơng Tin Cán hướng dẫn: PGS TS Phạm Ngọc Hùng HÀ NỘI - 2016 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY Duong Tuan Anh A METHOD AND TOOL SUPPORTING FOR AUTOMATED TESTING OF JAVA PROGRAMS THE BS THESIS Major: Information Technology Supervisor: Assoc Prof Dr Pham Ngoc Hung LỜI CẢM ƠN HANOI - 2016 VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY LỜI CẢM ƠN Đầu tiên, xin gửi lời cám ơn chân thành tới PGS TS Phạm Ngọc Hùng – giảng viên môn Công Nghệ Phần Mềm – người hướng dẫn tận tình, tỉ mỉ, chu đáo suốt hai năm tham gia nghiên cứu khoa học làm khóa luận tốt nghiệp Quãng thời gian thầy hướng dẫn giúp học hỏi, đúc kết nhiều kinh nghiệm phương pháp nghiên cứu, kĩ giao tiếp, kĩ làm việc nhóm, kĩ trình bày Thầy cịn truyền cho lửa yêu nghiên cứu khoa học, niềm tin vượt qua khó khăn sống dạy tơi cách vượt qua khó khăn Tơi cảm thấy tự hào may mắn sinh viên thầy hướng dẫn năm tháng đại học Ngồi ra, tơi xin gửi lời cám ơn chân thành đến tập thể lớp K57 giúp đỡ tơi nhiệt tình để hồn thành khóa luận cho đạt hiệu cao Các bạn giúp đỡ tơi hành động, lời nói tơi gặp khó khăn, thất bại Bốn năm bên khơng phải dài tôi, quãng thời gian tuyệt vời quên Tiếp theo, xin gửi lời cảm ơn đến thầy cô giảng viên Trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội – người tận tâm truyền đạt kiến thức quý báu làm tảng để tiếp tục xa lĩnh vực công nghệ thông tin Cuối cùng, xin cảm ơn gia đình ni tơi khơn lớn để trở thành người có ích cho xã hội, giúp tơi có điểm tựa vững để n tâm học hành suốt bao năm qua Tôi xin gửi lời cám ơn chân thành tới cha, mẹ, em gái động viên cổ vũ tơi gặp khó khăn thử thách Hà Nội, ngày 27 tháng 05 năm 2016 Sinh viên Dương Tuấn Anh TĨM TẮT Ngơn ngữ lập trình Java ln ngơn ngữ lập trình phổ biến nhất, có chỗ đứng lâu nhất, bền bỉ có tầm ảnh hưởng Java sử dụng khoảng 97% máy tính để bàn có khoảng tỷ Java tải năm Hơn nữa, Java không đứng yên mà phát triển với phiên Java Java phát hành năm ngoái phiên Java dự kiến phát hành vào năm 2016 Vì phổ biến phát triển khơng ngừng đó, q trình kiểm thử dự án Java ngày tốn nhiều công sức chi phí Lượng mã nguồn lớn phức tạp gây nhiều khó khăn việc sinh ca kiểm thử, đặc biệt kĩ thuật kiểm thử hộp trắng Vì vậy, việc tự động hóa q trình kiểm thử xem giải pháp để giảm bớt chi phí cho q trình kiểm thử mà đảm bảo chất lượng sản phẩm Hiện có nhiều cơng cụ hỗ trợ kiểm thử tự động cho ngôn ngữ Java đa số tập trung vào việc thực thi ca kiểm thử mà không trọng vào việc sinh ca kiểm thử tự động Một số công cụ hỗ trợ tự động sinh ca kiểm thử chưa đủ tốt cịn có hạn chế định Vì vậy, khóa luận đề xuất phương pháp sinh ca kiểm thử tự động cho đơn vị chương trình Java cài đặt công cụ hỗ trợ CFT4JUnit Phương pháp sử dụng kĩ thuật kiểm thử tự động hộp trắng dòng điều khiển theo hướng tĩnh Đầu vào gồm hàm Java có chứa biến số nguyên, số thực, biến mảng tiêu chí phủ kiểm thử, số vịng lặp tối đa Đầu gồm tập ca kiểm thử đáp ứng tiêu chí phủ kiểm thử tập ca kiểm thử cho kiểm thử vòng lặp Cụ thể, bước đầu tiên, đồ thị dòng điều khiển ứng với tiêu chí phủ kiểm thử xây dựng cách phân tích mã nguồn hàm đầu vào Sau đó, đồ thị phân tích để thu tập đường thi hành cho sau thực chúng tiêu chí phủ kiểm thử thỏa mãn Tiếp theo, đường kiểm thử chứa vịng lặp xử lí để sinh thêm đường kiểm thử dùng kiểm thử tính đắn vòng lặp Kế tiếp, kĩ thuật thực thi tượng trưng, đường thi hành phân tích thành hệ ràng buộc tương ứng Cuối cùng, ca kiểm thử thực thi để thu kết kiểm thử Cuối cùng, ca kiểm thử sinh từ việc giải hệ ràng buộc Kết thực nghiệm cho thấy phương pháp sinh tự động ca kiểm thử với số lượng tối thiểu đạt độ phủ tối đa Ngoài ra, khả phát lỗi tương đối cao, thời gian sinh ca kiểm thử cải thiện đáng kể Từ khóa: Kiểm thử tự động, hàm Java, đồ thị dòng điều khiển, đường thi hành, ca kiểm thử, Symbolic Execution, SMT-Solver ABSTRACT Java programming language has always been one of the most common programming languages, has oldest standing, persistent and most influential Java is used in about 97% of the desktop and has about billion download per year Moreover, Java always grows up, the newest version of Java is Java was released last year and the Java version is expected to be released in 2016 As of the popularity and continued growth, the process of testing for Java projects is more labor-intensive and take more cost The amount of large and complex source caused many difficulties in the test case generation, especially in the white-box testing techniques Thus, the automated testing process is seen as a solution to reduce the cost of testing process while maintaining product quality Currently, many tools are support test automation for the Java language, but most of them focus only on the execution of test cases instead of focused on test cases generation Some tools support automatically generates test cases, but still not good enough and there are certain restrictions Therefore, this thesis proposes a method of automated generating test cases for Java unit and install a supporting tool This method use automated testing techniques for white box control flow graph with static direction Inputs include a Java function contains integer variables, real numbers, variables and arrays tested negative criteria, the maximum number of loops Output consists of a set of test cases to meet the criteria set of government testing and test cases for testing the loop Specifically, in the first step, the control flow graph with specific coverage criteria is built by analyzing the source code input function Then this graph is analyzed to obtain a set of lines that execution after execution they test negative criteria are met Next, the test contains a loop road is processed to generate additional new tests used road testing the correctness of the loop Next, using symbolic execution techniques, the implementation of the road will be analyzed in the corresponding binding system Then, the test cases are executed in order to obtain test results Finally, the test cases are generated by solving the system of constraints Experimental results show that the method can be automatically generated test cases with the minimum amount but still achieve maximum coverage In addition, the possibility of a relatively high error detection, time of birth of test cases has also improved significantly Keywords: automatic testing, Java method, control flow graph, test path, test case, Symbolic Execution, SMT-Solver LỜI CAM ĐOAN Tôi xin cam đoan nghiên cứu kiểm thử tự động cho đơn vị chương trình Java trình bày luận án chưa nộp báo cáo khóa luận trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội trường đại học khác Những tơi viết không chép từ tài liệu, không sử dụng kết người khác mà khơng trích dẫn cụ thể Tôi xin cam đoan công cụ kiểm thử tự động tơi trình bày khố luận tự phát triển, không chép mã nguồn người khác Nếu sai tơi hồn tồn chịu trách nhiệm theo quy định trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội Hà Nội, ngày 27 tháng 05 năm 2016 Sinh viên Dương Tuấn Anh MỤC LỤC Đặt vấn đề Tổng quan kĩ thuật kiểm thử tự động hộp trắng dòng điều khiển 2.1 Tổng quan kĩ thuật kiểm thử hộp trắng dòng điều khiển 2.1.1 Đồ thị dòng điều khiển 2.1.2 Các tiêu chí phủ kiểm thử 2.1.3 Tự động hóa quy trình kiểm thử hộp trắng dòng điều khiển 2.2 Tổng quan kiểm thử tự động hộp trắng dòng điều khiển theo hướng động 2.3 Tổng quan kiểm thử tự động hộp trắng dòng điều khiển theo hướng tĩnh 2.4 So sánh kiểm thử tự động hộp trắng dòng điều khiển theo hướng tĩnh động Phương pháp sinh ca kiểm thử tự động dòng điều khiển cho đơn vị chương trình Java 11 3.1 Tổng quan phương pháp kiểm thử đề xuất 11 3.2 Sinh đồ thị CFG 12 3.2.1 Tổng quan phương pháp sinh đồ thị CFG 15 3.2.2 Phân tích mã nguồn 16 3.2.3 Phân tích AST từ mã nguồn 16 3.2.4 Xây dựng đồ thị dòng điều khiển CFG 18 3.2.4.1 Tổng quan thuật toán sinh đồ thị CFG từ AST 18 3.2.4.2 Xử lí nút đơn giản 20 3.2.4.2 Xử lý nút khối 20 3.2.4.2 Xử lý nút câu lệnh if else 21 3.2.4.2 Xử lý nút câu lệnh for 22 3.2.4.2 Xử lý nút câu lệnh while 23 3.2.4.2 Xử lý nút câu lệnh do…while 24 3.2.4.2 Xử lý nút câu lệnh đặc biệt 24 3.2.4.2 Liên kết câu lệnh thực, xóa câu lệnh ảo 25 3.2.5 Chuẩn hóa biểu thức 26 3.3 Xây dựng đường kiểm thử từ đồ thị CFG 27 3.3.1 Sinh tập đường độc lập 27 3.3.2 Sinh tập đường kiểm thử cho tiêu chí phủ 29 3.3.3 Sinh tập đường kiểm thử cho vòng lặp 29 3.3.3.1 Sinh tập đường kiểm thử cho vòng lặp đơn 30 3.3.3.2 Sinh tập đường kiểm thử cho vòng lặp lồng 31 3.4 Sinh ca kiểm thử từ tập đường kiểm thử 32 3.4.1 Xây dựng hệ ràng buộc 32 3.4.2 Sinh ca kiểm thử từ hệ ràng buộc 34 3.4.2.1 Phương pháp giải hệ ràng buộc kĩ thuật sinh giá trị ngẫu nhiên 34 3.4.2.2 Phương pháp giải hệ ràng buộc công cụ SMT-Solver 35 Công cụ thực nghiệm 38 4.1 Giới thiệu công cụ 38 4.1.1 Tổng quan công cụ 38 4.1.2 Đồ thị dòng điều khiển CFG 39 4.1.3 Tập đường kiểm thử 41 4.1.4 Tập ca kiểm thử 41 4.1.5 Các thư viện hỗ trợ 42 4.1.5.1 Giới thiệu giải Z3 42 4.1.5.2 Giới thiệu công cụ JDT 42 4.2 Thực nghiệm 43 4.2.1 Kiểm thử hàm đơn giản 43 4.2.2 Kiểm thử hàm phức tạp 44 4.2.3 Kiểm thử hàm có lỗi tiềm ẩn 45 4.2.4 Ý nghĩa thực nghiệm 46 Kết luận 47 kiểm thử path duyệt theo thứ tự từ xuống (dòng 4) Nếu v đỉnh khởi tạo biến var khai báo v thêm vào tập V, giá trị var thêm vào S (nếu biến var chưa gán giá trị giá trị giá trị ngẫu nhiên) (dòng 6, 7, 8) Còn v đỉnh gán giá trị, thay đổi giá trị biến cập nhật vào ánh xạ S (dòng 10) Ngược lại, v đỉnh định, biến biểu thức điều kiện exp v thay giá trị lưu S (dịng 12, 13) Sau đó, biểu thức exp sau chỉnh sửa thêm vào hệ ràng buộc constraints (dòng 14) 3.4.2 Sinh ca kiểm thử từ hệ ràng buộc Sau có hệ ràng buộc, chúng giải để sinh ca kiểm thử Nếu hệ ràng buộc vô nghiệm có nghĩa đường mà đại diện khơng thể xảy q trình chạy chương trình mơi trường thực Khóa luận đề xuất phương pháp giải hệ ràng buộc sử dụng hai kĩ thuật tìm nghiệm cho hệ ràng buộc sinh giá trị ngẫu nhiên sử dụng công cụ SMT-Solver Mỗi kĩ thuật có ưu điểm nhược điểm riêng Việc kết hợp hai kĩ thuật giải hệ giúp cơng cụ tận dụng mạnh kĩ thuật để giải nhiều loại hệ ràng buộc thời gian nhanh 3.4.2.1 Phương pháp giải hệ ràng buộc kĩ thuật sinh giá trị ngẫu nhiên sinh ngẫu phân loại Hệ ràng buộc nhiên Giá trị ngẫu nhiên biên hể tổng Giá trị ngẫu nhiên tổng hợp Ca kiểm thử Hệ ràng buộc phân loại Hệ ràng buộc sinh ngẫu nhiên hợp biên hể Hình 3.15 Quá trình giải hệ ràng buộc kĩ thuật sinh ngẫu nhiên Trong kĩ thuật sinh giá trị ngẫu nhiên, tư tưởng sinh ngẫu nhiên giá trị đầu vào đến thỏa mãn hệ ràng buộc dừng lại Ưu điểm kĩ thuật giải hầu hết tất loại ràng buộc kể hệ ràng buộc có độ phức tạp cao Nhưng 34 kĩ thuật mang đầy tính may rủi nên sử dụng phương pháp để giải hệ ràng buộc tốn nhiều thời gian Một nguyên nhân gây thời gian kĩ thuật sinh ngẫu nhiên hệ gồm nhiều hệ độc lập2 với cần giá trị đầu vào ngẫu nhiên thỏa mãn hầu hết hệ khơng thỏa mãn hệ tất phải giải lại từ đầu Vì vậy, khóa luận đề xuất phương pháp sinh ngẫu nhiên giải vấn đề trên, giúp giảm thời gian giải hệ ràng buộc Chi tiết phương pháp mơ tả Hình 3.15 Đầu tiên, hệ ràng buộc phân tích để chia thành hệ ràng buộc nhỏ độc lập với Sau hệ ràng buộc giải kĩ thuật sinh ngẫu nhiên Cuối cùng, sau hệ tìm nghiệm thỏa mãn, kết tập hợp để sinh ca kiểm thử thỏa mãn 3.4.2.2 Phương pháp giải hệ ràng buộc công cụ SMT-Solver Công cụ SMT-Solver công mạnh cụ mạnh việc giải hệ phương trình Cơng cụ hỗ trợ giải hệ ràng buộc cách nhanh chóng xác Các cơng cụ SMT-Solver khơng dừng lại việc giải hệ phương trình tuyến tính mà cịn hỗ trợ giải hệ chứa phương trình phi tuyến tính Ví dụ: Ví dụ, tìm nghiệm sin(x)=2x+4 ∧( x/y>1) với x , y ∈ R Nhưng cịn nhiều phương trình có độ phức tạp cao mà công cụ không hỗ trợ xem nhược điểm phương pháp giải hệ ràng buộc công cụ SMT-Solver Q trình phương pháp mơ tả chi tiết trong Hình 3.16 Đầu tiên, biểu thức lôgic dạng trung tố hệ ràng buộc chuyển thành biểu thức hậu tố biểu diễn biểu thức Sau đó, biểu thức phân tích để biểu thức theo chuẩn đầu vào công cụ SMT-Solver SMT-Lib Cuối cùng, công cụ SMTSolver hỗ trợ giải biểu thức để thu ca kiểm thử Biểu thức lôgic Biểu thức hậu tố Cây biểu thức Biểu thức chuẩn SMT Ca kiểm Solver SMT-Lib thử Hình 3.16 Quá trình giải hệ ràng buộc cơng cụ SMT-Lib Hai hệ ràng buộc xem độc lập với ràng buộc hệ bị thay đổi khơng ảnh hưởng đến hệ cịn lại 35 Ví dụ cụ thể, biểu thức trung tố (2 ∗ a + b) < c Biểu thức phân tích thành dạng biểu thức hậu tố 𝑎 ∗ 𝑏 + 𝑐 < Thuật toán Infix_To_Postfix(infixExp) Đầu vào: infixExp: danh sách theo thứ tự token biểu thức trung tố Một token toán tử, toáng hạng dấu () Đầu ra: posfixExp: danh sách token biểu thức hậu tố 1: posfixExp := Ø 2: Khởi tạo ngăn xếp stack để lưu token 3: for (mỗi token t infixExp duyệt từ trái qua phải) 4: if (t toán hạng) 5: 6: posfixExp.add(t) else if (t dấu mở ngoặc “(“ ) 7: 8: stack.add(t) else if (t dấu đóng ngoặc “)“ ) 9: Lấy tốn tử stack cho vào posfixExp 10: gặp dấu mở ngoặc “(“ 11: stack.pop(); 12: else if (t toán tử) 13: top := token đỉnh stack 14: if (top toán tử độ ưu tiên top >= độ ưu tiên t) 15: stack.pop() 16: posfixExp.add(top) 17: else 18: stack.push(t) 19: 20: end if end if 21: end for 22: Thêm token lại stack vào posfixExp Thuật toán chuyển đổi biểu thức dạng trung tố sang hậu tố mơ tả chi tiết Thuật tốn Đầu vào thuật toán infixExp danh sách token theo thứ tự biểu 22: 36 thức trung tố Các token thành phần biểu thức, tốn hạng, tốn tử dấu đóng ngoặc “)” mở ngoặc “(“ Đầu posfixExp danh sách theo thứ tự token biểu thức hậu tố Đầu tiên, posfixExp danh sách rỗng (dòng 1), ngăn xếp stack khởi tạo để lưu token (dịng 2) Sau token biểu thức dạng trung tố duyệt từ trái qua phải (dịng 3) Nếu token tốn hạng token thêm vào posfixExp (dịng 4, 5) Cịn token dấu mở ngoặc “(” token thêm vào stack (dịng 6, 7) Nhưng token dấu đóng ngoặc “)” (dịng 8) toán tử stack lấy thêm vào posfixExp gặp dấu mở ngoặc “(“ (dòng 9, 10) dấu mở ngoặc phải đưa khỏi stack (dịng 11) Nếu token tốn tử (dịng 12) chừng đỉnh stack tốn tử tốn tử có độ ưu tiên lớn tốn tử lấy tốn tử khỏi stack thêm vào posfixExp (dịng 13 đến 16), khơng thêm token vào posfixExp (dòng 18) Sau duyệt hết biểu thức infixExp, stack cịn phần tử lấy token cho vào posfixExp (dịng 22) Sau biểu thức dạng hậu tố biểu diễn thành biểu thức Hình 3.17 < c + b * a Hình 3.17 Cây biểu thức biểu thức trung tố 2*a + b < c Mỗi cơng cụ SMT-Solver có kiểu biểu thức chuẩn đầu vào riêng Vì vậy, tùy thuộc vào công cụ SMT-Solver sử dụng để xây dựng thuật toán chuyển đổi từ biểu thức sang dạng biểu thức chuẩn đầu vào 37 Công cụ thực nghiệm 4.1 Giới thiệu công cụ 4.1.1 Tổng quan công cụ Công cụ CFT4JUnit xây dựng theo phương pháp đề xuất Chương Công cụ sử dụng giải Z3 phương pháp sinh ngẫu nhiên để giải hệ ràng buộc Công cụ viết ngôn ngữ Java, sử dụng Java Swing3 để hiển thị giao diện người dùng Ngồi ra, cơng cụ sử dụng thêm phần bổ trợ JDT để phân tích mã nguồn giúp xây dựng đồ thị CFG Hình 4.1 Sơ đồ kiến trúc cơng cụ CFT4Junit Hình 4.1 mơ tả kiến trúc cơng cụ Đầu vào cơng cụ mã nguồn hàm viết ngôn ngữ Java Thành phần Source Code Parser dùng để phân tích mã nguồn đầu vào sinh đồ thị gọi hàm cho tồn chương trình Sau đó, hàm đơn vị đưa vào thành phần Function Parser để sinh đồ thị CFG tương ứng Quá trình yêu cầu thêm đầu vào Test settings tiêu chí phủ kiểm thử, số lần lặp tối đa, v.v Bộ Test path analyzer sử dụng để sinh đường từ đồ thị CFG thỏa mãn tiêu chí cho trước Sau đó, đường thi hành đưa vào thực thi tượng trưng – Symbolic https://docs.oracle.com/javase/tutorial/uiswing/start/about.html 38 Execution để trích xuất ràng buộc đường thi hành Các hệ ràng buộc tiếp tục đưa vào giải – Solver để tìm nghiệm thỏa mãn Các giải Z3 sinh ngẫu nhiên thành phần Solver Sau có liệu kiểm thử, cơng cụ nhận thêm đầu vào giá trị đầu mong muốn – Expected output tương ứng với đầu vào để thực thi so khớp qua Test data Execution Cuối cùng, công cụ xuất biên kiểm thử hàm chọn kiểm thử Hình 4.2 Giao diện cơng cụ Hình 4.2 giao diện công cụ Phần bên trái giao diện hiển thị đồ thị CFG hàm cần kiểm thử Phần bên phải giao diện hiển thị liệu kết kiểm thử, nội dụng mã nguồn, v.v 4.1.2 Đồ thị dịng điều khiển CFG Hình 4.3 mơ tả đồ thị CFG ứng với hàm foo mơ tả Hình 4.4 Đỉnh đầu đỉnh cuối đánh dấu hình trịn, câu lệnh thực thi đỉnh hình chữ nhật, câu lệnh rẽ nhánh đỉnh hình thoi Nhánh câu lệnh rẽ nhánh đánh dấu màu xanh cây, nhánh sai đánh dấu màu xanh xương Ở bên trái, biểu thức điều kiện phức hợp hiển thị đỉnh Với hình bên phải, điều kiện phức hợp chia tách làm ba điều kiện có liên kết với 39 Hình 4.3 Đồ thị CFG thỏa mãn tiêu phủ câu lệnh, phủ nhánh phủ điều kiện Hình 4.4 Mã nguồn hàm foo 40 4.1.3 Tập đường kiểm thử Các đường kiểm thử sinh trình kiểm thử Mỗi tập đường ứng với tiêu chí phủ cụ thể hiển thị công cụ qua tab khác Công cụ hỗ trợ hiển thị tập đường kiểm thử trường hợp: phủ câu lệnh, phủ nhánh, phủ điều kiện con, tất đường đi, kiểm tra vòng lặp, kiểm thử tích hợp Hình 4.5 thí dụ danh sách đường thỏa mãn cấp độ phủ nhánh hàm foo Hình 4.5 Tập đường thỏa mãn phủ nhánh hàm foo 4.1.4 Tập ca kiểm thử Hình 4.6 Chi tiết ca kiểm thử ứng với đường hàm foo Ứng với đường cụ thể, người dùng chọn vào đường để xem chi tiết ca kiểm thử tương ứng Các liệu kiểm thử hiển thị gồm có: danh sách biến đầu vào với giá trị khởi tạo nó, giá trị sau hàm chạy xong, kết trả hàm, v.v Hình 4.6 mơ tả chi tiết ca kiểm thử ứng với đường số tập đường thỏa mãn độ phủ nhánh hàm foo 41 4.1.5 Các thư viện hỗ trợ 4.1.5.1 Giới thiệu giải Z3 Bộ giải Z34 công cụ SMT-Solver sử dụng phổ biến Đây công cụ Microsoft Research phát triển, viết ngôn ngữ C++ Đầu vào công cụ tập tin chứa ràng buộc lô-gic theo chuẩn SMT-Lib Bằng việc sử dụng qua dịng lệnh API, cơng cụ phân tích xác định xem hệ ràng buộc có nghiệm hay khơng, đưa nghiệm thỏa mãn tồn Hình 4.7 mơ tả thí dụ việc sử dụng cơng cụ Z3 Đầu vào công cụ bao gồm hai khai báo biến x, y kiểu int (dòng 1, 2) với hai ràng buộc x < 10 (x+y) >= 10 (dòng 3, 4) Hai lệnh check-sat get-model dùng để kiểm tra khả có nghiệm lấy giá trị phù hợp có Sau sử dụng công cụ, ta thu đầu với kết sat tương ứng với hệ có nghiệm thỏa mãn Sau đó, giá trị thỏa mãn đưa ra: x = y = Z3 Hình 4.7 Thí dụ đầu vào đầu công cụ Z3 4.1.5.2 Giới thiệu công cụ JDT JDT5 phân tích cấu trúc mã nguồn Java để tạo cấu trúc trừu tượng (AST) JDT plugin công cụ Eclipse, nhiên sử dụng cách độc lập Đầu vào công cụ tập tin mã nguồn Java Sử dụng API công cụ cho phép ta thu AST tương ứng với mã nguồn Sau đó, AST sử dụng để xây dựng nên đồ thị CFG phục vụ việc chuẩn hóa biểu thức để phục vụ q trình thực thi tượng trưng Hiǹ h 5.2 mơ tả thí dụ nút AST tương ứng với đoạn mã nguồn return x*3 Phần gốc nút đại diện cho cá đoạn mã nguồn, bao gồm https://github.com/Z3Prover/z3 https://eclipse.org/jdt/ 42 nút mơ tả phép tốn (x*3) trả Nút ứng với phép toán bao gồm hai nút ứng với hai biểu thức x IASTReturnStatement IASTBinaryExpression: * IASTIdExpression IASTLiteralExpression: IASTName: x Hình 4.8 Minh họa AST ứng với mã nguồn return x*3 4.2 Thực nghiệm Để tính hiệu phương pháp đề xuất, phần thực nghiệm đưa kết thực thi kiểm thử số chương trình điển hình, đánh giá kết dựa ca kiểm thử thu được, độ phủ mã nguồn, khả phát lỗi 4.2.1 Kiểm thử hàm đơn giản Hình 4.9 Mã nguồn hàm Hình 4.9 mã nguồn hàm min, nhận đầu vào mảng số nguyên độ lớn mảng, đầu giá trị nhỏ mảng Kết kiểm thử công cụ mô tả theo Bảng 4.1 Theo đó, cơng cụ sinh testcase để thỏa mãn độ phủ câu lệnh hai testcase để thỏa mãn độ phủ nhánh 43 Bảng 4.1 Kết kiểm thử hàm Ca kiểm thử Tiêu chí Phủ câu lệnh Phủ nhánh Input Giá trị trả (a, n) = ({[0] => 5, [1] => -2}, 2) -2 (a, n) = ({[0] => 0, [1] => 0}, 2) (a, n) = ({[0] => 4, [1] => 1}, 2) Độ phủ 100 % 100 % 4.2.2 Kiểm thử hàm phức tạp Hình 4.10 Mã nguồn hàm SelectionSort Hình 4.10 mơ tả mã nguồn hàm SelectionSort, nhận đầu vào mảng số nguyên kích thước mảng, đầu mảng đầu vào xếp theo thứ tự tăng dần Kết sau chạy công cụ mô tả chi tiết Bảng 4.2 Theo đó, dù mã nguồn có độ phức tạp lớn so với thí dụ đầu tiên, công cụ sinh ca kiểm thử để thỏa mãn độ phủ câu lệnh hai ca kiểm thử để thỏa mãn độ phủ nhánh Bảng 4.2 Kết kiểm thử hàm SelectionSort Ca kiểm thử Tiêu chí Input Phủ câu lệnh Output (a, n) = ({[0] => 0, [1] => -1}, (a, n) = ({[0] => -1, [1] => 2) 0}, 2) 44 Độ phủ 100 % Phủ nhánh (a, n) = ({[0] => 0, [1] => -1}, (a, n) = ({[0] => -1, [1] => 2) 0}, 2) (a, n) = ({[0] => 0, [1] => 0}, 2) (a, n) = ({[0] => 0, [1] => 0}, 2) 100 % 4.2.3 Kiểm thử hàm có lỗi tiềm ẩn Để kiểm tra khả phát lỗi, mã nguồn chứa lỗi đưa vào công cụ để kiểm tra Hình 4.11 mơ tả mã nguồn hàm divide, nhận tham số gồm hai số nguyên, trả kết nguyên theo số điều kiện giả định Kết từ công cụ mô tả chi tiết Bảng 4.3 Theo đó, ứng với mối tiêu chí phủ câu lệnh phủ nhánh, cơng cụ sinh bốn test case tương ứng Trong đó, có test case tương ứng với kết trả lỗi chia cho Hình 4.11 Mã nguồn hàm divide Bảng 4.3 Kết kiểm thử hàm divide Tiêu chí Phủ câu lệnh Phủ nhánh Ca kiểm thử Input Giá trị trả (x, y) = (0, 1) (x, y) = (-1, 0) -1 (x, y) = (1, 0) Lỗi chia cho (x, y) = (2, 0) (x, y) = (0, 1) 45 Độ phủ 71 % 75 % (x, y) = (-1, 0) -1 (x, y) = (1, 0) Lỗi chia cho (x, y) = (2, 0) 4.2.4 Ý nghĩa thực nghiệm Kết thực nghiệm cho thấy ưu điểm phương pháp đề xuất việc kiểm thử hàm đơn vị Trong trường hợp đưa ra, công cụ sinh ca kiểm thử để phủ tối đa tiêu chí phủ kiểm thử Hơn nữa, số lượng ca kiểm thử sinh tương đối thấp đảm bảo độ tin cậy cao Cơng cụ có giải tốt mã nguồn có độ phức tạp cao (như hàm SelectionSort) Hơn nữa, với số mã nguồn có chứa lỗi tiềm tàng lỗi chia cho 0, truy cập số mảng âm, v.v công cụ cho phép sinh ca kiểm thử để phủ trường hợp lỗi tiềm tàng Đối với trình giải hệ ràng buộc, sử dụng kết hợp hai giải Z3 sinh ngẫu nhiên, hệ ràng buộc ứng với hàm trình bày công cụ hỗ trợ giải thành công, kể trường hợp có hệ ràng buộc phức tạp hàm SelectionSort, divide Bộ giải hệ sinh ngẫu nhiên sử dụng biện pháp sau cùng, thời gian giải lâu cho kết mang tính ngẫu nhiên cao so với giải Z3 46 Kết luận Hiện nay, lượng mã nguồn lớn phức tạp gây nhiều khó khăn việc sinh ca kiểm thử, đặc biệt kĩ thuật kiểm thử hộp trắng Vì thế, kiểm thử tự động xem giải pháp hiệu để giải vấn đề Khóa luận đề xuất phương pháp sinh ca kiểm thử tự động cho đơn vị chương trình Java cài đặt công cụ hỗ trợ CFT4JUnit Công cụ hỗ trợ kiểm thử hàm đơn vị viết ngôn ngữ Java với ba tiêu chí phủ phủ câu lệnh, phủ nhánh phủ điều kiện Đồng thời, vịng lặp đơn, vịng lặp lồng kiểm thử công cụ Đầu vào công cụ gồm hàm đơn vị Java có chứa biến số nguyên, số thực, biến mảng tiêu chí phủ kiểm thử, số vòng lặp tối đa Đầu tập ca kiểm thử đáp ứng tiêu chí phủ kiểm thử tập ca kiểm thử cho kiểm thử vịng lặp Ngồi ra, cơng cụ hỗ trợ hiển thị đồ thị dòng điều khiển hàm ứng với tiêu chí phủ kiểm thử, cho phép người dùng tương tác cách trực quan dễ dàng Khóa luận đề xuất phương pháp kiểm thử tự động dòng điều khiển hộp trắng cho hàm Java có tham số đầu vào biến số nguyên, số thực biến mảng Phương pháp sử dụng kĩ thuật xây dựng đồ thị CFG phân tích từ mã nguồn hàm Khóa luận đề xuất kĩ thuật thực thi tượng trưng SE để sinh hệ ràng buộc từ đường độc lập Các hệ ràng buộc giải kĩ thuật sinh ngẫu nhiên tận dụng mạnh công cụ SMTSolver có Kết thực nghiệm bước đầu từ cơng cụ CFT4Junit khả quan Thời gian sinh ca kiểm thử ngắn so với kiểm thử động, số lượng ca kiểm thử để đạt độ phủ tối đa dễ quản lí Tuy nhiên, phương pháp chưa hỗ trợ kiểm thử cho hàm có mã nguồn phức tạp hàm có tham số đầu vào đối tượng class Trong tương lai, tập nghiên cứu để khắc phục nhược điểm nêu phương pháp mở rộng sang kiểm thử class thay hàm Đồng thời, việc sinh tự động đầu mong muốn vấn đề nghiên cứu để phương pháp hoàn thiện 47 Tài liệu tham khảo Tiếng Việt [1] Phạm Ngọc Hùng, Trương Anh Hồng, Đặng Văn Hưng (2014): Giáo trình kiểm thử phần mềm, NXB Đại học Quốc gia Hà Nội Tiếng Anh [2] EXSYST, https://www.st.cs.uni-saarland.de/exsyst/ [3] jPET, http://clip.dia.fi.upm.es/papers/jpet-11.pdf/ [4] Arthur H Watson and Thomas J McCabe, “Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric”, NIST Special Publication 500-235 [5] James C King (1976): “Symbolic execution and program testing” Commun ACM 19, (July 1976), 385-394 48 ... khiển Xây dựng tập đường kiểm thử Tìm tập ca kiểm thử Thực thi tập ca kiểm thử Kết thúc Hình 2.5 Quy trình chung kiểm thử tự động hộp trắng dòng điều khiển 2.4 So sánh kiểm thử tự động hộp trắng dòng. .. đó, kĩ thuật kiểm thử hộp trắng chủ yếu sử dụng cho kiểm thử đơn vị Kĩ thuật kiểm thử hộp trắng có hai phương pháp phổ biến kiểm thử dòng điều khiển kiểm thử dòng liệu Kiểm thử dòng liệu (data... với tiêu chí phủ kiểm thử Đầu tập ca kiểm thử thỏa mãn tiêu chí phủ kiểm thử 2.1.1 Đồ thị dòng điều khiển Trong kĩ thuật kiểm thử hộp trắng dòng điều khiển, đồ thị dòng điều khiển CFG (Control

Ngày đăng: 04/11/2020, 23:41

TỪ KHÓA LIÊN QUAN