Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 111 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
111
Dung lượng
2,47 MB
Nội dung
ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA - - NGUYỄN CÁT ĐỊNH SINH TEST CASE TỰ ĐỘNG CHO CHƯƠNG TRÌNH CHỨA ĐIỀU KIỆN PHỨC TẠP SỬ DỤNG GIẢI THUẬT DI TRUYỀN Chuyên ngành : Khoa học máy tính Mã số : 60 48 01 LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, THÁNG 12/2012 CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TP.HCM Cán hướng dẫn khoa học: TS Quản Thành Thơ Cán chấm nhận xét 1: Cán chấm nhận xét 2: Luận văn thạc sĩ bảo vệ Trường Đại học Bách Khoa, ĐHQG Tp HCM, ngày … tháng … năm 2012 Thành phần hội đồng đánh giá luận văn thạc sĩ gồm: (Ghi rõ họ, tên, học hàm, học vị Hội đồng chấm bảo vệ luận văn thạc sĩ) Xác nhận Chủ tịch Hội đồng đánh giá LV Trưởng Khoa quản lý chuyên ngành sau luận văn sửa chữa (nếu có) CÁN BỘ HƯỚNG DẪN (Họ tên chữ ký) CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: Nguyễn Cát Định MSHV: 10071116 Ngày, tháng, năm sinh: 13/08/1988 Nơi sinh: Gia Lai Chuyên ngành: Khoa Học Máy Tính Mã số : 60 48 01 I TÊN ĐỀ TÀI: Sinh test case tự động cho chương trình chứa điều kiện phức tạp sử dụng Giải thuật Di truyền II NHIỆM VỤ VÀ NỘI DUNG: Nhiệm vụ : Nghiên cứu xây dựng ứng dụng hỗ trợ việc sinh test case cho chương trình ngơn ngữ C/C++ có chứa điều kiện phức tạp có lời gọi hàm thư viện phép toán phức tạp khác, kiểu liệu khác Nhiệm vụ chi tiết : o Tìm hiểu phương pháp sinh test case tự động cho chương trình bao gồm phương pháp hướng mục tiêu (Goal – Oriented) phương pháp hướng đường (Path – Oriented) Từ đó, viết chương trình sinh test case tự động dựa phương pháp tìm hiểu o Nghiên cứu kĩ thuật thực thi kí hiệu (Symbolic Execution); xây dựng chương trình phân tích đoạn chương trình C/C++ theo luồng thực thi chương trình, từ tạo tập điều kiện chương trình dạng biểu thức logic o Nghiên cứu cơng cụ giải tốn khả thỏa mãn (SMT solver); xây dựng chương trình giải điều kiện có dạng biểu thức logic thu trình thực thi kí hiệu, sinh test case tương ứng với điều kiện o Nghiên cứu cải tiến thuật giải di truyền để hiểu lời gọi hàm chương trình Từ đó, xây dựng chương trình giải điều kiện có dạng biểu thức logic có chứa lời gọi hàm phép tốn phức tạp mà cơng cụ SMT solver khơng thể giải được, sinh test case tương ứng với điều kiện o Thực kiểm thử chương trình với chương trình ban đầu test case sinh o Xây dựng ứng dụng minh họa cho công việc III NGÀY GIAO NHIỆM VỤ : 06/02/2012 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 30/11/2012 V CÁN BỘ HƯỚNG DẪN : Tiến sĩ Quản Thành Thơ Tp HCM, ngày tháng 12 năm 2012 CÁN BỘ HƯỚNG DẪN (Họ tên chữ ký) CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) TRƯỞNG KHOA KHOA HỌC MÁY TÍNH (Họ tên chữ ký) LỜI CẢM ƠN Lời đầu tiên, em xin gửi lời cảm ơn chân thành sâu sắc đến thầy Tiến sĩ Quản Thành Thơ, người thầy trực tiếp hướng dẫn Luận văn em Thầy người truyền đạt cho em kiến thức tảng quý báu, người ln tận tình hướng dẫn, giúp đỡ động viên em vượt qua khó khăn suốt q trình thực để hồn thành đề tài Luận văn Em xin gửi lời cảm ơn đến quý thầy cô Khoa dạy dỗ truyền đạt cho em kiến thức chuyên môn suốt thời gian học tập bậc thạc sĩ, tạo điều kiện cho em thực đề tài Tôi xin gửi lời cảm ơn đến người bạn nhóm nghiên cứu: Nguyễn Thị Vân Phương, Lâm Ngọc Trần, Phạm Hồng Long, Nguyễn Hữu Phát,… bên cạnh động viên, giúp đỡ gặp trở ngại chia sẻ thành công, thất bại Cuối cùng, xin chân thành cảm ơn cha mẹ, người nuôi dưỡng, dạy dỗ khôn lớn ngày hôm Cha mẹ sát cánh, dõi theo bước bên cạnh, cho lời khuyên quý giá gặp khó khăn, trở ngại đường học vấn Tp HCM, ngày tháng 12 năm 2012 Nguyễn Cát Định i TĨM TẮT LUẬN VĂN Trong q trình kiểm thử chương trình (Software Testing), phương pháp sinh test case tự động phương pháp Hướng đường (Path – Oriented) Hướng mục tiêu (Goal – Oriented) gặp phải vấn đề sinh test case cho chương trình chứa lời gọi thủ tục, lời gọi hàm hay phép toán phức tạp Nguyên nhân phương pháp chủ yếu dựa vào công cụ giải ràng buộc (Constraint solving) công cụ thực thi giả lập (Simulated execution), công cụ giải phép tốn luận lí, quan hệ hay số học thơng thường kiểu liệu số nguyên Đối với chương trình lớn có chứa điều kiện phức tạp kiểu liệu khác float, double…thì phương pháp chưa thể giải Vì hệ thống xây dựng dựa phương pháp TESTGEN, GADGET, DISSECT… chưa thể sử dụng việc kiểm thử chương trình thương mại Luận văn đưa phương pháp sinh test case tự động cho chương trình chứa điều kiện phức tạp Phương pháp dựa ý tưởng phương pháp Hướng mục tiêu Theo đó, cơng cụ thực thi kí hiệu (Symbolic execution) sử dụng để thực thi đoạn mã nguồn chương trình Sau thực thi, tập điều kiện chương trình rút dạng biểu thức logic biến đầu vào Việc sinh test case cho chương trình lúc q trình giải biểu thức logic Quá trình sinh test case thực qua hai giai đoạn Giai đoạn một, công cụ giải ràng buộc áp dụng để giải điều kiện đơn giản Giai đoạn hai, với điều kiện có chứa lời gọi hàm phép toán phức tạp, luận văn sử dụng giải thuật di truyền cải tiến để giải điều kiện Kết thu sau hai giai đoạn tập test case đầy đủ để tiến hành kiểm thử chương trình ii ABSTRACT In the process of software testing, automatic test case generation methods presently such as path-oriented and goal-oriented have encountered problems when generating test case for programs including procedure calling functions, library calling functions or complex expressions The reason is that these methods mainly rely on constraint solving or simulated execution tools, which only deal with logical, relational or arithmetic operations in integer data type With other large programs containing some complex conditions or different data types such as double, float, etc., these methods are still not be helpful Therefore, systems developed basing on these methods, for example TESTGEN, GADGET, DISSECT, etc have not been applied yet in testing current trading programs The thesis aims to offer an automatic method of case testing programs including complex conditions This method is based on the idea of goal-oriented test case generation In fact, a symbolic execution tool is employed to execute following program’s source code After executing, a condition set of the program will be drawn out in the form of logic formulas in the input variable After that, test case generation procedures will be applied in phases In the first phase, a constraint solving tool is used to solve simple conditions In the second phase, ưith conditions consisting calling functions or complex expressions, the thesis uses an improved Genetic Algorithm to solve them The results found after the two phases are the fully test case set used to test this program iii LỜI CAM ĐOAN Tôi xin cam đoan luận văn cơng trình nghiên cứu thực cá nhân tôi, thực sở nghiên cứu lý thuyết, kiến thức tảng lĩnh vực kiểm thử phần mềm hướng dẫn khoa học Tiến sĩ Quản Thành Thơ Tôi xin cam đoan số liệu, hình vẽ bảng biểu, biểu đồ sử dụng luận văn thuộc sở hữu cá nhân tôi, trừ phần trích dẫn nguồn tham khảo Tp HCM, ngày tháng 12 năm 2012 Nguyễn Cát Định iv MỤC LỤC LỜI CẢM ƠN i TÓM TẮT LUẬN VĂN ii ABSTRACT iii LỜI CAM ĐOAN iv MỤC LỤC v MỤC LỤC HÌNH vii MỤC LỤC BẢNG ix MỞ ĐẦU CHƯƠNG TỔNG QUAN 1.1 Đặt vấn đề 1.2 Phát biểu đề tài 1.3 Đóng góp đề tài 1.4 Bố cục luận văn CHƯƠNG CƠ SỞ LÝ THUYẾT 11 2.1 Tính đắn chương trình (Program Correctness) 11 2.1.1 Kiểm tra phần mềm (Software Verification) 13 2.1.2 Kiểm thử phần mềm (Software Testing): 14 2.2 Thực thi kí hiệu (Symbolic Execution) 16 2.3 Các giải thuật hướng tự nhiên 21 2.3.1 Mô luyện kim (Simulated Annealing) 22 2.3.2 Giải thuật di truyền (Genetic Algorithm) 24 2.4 Các phương pháp sinh test case tự động 27 2.4.1 Phương pháp hướng mục tiêu (Goal-oriented) 28 2.4.2 Phương pháp hướng đường (Path-oriented) 34 2.4.3 Những phương pháp sinh test case khác 41 CHƯƠNG PHƯƠNG PHÁP SINH TEST CASE CHO CHƯƠNG TRÌNH 42 3.1 Chương trình chứa điều kiện phức tạp 42 v 3.2 Phương pháp đề xuất 45 3.3 Bộ phân tích mã nguồn (Code Analyzer) 48 3.4 Bộ thực thi kí hiệu (Symbolic Execution) 52 3.5 Bộ sinh test case (Test Case Generation) 55 3.5.1 SMT solver 56 3.5.2 Bộ chuyển đổi (Converter) 60 3.5.3 Giải thuật di truyền (Genetic Algorithm) 61 CHƯƠNG HIỆN THỰC CHƯƠNG TRÌNH 68 4.1 Giới thiệu chương trình 68 4.2 Giới thiệu chức 69 CHƯƠNG KẾT QUẢ THỰC NGHIỆM VÀ ĐÁNH GIÁ 74 5.1 Thực nghiệm 74 5.1.1 Giới thiệu 74 5.1.2 Hệ thống slicing system 76 5.1.3 Thực nghiệm 77 5.2 Đánh giá 82 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 84 6.1 Kết luận 84 6.2 Hướng phát triển 85 TÀI LIỆU THAM KHẢO 87 PHỤ LỤC 90 vi Trong hai trường hợp khơng tìm test case phù hợp, trường hợp hai chiếm tỉ lệ cao trường hợp (hơn 60%) Tuy nhiên, điều dễ hiểu giải thuật di truyền thường xảy khả khơng tìm kết tối ưu Đặc biệt miền giá trị tìm kiếm lớn, miền kết hạn chế miền nhỏ Điều minh chứng rõ ràng tiến hành sinh test case cho chương trình có kiểu liệu Float Đối với kiểu liệu khác khả tìm kết khác Ta thấy khả sinh test case kiểu liệu kiểu số nguyên (int) tốt nhiều so với kiểu liệu số thực (float) Thực nghiệm cho thấy, tỉ lệ sinh test case thành cơng trung bình với chương trình có kiểu liệu int 98.9%, với kiểu liệu float 89% Điều giải thích khơng gian tìm kiếm kiểu liệu float lớn nhiều so với kiểu liệu int 83 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 Kết luận Với phát triển mạnh mẽ ngành công nghệ thơng tin nước tồn giới, số lượng chương trình sản xuất phân phối thị trường ngày tăng Cùng với đó, phương pháp kĩ thuật kiểm thử chương trình nghiên cứu phát triển nhằm hỗ trợ cho quy trình kiểm tra chất lượng chương trình Hệ thống xây dựng luận văn học viên nhằm mục tiêu Trong luận văn này, học viên trình bày phương pháp để sinh test case cho chương trình chứa điều kiện phức tạp Phương pháp mở tiềm lớn cho việc kiểm tra chương trình thực tế với độ khó cao phức tạp cấu trúc Hệ thống sinh test case luận văn xây dựng theo phương pháp hướng mục tiêu Theo đó, kĩ thuật thực thi kí hiệu sử dụng kết hợp với cơng cụ giải ràng buộc để tìm test case cho chương trình Trong đó, thực thi kí hiệu dùng để phân tích chương trình, tìm tập điều kiện chương trình dạng biểu thức logic Các công cụ giải ràng buộc sử dụng để giải biểu thức tìm test case phù hợp Trong luận văn này, tác giả sử dụng công cụ SMT solver giải thuật di truyền để giải điều kiện SMT solver sử dụng để giải điều kiện đơn giản, giúp đẩy nhanh trình sinh test case đảm bảo độ xác Sau đó, giải thuật di truyền áp dụng để giải điều kiện phức tạp Hệ thống đề xuất tận dụng ưu điểm phương pháp hướng mục tiêu, số lượng test case thấp bao phủ đầy đủ câu lệnh thực thi chương trình Bên cạnh đó, luận văn tận dụng khả hoạt động kết hợp hỗ trợ lẫn kĩ thuật thực thi kí hiệu, SMT solver giải thuật di truyền việc sinh test case Giải thuật di truyền áp dụng công cụ giải ràng buộc kết hợp tốt, giúp cho hệ thống xử lý với chương trình chứa điều kiện phức tạp Hệ thống xây dựng hỗ trợ nhiều loại chương trình có điều 84 kiện phức tạp, đồng thời hỗ trợ kiểu liệu đầu vào khác Thực nghiệm cho thấy hệ thống xây dựng có khả hoạt động tốt tỉ lệ sinh test case thành cơng cao Tuy nhiên, luận văn cịn nhiều điểm hạn chế Thứ nhất, với biến chương trình có khơng gian tìm kiếm rộng, khả tìm giá trị phù hợp cho biến thấp Điều thể rõ chỗ, hiệu sinh test case với biến kiểu số thực thấp rõ so với kiểu số nguyên Thứ hai, phương pháp xử lý vịng lặp phân tích mã nguồn chương trinh luận văn sơ sài Do đó, ngữ nghĩa chương trình có vịng lặp có khả khơng phân tích xác Ngồi ra, hệ thống hỗ trợ hàm tính toán lượng giác, số mũ, logarit,… thư viện Math hệ thống, lời gọi hàm khác chưa hỗ trợ 6.2 Hướng phát triển Với kết đạt luận văn, học viên đề số hướng phát triển sau: - Với vấn đề khơng tìm test case phù hợp khơng gian tìm kiếm rộng, ta sử dụng hương pháp bán tự động (semi-automation) Qua đó, người dùng thêm ràng buộc cho biến chương trình, giúp cho khơng gian tìm kiếm thu nhỏ lại, giúp cho khả tìm test case tốt cao - Thực cải tiến cho hệ thống để hỗ trợ tốt việc xử lý vòng lặp Việc phát triển cải tiến dựa ý tưởng báo Tahbildar Kalita [15] Đồng thời, mở rộng hệ thống để hỗ trợ lời gọi hàm thư viện khác - Thực cải tiến cho hệ thống để hỗ trợ kiểu liệu trỏ, struct hay class… Với kiểu liệu trỏ, việc cải tiến dựa ý tưởng báo Gotlieb, Denmat Boteli [28] 85 - Áp dụng phương pháp tự hoàn thiện trình bày luận văn V.T.Le [30] chương trình có lời gọi hàm thủ tục, từ hổ trợ khả sinh test case chương trình dạng này, từ giúp cho hệ thống có khả hỗ trợ nhiều loại chương trình 86 TÀI LIỆU THAM KHẢO [1] G.Tassey, The economics impact of inadequate infrastructure for software testing, National Institute of Standards and Technology report, 2002 [2] B.Bezier, Software testing techniques, Van Nostrand Reinhold 2nd edition, 1990 [3] G.C.King, Symbolic Execution and Program Testing, Communications of the ACM, volume 19, number 7, 1976 [4] L.A.Clark, A system to generate test data and symbolically execute programs, Journal IEEE Transactions on Software Engineering, 1976 [5] C.V.Ramamoorthy, S.F.Ho and W.T.Chen, On the automated generation of program test data, In proceeding of the 2nd international conference on Software Engineering, 1976 [6] W.E.Howden, Symbolic testing and the DISSECT symbolic evaluation system, Journal IEEE Transactions on Software Engineering, 1977 [7] B.F.Jones, H.-H.Sthamer and D.E.Eyres, Automatic structural testing using genetic algorithms, Journal Software Engineering, 1996 [8] N.Tracey, J.Clark and K.Mander, Automated Program Flaw Finding using Simulated Annealing, In the proceedings of the ACM/SIGSOFT International Symposium on Software Testing and Analysis (ISSTA), 1998 [9] N.Mansour and M.Salame, Data Generation for Path Testing, Journal Software Quality, 2004 [10] T.H.Nguyen’s thesis, Nghiên cứu phát triển hệ thống Slicing-Based Testing cho chương trình C/C++, University of Technology, 2012 [11] P.Mishra, B.Shankar and P.Mishra, Eccentric Test Data Generation for Path Testing Using Genetic Algorithm, In proceeding of the International Conference on Computer Engineering and Applications, 2009 [12] B.Korel, A dynamic approach of automated test data generation, Conference on Software Maintenance, 1990 [13] C.C.Micheal, G.McGraw and M.A.Schatz, Generating Software Test Data by Evolution, Journal IEEE Transactions on Software Engineering, 2001 87 [14] R.Blanco, J.Tuya and B.Adenso-díaz, Automated test data generation using a Scatter Search approach, Journal of Information and Software Technology, 2009 [15] H.Tahbildar and B.Kalita, Heuristic approach of automated test data generation for programs having array of different dimensions and loops with variable number of iteration, International Journal of Software Engineering & Applications, 2010 [16] N.Gupta, A.P.Mathur and M.L.Soffa, Automated test data generation using an iterative relaxation method, In proceedings of the 6th ACM SIGSOFT international symposium on Foundations of software engineering, 1998 [17] A.Gotlieb, B.Botella and M.Rueher, Automatic test data generation using constraint solving techniques, In proceedings of the ACM SIGSOFT international symposium on Software testing and analysis, 1998 [18] M.Xiao, M.El-Attar, M.Reformat and J.Miller, Empirical evaluation of optimization algorithms when used in goal-oriented automated test data generation techniques, Journal Empirical Software Engineering, 2007 [19] M.Ouimet, Formal Software Verification: Model Checking and Theorem Proving, Technical Report ESL-TIK-00214, Massachusetts Institute of Technology, 2008 [20] M.L.Hutcheson, Software Testing Fundamentals-Methods and Metrics, Wiley Publishing, 2003 [21] Software Testing, available at http://en.wikipedia.org/wiki/Software_testing [22] Abstract Syntax tree, available at http://en.wikipedia.org/wiki/Abstract_syntax_tree [23] Control Flow Graph, available at http://en.wikipedia.org/wiki/Control_flow_graph [24] SMT solvers, http://en.wikipedia.org/wiki/Satisfiability_Modulo_Theories [25] L.D.Moura, N.Bjorner, Z3: An efficient SMT solver, In proceeding of the Theory and practice of software, 14th international conference on Tools and algorithms for the construction and analysis of systems TACAS/ETAPS, 2008 [26] I.Chung, J.M.Bierman, Automated test data generation using a relational approach, In proceeding of 6th Int Conf on Applications and Principles of Information Science (APIS), 2007 [27] M.A.Ahmed, I.Hermadi, GA-based multiple paths test data generator, Computers and Operations Research Journal, 2008 88 [28] A.Gotlieb, T.Denmat, B.Botell, Goal-oriented test case generation for pointers program, Information and Software Technology Journal, 2007 [29] J.C.Lin and P L.Yeh, Automatic test data generation for path testing using GAs, Information Sciences: an International Journal, 2001 [30] V.T.Le’s master thesis, Kiểm tra mơ hình dựa đặc tả cho chương trình chưa hồn thiện, University of Technology, 2012 [31] M.J.Gallagher, V.L.Narasimhan, ADTEST: A Test Data Generation Suite for Ada Software Systems, IEEE Transactions on Software Engineering Journal, 1997 89 PHỤ LỤC Các chương trình thực nghiệm sử dụng: Solvable Solvable int foo(int N) { if (N > 0) { int s = 0; int i; for (i=1; i 1) x = 2; s = s+x; i = i+1; } return s; } Solvable Solvable int foo(int n) { int x = 3; int i = 0; while (i < n) { if (i % == 1) { x = 5; } else { x = 7; } i++; } return x; } int foo(int X, int Y) { if (X 15) x = x+2; return x; } } Solvable Solvable int foo(int M,int N) { if (M > && N > 0) { if (M > N) { return M; } else { return N; } } else { return -1; } } int function(int X, int Y, int Z) { if (X=Y&&Y>=X)) mid=Y; else if ((Y>=X&&X>=Z)||(Z>=X&&X>=Y)) mid=X; else mid=Z; if (mid%2==0) mid=mid/2; if (mid%3==1) mid=mid/3; return mid*mid; } } Solvable Solvable 10 int function(int X, int Y, int Z) { if (X>0&&Y>0&&Z>0) { int mid; if ((X>=Y&&Y>=Z)||(Z>=Y&&Y>=X)) mid=Y; // Y la so o giua else if ((Y>=X&&X>=Z)||(Z>=X&&X>=Y)) mid=X; // X la so o giua else mid=Z; // Z la so o giua if (mid%2==0) void Tomorrow(int day, int date, int month, int year) { int next_day, next_date, next_month, next_year; next_day = day; next_date = date; next_month = month; next_year = year; if(day >= && day=1 && date =1 && month c)&&(b+c > a)&&(c+a > b)) { if((a!=b)&&(b!=c)&&(c!=a)) { triangle = 1; } else { if(((a == b)&&(b != c))||((b == c)&&(c != a))||((c == a)&&(a != b))){ triangle = 2; } else { triangle = 3; } } } else triangle = 0; return triangle; } int triangle(int a, int b, int c) { if (a a)) { return 4; } else { if (a == b && b == c) { return 1; } else if (a == b || a == c || b == c) { return 2; } else return 3; } } Solvable 13 Solvable 14 int ucln(int n, int m) { while(n!=0 && m!=0){ if(n>m){ n -= m; } int middle(int a, int b, int c) { if((a