Kết quả nghiên cứu Với mục tiêu đề ra ban đầu là nghiên cứu, tìm kiếm h ớng tiếp cận hiểu quả trong sử dụng kỹ thuật thực thi t ng tr ng áp dụng trong tự động sinh test case đề tài đã đ
Trang 1ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO TỔNG KẾT
ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP ĐẠI HỌC
NGHIÊN CỨU MỘT SỐ KỸ THUẬT SINH TEST CASE TỐT
TRONG KIỂM THỬ PHẦN MỀM
ĐH 2014-TN08-03
Chủ nhiệm đề tài: ThS Tô Hữu Nguyên
Trang 2ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO TỔNG KẾT
ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP ĐẠI HỌC
NGHIÊN CỨU MỘT SỐ KỸ THUẬT SINH TEST CASE TỐT
Trang 3DANH SÁCH THÀNH VIÊN THAM GIA NGHIÊN CỨU
học vị Đơn vị công tác
Nội dung công việc tham gia thực hiện trong đề tài
1 Nguyễn Hồng Tân Thạc sĩ
Bộ Môn: Công nghệ phần mềm - Khoa CNTT
Nghiên cứu, đánh giá tổng quan các kỹ thuật, các công cụ sinh dữ liệu kiểm thử tự động hiện
nay
2 Hà Thị Thanh Thạc sĩ
Bộ Môn: Công nghệ phần mềm - Khoa CNTT
Nghiên cứu về các thách thức của kiểm thử phần mềm, kỹ thuật thực thi
t ng tr ng
Trang 4MỤC LỤC
MỞ ĐẦU 1
Chương 1 TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ SINH DỮ LIỆU KIỂM THỬ 4
1.1 Kiểm thử phần mềm 4
1.2 Kiểm thử đơn vị 5
Chương 2 JAVA PATHFINDER VÀ THỰC THI TƯỢNG TRƯNG 9
2.1 Java pathfinder 9
2.1.1 Giới thiệu về JPF 9
2.1.2 Khả năng kiểm tra của JPF 10
2.1.3 Kiến trúc mức cao của JPF 11
2.1.4 Khả năng mở rộng của JPF 13
2.1.5 Một số mở rộng của JPF 14
2.2 Thực thi t ng tr ng 15
2.2.1 Những khái niệm cơ bản 15
2.2.2 Thực thi t ng tr ng tĩnh 16
2.2.3 Thực thi t ng tr ng động 20
2.2.4 Xây dựng ràng buộc 27
2.2.5 L u trữ giá trị t ng tr ng 29
2.3 SE với các kiểu dữ liệu nguyên thủy 30
2.4 SE với đối t ng 34
2.5 SE với các lời gọi ph ơng thức 38
2.6 Những thách thức và một vài giải pháp 39
2.6.1 Bùng nổ đ ờng đi 39
2.6.2 Giải các ràng buộc 41
2.6.3 Mô hình hóa bộ nhớ 43
2.6.4 Giải quyết vấn đề t ơng tranh 44
Chương 3 THỰC THI TƯỢNG TRƯNG TRÊN KIỂU DỮ LIỆU XÂU 44
3.1 Ràng buộc hỗn h p và giải ràng buộc xâu 45
3.1.1 Đồ thị xâu 46
3.1.2 Xây dựng lại ràng buộc 47
3.1.3 Tiền xử lý 48
3.1.4 Sinh các ràng buộc xâu 49
3.2.Giải ràng buộc xâu dựa trên ph ơng pháp BitVector 53
3.3.Cài đặt và đanh giá kêt quả 54
KẾT LUẬN VÀ KIẾN NGHỊ 57
TÀI LIỆU THAM KHẢO 58
Trang 5DANH MỤC HÌNH VẼ
Hình 1.1 Ph ơng thức kiểm thử trên VSUnit 5
Hình 1.2 Ph ơng thức LuhnAlgorithm 7
Hình 1.3 Ph ơng thức test cho LuhnAlgorithm 7
Hình 2.1 Mô hình hoạt động của JPF 9
Hình 2.2 Sơ đồ trạng thái trong quá trình kiểm thử 10
Hình 2.3 Kiến trúc JPF mức cao 12
Hình 2.4 Mẫu Listener 13
Hình 2.5 Cây thực thi t ng tr ng 19
Hình 2.6 Thuật toán thực thi t ng tr ng động 21
Hình 2.7 Thực thi t ng tr ng với ph ơng thức nhận đầu vào là đối t ng 24
Hình 2.8 Cây thực thi t ng tr ng đ c quản lý riêng 27
Hình 2.9 Hệ thống kiểm thử tổng quát 29
Hình 2.10 Gán giá trị t ng tr ng cho tham số đầu vào 31
Hình 2.11 Thực thi t ng tr ng với câu lệnh gán 32
Hình 2.12 Thực thi t ng tr ng với câu lệnh rẽ nhánh 34
Hình 2.13 Khởi tạo đối t ng làm đầu vào cho ch ơng trình 36
Hình 2.14 Sinh ra các ràng buộc liên quan tới đối t ng 38
Hình 3.1 Thuật toán giải ràng buộc hỗn h p 45
Hình 3.2 Đồ thị xâu 47
Hình 3.3 Đồ thị sau khi loại bỏ phép toán equals 48
Hình 3.4 Các ràng buộc không thỏa mãn sau khi loại bỏ phép toán equals 49
Hình 3.5 Các đỉnh mới đại diện cho độ dài xâu đ c bổ sung 49
Hình 3.6 Giải ràng buộc xâu dựa trên Automata 51
Hình 3.7 Ph ơng thức giải ràng buộc phủ định 52
Hình 3.8 Ch ơng trình Java kiểm thử 54
Hình 3.9 Kết quả sinh dữ liệu t ng tr ng trên một số phép toán trên xâu 54
Trang 6DANH MỤC BẢNG BIỂU
Bảng 2.1 Ví dụ về thực thi t ng tr ng động 23
Bảng 2.2 Minh họa việc chuyển đổi từ mã nguồn Java sang mã Jimple 27
Bảng 2.3 Sửa đổi ch ơng trình với câu lệnh liên quan tới đối t ng 34
Bảng 3.1 Xây dựng các ràng buộc cho các phép toán trên xâu 50
Bảng 3.2 Xây dựng dàng buộc t ơng ứng với các phép toán trên xâu 53
Trang 7
TRƯỜNG ĐHCNTT&TT
THÔNG TIN KẾT QUẢ NGHIÊN CỨU
1 Thông tin chung
- Tên đề tài: Nghiên cứu một số kỹ thuật sinh test case tốt trong kiểm thử phần mềm
- Mã số: ĐH2014-TN08-03.
- Chủ nhiệm: ThS Tô Hữu Nguyên
- Tổ chức chủ trì: Tr ờng Đại học Công nghệ Thông tin & Truyền thông, Đại học Thái Nguyên
- Thời gian thực hiện: 1/2014-12/2015.(Gia hạn đến tháng 6 năm 2016)
4 Kết quả nghiên cứu
Với mục tiêu đề ra ban đầu là nghiên cứu, tìm kiếm h ớng tiếp cận hiểu quả trong sử dụng kỹ thuật thực thi t ng tr ng áp dụng trong tự động sinh test case đề tài đã đạt đ c một số kết quả nh sau:
- Hệ thống các kiến thức cơ bản về kiểm thử phần mềm, kiểm thử units test
- Nghiên cứu về kỹ thuật thực thi t ng tr ng và các vấn đề liên quan
Trang 8Xây dựng thuật toán sinh dữ liệu kiểm thử trên kiểu dữ liệu xâu và đánh giá hiệu quả của thuật toán
Từ các nội dung nghiên cứu, nhóm thực hiện đã công bố trên các tạp chí trong
[1] Tô Hữu Nguyên, Nguyễn Hồng Tân, Hà Thị Thanh, Đỗ Thanh Mai (2016),
―Thực thi t ng tr ng trong sinh tự động dữ liệu kiểm thử phần mềm‖, Tạp
chí khoa học Đà Lạt –Đại Học Đà Lạt, 6(2), tr 254-273
[2] To Huu Nguyen, Tran Thi Ngan, Do Thanh Mai, Tran Manh Tuan (2016),
―A Novel Symbolic execution model in automated generation of test case‖,
International Journal of Innovative Technology and Exploring Engineering (IJITEE) e-ISSN: 2395 -0056, 3(7), pp 145-155
[3] Tô Hữu Nguyên, Nguyễn Hồng Tân, Hà Thị Thanh (2016), ―Kỹ thuật mô hình hóa ràng buộc hỗn h p và ph ơng pháp giải ràng buộc xâu trong thực thi
t ng tr ng‖, Tạp chí Khoa học và Công nghệ, Đại học Thái Nguyên,
159(14), tr 141-147
5.2 Sản phẩm đào tạo
[1] Lê Thị Định, Nghiên cứu kỹ thuật thực thi tượng trưng trong sinh tự động
các Test case, Khóa luận tốt nghiệp Đại học năm 2016, Quyết định số 443/QĐ
ĐHCNTT&TT ngày 15 tháng 06 năm 2016
[2] Đinh Trọng Tiến, Nghiên cứu áp dụng thực thi tượng trưng trong kiểm thử
Unit trên Junit cho ngôn ngữ Java, Khóa luận tốt nghiệp Đại học năm 2016,
Quyết định số 443/QĐ ĐHCNTT&TT ngày 15 tháng 06 năm 2016
[3] Đề tài góp phần đào tạo trình độ tiến sĩ cho NCS Tô Hữu Nguyên với tên đề
tài, Kỹ thuật thực thi tượng trưng trong việc sinh tự động các test case, của chính
Trang 9tác giả Tô Hữu Nguyên, Quyết định số 215/QĐ –CNTT-Viện CNT ngày 04 tháng 12 năm 2012
5.3 Sản phẩm ứng dụng
Sử dụng ph ơng pháp tiếp cận Automata xây dựng modul sinh dữ liệu kiểm
thử cho unit test trên kiểu dữ liệu xâu trên Java PathFinder
6 Phương thức chuyển giao, địa chỉ ứng dụng, tác động và lợi ích mang lại của kết quả nghiên cứu
6.1 Về bồi dưỡng, đào tạo nhân lực khoa học và công nghệ
Hiện nay, công nghệ thông tin đang là một trong những h ớng u đ c u tiên phát triển của Đảng và Nhà n ớc ta Đề tài nhằm mục đích chính là nghiên cứu
kỹ thuật thực thi t ng tr ng trong tự động sinh test case Nhóm nghiên cứu
ph ơng pháp áp dụng ph ơng pháp tiếp thực thi t ng tr ng kết h p java pathfinder trong tự động sinh các test case trên kiểu dữ liệu xâu, nhằm nâng cao khả năng áp dụng kỹ thuật này vào trong thực tế
Đây cũng là một trong những nội dung giúp các giảng viên CNTT&TT trau dồi kiến thức chuyên môn, nâng cao ph ơng pháp nghiên cứu khoa học các giảng viên đã tham gia đề tài đã không chỉ nâng cao đ c kiến thức chuyên sâu trong lĩnh vực mà rèn luyện khả năng viết báo trong n ớc và quốc tế
6.2 Đối với đào tạo tại trường đại học CNTT&TT
Các kết quả của đề tài có thể đ c ứng dụng phục vụ mục đích giảng dạy, học tập và nghiên cứu khoa học trong lĩnh vực chuyên môn kiểm thử phần mềm của nhóm ngành CNTT, KTPM đang đ c đào tạo tại tr ờng đại học CNTT&TT Điều này đ c thể hiện bởi các sản phẩm của đề tài nh bài báo, báo cáo toàn văn của đề tài
6.3 Đối với xã hội
Kiểm thử phần mềm nói chung và sinh dữ liệu kiểm thử nói riêng đang là vấn đề đ c các nhà nghiên cứu và các công ty phần mềm quan tâm Giải quyết
Trang 10phần mềm cũng nh khả năng rút ngắn thời gian, chi phí dành cho giai đoạn kiểm thử
6.4 Khả năng áp dụng và phương thức chuyển giao kết quả nghiên cứu
Ch ơng trình thực nghiệm có thể phát triển hoàn thiện, có khả năng áp sinh
dữ dữ liệu kiểm thử trên một số kiểu dữ liệu và đặc biệt là kiểu văn bản (trong kiểm thử các ứng dụng Web hoặc truy vấn SQL)
Các sản phẩm của đề tài bao gồm các bài báo cáo tại hội thảo và tạp chí có thể đ c sử dụng nh nguồn tài liệu tham khảo trong lĩnh vực khai phá dữ liệu và các lĩnh vực liên quan cho th viện nhà tr ờng sử dụng để phục vụ công tác giảng dạy, học tập và nghiên cứu khoa học tại tr ờng đại học CNTT&TT
Trang 11INFORMATION ON RESEARCH RESULTS
1 General information
- Project title: Studying some good test-case generation techniques in software testing
- Code number: ĐH2014-TN08-03
- Coordinator: MSc To Huu Nguyen
- Implementing institution: College of Information and Communication
Technology, Thai Nguyen University
- Duration: from 1/2014 to 12/2015.(extends to 6 / 2017)
3 Creativeness and innovativeness
- To manufacturing test method applies symbolic execution of unit testing in software testing
- Construction of data generation algorithm testing on the data type string, initially given a number to produce a certain test case
4 Research results
- Systematizing the basic knowledge about software testing and unit test
- Improving some test-case generation techniques on string and mixed data
- Publishing papers on National and International scientific journals
5 Products
5.1 Scientific products:
Trang 12[1] To Huu Nguyen, Nguyen Hong Tan, Ha Thi Thanh, Do Thanh Mai (2016),
―Symbolic execution in automaticcally generation of data software testing”,
Dalat Scientific Journal, Dalat University, 6(2), pp 254-273
[2] To Huu Nguyen, Tran Thi Ngan, Do Thanh Mai, Tran Manh Tuan (2016), ―A Novel Symbolic execution model in automated generation of test case‖,
International Journal of Innovative Technology and Exploring Engineering (IJITEE) e-ISSN: 2395 -0056, 3(7)
[3] To Huu Nguyen, Nguyen Hong Tan, Ha Thi Thanh (2016), ―Mixed-Constraints modeling technique and String constraints solving method in symbolic
execution‖, Journal of Science and Technology – Thai Nguyen University,
159(14), pp 141-147
5.2 Training products
[1] Le Thi Dinh (2016), Research in Novel Symbolic execution model in
automated generation of test case, Under graduated thesis, College of
Information and Communication Technology, Thai Nguyen University
[2] Dinh Trong Tien (2016), Research in Novel Symbolic execution model in
automated generation of unit test case for Java language, Under graduated
thesis, College of Information and Communication Technology, Thai Nguyen University
[3] The Research contributing to the doctoral degree for To Huu Nguyen with the title “ Symbolic execution in automated generation of test case ", by the
author To Huu Nguyen, Thesis, Vietnam Academy of Science and Technology
5.3 Application products: A test data generation module using Automata approach
technique for unit test with string data on JavaPathFinder
6 Transfer alternatives, application institutions, impacts and benefits of research result
6.1 On fostering and training human resources in science and technology
Nowadays, information technology is one of the trends that have the priority
to develop of our Party and Nation This project intends to research symbolic
Trang 13excution techniques in automated test case generation Our team apply the method that combines symbolic excution with JavaPathFinder in automated test case generation on string data in order to improve the applicability of this technique in reality
This is also one of the contents that is useful for teachers in ICTU to discuss specialistic knowledge and to improve the ability in science research method This project also helps the members not only develop their intensive knowledge in specific fields but also improve their writing paper ability to publish on international and national journals
6.2 On training at ICTU
The results of this project can be applied into teaching, learning purposes and science researches in specialistic field of software testing in information technology and software engineering majors that are being trained in ICTU This is presented via the products of project such as papers and full text report
6.3 For society
Software testing in general and automated testing data generation in particular are the problems that grasp the concern of both scientists and software development companies Solving these problems is going to improve errors detection ability in software products, to decrease the time and the cost of testing process
6.4 Applicability and the method to transfer research results
The experimental program could be developed fully and applied into testing data generation on various kinds of data, especially in text data (in Web application testing or SQL query)
The products of this project including conference and journal papers can be used as the reference resources in data mining and other related fields in library for the teaching and researching purposes at ICTU
Trang 14MỞ ĐẦU
Kiểm thử đã đ c chứng minh rõ ràng nó là công đoạn không thể thiếu trong quá trình tạo ra một sản phẩm phần mềm hoàn thiện nó giúp cho sản phẩm hoạt động đúng nh mong đ i, tránh những sai sót đáng tiếc trong vận hành phần mềm Việc thực hiện kiểm thử đòi hỏi ng ời kiểm thử phải có kiến thức cũng nh cách nhìn khách quan với sản phẩm đồng thời cũng tiêu tốn khá nhiều thời gian chi phí
và công sức nhất là đối với các ch ơng trình lớn và nhiều nhóm xây dựng do vậy để giảm bớt thời gian và tiền bạc cũng nh sự nhàm chán khi kiểm thử thủ công, thì việc nghiên cứu các ph ơng pháp kiểm thử nhằm rút ngắn đ c thời gian thực hiện
Để đảm bảo việc kiểm thử đạt hiệu quả thì việc sinh các test case là vô cùng quan trọng trên cơ sở đó sinh tự động các test case bằng việc sử dụng Java Path Finder một trong những mở rộng của Java ứng dụng trong kỹ thuật thực thi t ng
tr ng (Symbolic execution)
Một số hướng nghiên cứu về sinh dữ liệu kiểm thử trong phần mềm
Trong lĩnh vực kiểm thử chất l ng phần mềm hiện nay trên thế giới, hiện có nhiều kỹ thuật nh ng tựu chung có thể phân theo ba nhóm chính: Phân tích mã nguồn tĩnh (static code analysis), kiểm thử dữ liệu động (dynamic data testing) và
kỹ thuật hình thức dựa trên mô hình (model-based verification) Hai nhóm đầu tập trung vào việc nâng cao chất l ng phần mềm tại mức mã nguồn, trong khi nhóm cuối cùng xử lý phần mềm tại mức trừu t ng cao hơn – mô hình
Phân tích mã nguồn tĩnh là kỹ thuật phát hiện lỗi ch ơng trình mà không yêu cầu chạy ch ơng trình đó Không giống nh kỹ thuật kiểm thử dữ liệu động đòi hỏi phải chạy ch ơng trình với dữ liệu đầu vào thật, kỹ thuật phân tích mã nguồn tĩnh chỉ xem xét mã nguồn của ch ơng trình
Kỹ thuật kiểm thử phần mềm dựa trên mô hình: khác với hai nhóm ở trên ở điểm đối t ng đ c kiểm thử là các mô hình đ c trừu t ng hóa từ hệ thống
đ c xem xét Quá trình trừu t ng hóa là việc l c bỏ những chi tiết của hệ thống trong khi chỉ giữ lại những thông tin/khía cạnh quan trọng cần đ c l u tâm Kỹ thuật trừu t ng hóa đơn giản hóa hệ thống đ c xem xét và do đó giảm không gian tìm kiếm và thời gian phân tích ch ơng trình đi nhiều lần so với lúc thực hiện công việc phân tích đó trên mã nguồn
Khi xây dựng xong phần mềm, chúng ta phải sử dụng các testcase (tr ờng
h p kiểm thử) cho việc kiểm thử Chất l ng của việc kiểm thử phụ thuộc rất lớn vào tập h p các testcase mà chúng ta sử dụng Hai tiêu chí chính của việc đánh giá
Trang 15chất l ng kiểm thử đó là hiệu quả cho chất l ng phần mềm đ c kiểm thử là độ phủ dòng chảy (control flow coverage) và độ phủ dữ liệu (data coverage) Tiêu chí thứ nhất tập trung vào việc kiểm thử tất cả các điểm điều khiển trên ch ơng trình (ví dụ: các nhánh rẽ khả đạt trong cấu trúc ch ơng trình – reachable control points) Trong khi tiêu chí thứ hai tập trung vào tập dữ liệu kiểm thử ứng với mỗi điểm điều khiển trong cấu trúc ch ơng trình
Bằng kỹ thuật phân tích ch ơng trình dựa trên mô hình sau khi trừu t ng hóa mã nguồn của ch ơng trình đ c kiểm thử, việc phân tích cấu trúc logic của
ch ơng trình và tập dữ liệu ứng với mỗi điểm điều khiển trong ch ơng trình sẽ dễ dàng hơn Qua đó, quá trình sinh ra tập các testcase sẽ nhanh chóng và chính xác, đảm bảo các tiêu chí control flow và data coverage tốt hơn nhiều so với cách tiếp cận ở mức mã nguồn truyền thống Hơn nữa, nếu quá trình này đ c thực hiện một cách tự động sẽ giảm thiểu nhiều công sức cho các chuyên gia kiểm thử ch ơng trình Với cách tiếp cận nh vậy, phần mềm có thể đ c kiểm thử một cách tự động bằng máy, đem lại kết quả chuẩn hơn, xét đ c nhiều tr ờng h p hơn, đặt biệt là các lỗi logic, tiết kiệm chi phí sản xuất
Đánh giá tập dữ liệu kiểm thử: Ngoại trừ những ch ơng trình đơn giản, sẽ là không thực tế nếu kiểm chứng phần mềm trên tập tất cả dữ liệu đầu vào có thể Ngay cả khi chỉ tính tổ h p của các dữ liệu đầu vào hoặc tổ h p của các hàm, số
l ng đầu vào và số l ng các trạng thái cũng là quá lớn Khi hệ thống có bộ nhớ lớn, các dữ liệu đầu vào, đầu ra sẽ đ c log lại để theo dõi trạng thái Trong khi không có một công cụ để tạo ra một thiết kế phần mềm chuẩn, hoàn chỉnh và chắc chắn thì việc kiểm thử là một khâu không thể thiếu để có thể đánh giá đ c chất
l ng phần mềm Vì thế ng ời ta phải tìm cách chọn đ c một tập dữ liệu nhỏ mà
có thể kiểm thử mang lại đ c độ tin cậy cao với mỗi hệ thống
Độ phủ hay mức độ đầy đủ bằng trực quan đánh giá đ c phạm vi hay mức
độ kiểm thử Nếu kiểm thử không đầy đủ đ c hết mọi khía cạnh của phần mềm đồng nghĩa với việc chúng ta bỏ sót nhiều lỗi Các tần suất của các tr ờng h p cũng không giống nhau
Khái niệm ca kiểm thử đơn giản là kiểm chứng các trạng thái đ a ra thể hiện cho hoạt động của hệ thống Chúng ta có thể tạo ra ca kiểm thử để đạt đ c trạng thái có thể bằng cách đ a vào các biến đặc biệt, trạng thái để điều khiển hệ thống
H ớng nghiên cứu của đề tài
Trang 16- Nghiên cứu lý thuyết kiểm thử, các ph ơng pháp kiểm thử, tự động sinh test case kiểm thử đơn vị
- Nghiên cứu áp dụng kỹ thuật thực thi t ng tr ng trong tự động sinh các test case
- Cài đặt thử nghiệm các ph ơng pháp thực thi t ng tr ng trên ngôn ngữ java , thử nghiệm các ph ơng pháp thực thi t ng tr ng trên công cụ java Pathfinder cho sinh tự động các test case trên một số kiểu dữ liệu
- Đánh giá kết quả sau khi thử nghiệm
Đối t ng nghiên cứu
- Nghiên cứu ph ơng pháp sinh tự động các test case, giải ràng buộc, thực thi
t ng tr ng, thực thi t ng tr ng động, cách thách thức trong thực thi t ng tr ng
- Cơ sở lý thuyết của việc nghiên cứu kỹ thuật thực thi t ng tr ng áp dụng trong tự động sinh các test case
- Ứng dụng thực thi t ng tr ng vào sinh tự động các test case
Kết quả đạt đ c
- Báo cáo tổng h p kết tìm hiểu về kỹ thuật thực thi t ng tr ng các kỹ thuật giải ràng buộc, sử dụng công cụ mô hình hóa java pathfinder và symbolic java pathfinder trong tự động sinh test case
- Công bố một số kết quả nghiên cứu đăng trên tạp chí trong và ngoài n ớc
- Cài đặt thử nghiệm kỹ thuật mô hình hóa và giải ràng buộc trên một số
ph ơng pháp automata và Bitvector trong giải ràng buộc xâu Thử nghiệm hai thuật toán trên với một số bộ dữ liệu, so sánh các kết quả đã thu đ c sau khi thử nghiệm
Trang 17Chương 1 TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ SINH
DỮ LIỆU KIỂM THỬ 1.1 Kiểm thử phần mềm
Để đảm bảo một hệ thống phần mềm hoặc các thành phần của phần mềm làm việc nh mong muốn là một thách thức lớn trong ngành công nghiệp phần mềm Các phần mềm lỗi gây ra những tổn thất về kinh tế cũng nh những hậu quả nghiêm trọng khác tùy thuộc vào lĩnh vực mà phần mềm đ c sử dụng Do đó cần phải phát hiện và khắc phục các lỗi của phần mềm tr ớc khi đem chúng vào sử dụng Có các
ph ơng pháp khác nhau để phát hiện lỗi của phần mềm bao gồm kiểm tra mô hình (model checking)[6], các kỹ thuật phân tích tĩnh (static analysis)[6] và kiểm thử (software testing)[19]
Các kỹ thuật phân tích ch ơng trình tĩnh th ờng đ a ra nhiều cảnh báo (warnings) không t ơng ứng với các lỗi thực sự Các kỹ thuật kiểm thử phát hiện ra các lỗi thực sự nh ng th ờng không phát hiện ra đ c tất cả các lỗi do chỉ phân tích một số sự thực thi trong ch ơng trình Trong kiểm tra mô hình, một mô hình của hệ thống đ c tạo ra để hỗ tr phân tích mọi sự thực thi có thể trong mô hình Kiểm tra
mô hình có thể kiểm chứng đ c rằng mô hình của hệ thống hoạt động chính xác trong tất cả tr ờng h p có thể Kiểm tra mô hình phân tích hết mọi khía cạnh thực thi của ch ơng trình và chỉ ra những sự vi phạm nh ng không chứng minh đ c
ch ơng trình sẽ đ c thực thi chính xác mà không có lỗi Hạn chế của kiểm tra mô hình đó là không gian trạng thái của mô hình th ờng quá lớn do đó việc thám hiểm tất cả các trạng thái không phải lúc nào cũng thực hiện đ c
Kiểm thử chính là kỹ thuật đ c sử dụng phổ biến nhất để phát hiện và khắc phục các lỗi của phần mềm nhằm đảm bảo chất l ng của phần mềm Chi phí giành cho việc kiểm thử chiếm khoảng 50% tổng chi phí trong phát triển phần mềm Kiểm thử là một tiến trình quan trọng trong kỹ nghệ phần mềm Kiểm thử đơn vị chính là
b ớc đầu tiên trong quy trình kiểm thử đó Có các kỹ thuật kiểm thử khác nhau
đ c sử dụng nh kiểm thử hộp trắng (white-box testing), kiểm thử hộp đen
Trang 18(black-cấu trúc (structured testing) Kiểm thử chức năng là loại kiểm thử dựa trên đặc tả chức năng của hệ thống, nó phát hiện các sai sót về chức năng mà không quan tâm tới cài đặt Kiểm thử cấu trúc là loại kiểm thử có nghiên cứu mã nguồn bằng việc phân tích thứ tự thực hiện các lệnh
1.2 Kiểm thử đơn vị
Kiểm thử đơn vị là một cộng việc quan trọng trong kỹ nghệ phần mềm Kiểm thử đơn vị th ờng đ c áp dụng để kiểm tra việc cài đặt của các lớp hoặc ph ơng thức Để thực hiện việc kiểm thử đơn vị, các lớp kiểm thử đ c tạo ra Các lớp kiểm thử này gồm các ph ơng thức kiểm thử Các ph ơng thức kiểm thử là các ph ơng thức không tham số có kiểu trả về là void chứa trong các lớp kiểm thử để kiểm tra các khía cạnh cài đặt khác nhau của ch ơng trình Mỗi ph ơng thức kiểm thử trong các lớp kiểm thử biểu thị cho một ca kiểm thử đơn vị (UT)
Có thể chia một ph ơng thức kiểm thử ra làm 3 phần: Các giá trị đầu vào, dãy các lời gọi ph ơng thức, và sự xác nhận (assertions) Kiểm thử thất bại nếu bất cứ
sự xác nhận nào bị vị phạm hoặc có một ngoại lệ (exception) xảy ra
Ví dụ ta xét một ph ơng thức kiểm thử đ c viết trong nền kiểm thử VSUnit
Hình 1.1 Phương thức kiểm thử trên VSUnit
public void TestArrayList() {
Trang 19Ph ơng thức kiểm thử TestArrayList bắt đầu bằng việc gán giá trị 1 cho biến capacity và giá trị null cho biến element nh là các giá trị đầu vào kiểm thử Sau đó
nó thực hiện một dãy các lời gọi ph ơng thức, tr ớc tiên là khởi tạo một đối t ng ArrayList với kích cỡ là capacity không chứa phần tử nào ArrayList là một mảng động với kích cỡ có thể thay đổi Tiếp theo nó chèn một đối t ng là element vào mảng Và cuối cùng là xác nhận xem phần tử đầu tiên của mảng có bằng đối t ng vừa đ c chèn vào hay không
Việc cài đặt nhiều ph ơng thức kiểm thử không đảm bảo rằng sẽ kiểm tra
đ c hết mọi khía cạnh thực thi của ch ơng trình Với các ch ơng trình có nhiều
đ ờng đi thực thi khác nhau thì việc thiếu xót các UT để kiểm tra một vài đ ờng đi thực thi trong ch ơng trình là điều th ờng xuyên xảy ra Khi ng ời lập trình thay đổi mã cài đặt của ch ơng trình đ c kiểm thử thì nếu nh các ph ơng thức kiểm thử không đ c cập nhật theo thì sẽ dẫn đến việc nhiều đ ờng đi thực thi của
ch ơng trình sẽ không đ c kiểm thử
Các nền kiểm thử hỗ tr viết các UT theo các cách khác nhau Tuy nhiên, đa phần các nền kiểm thử đều cung cấp những dịch vụ (service) nh sau:
+ Cung cấp thuộc tính để chỉ định các ph ơng thức nh là các UT
Giả sử có một lớp LuhnAlgorithm đ c cài đặt nh sau:
Trang 20Hình 1.2 phương thức LuhnAlgorithm
public static class LuhnAlgorithm {
public static bool Validate(string number){
if (number == null)
throw new ArgumentNullException("");
foreach (var c in number)
Hình 1.3 phương thức test cho LuhnAlgorithm
[TestClass]// lớp chứa các unit test
public class LuhnAlgorithmTest {
Trang 21có thể kiểm tra việc thực thi của lớp LuhnAlgorithm theo một nhánh đi cụ thể Thực thi cả 3 ph ơng thức kiểm thử ở trên ta sẽ kiểm tra đ c tất cả các tr ờng h p thực thi của lớp LuhnAlgorithm Với một ch ơng trình có nhiều đ ờng đi thì ta cần viết các UT khác nhau để kiểm tra sự thực thi của ch ơng trình theo các đ ờng đi đó Tuy nhiên, với những ch ơng trình có nhiều đ ờng đi thực thi khác nhau thì việc viết các UT nh thế đòi hỏi nhiều thời gian và công sức để tính các giá trị đầu vào thích h p và khó có thể kiểm tra hết đ c sự thực thi của ch ơng trình theo tất cả các đ ờng đi
Trang 22Chương 2 JAVA PATHFINDER VÀ THỰC THI TƯỢNG TRƯNG
2.1 Java pathfinder
2.1.1 Giới thiệu về JPF
JPF là một bộ kiểm tra mô hình phần mềm trạng thái t ờng minh cho Java
[12] Hiểu một cách cơ bản JPF là một máy ảo thực thi ch ơng trình Java không
chỉ một lần (giống nh các máy ảo thông th ờng), mà thực thi trong tất cả các
nhánh, các đ ờng đi có thể JPF sẽ kiểm tra các vi phạm thuộc tính nh khóa chết
hoặc các ngoại lệ không thể bắt đ c xuyên xuốt các đ ờng thực thi tiềm năng
Hình 2.1 mô tả mô hình hoạt động của JPF
Hình 2.1 Mô hình hoạt động của JPF
Về lý thuyết điều này là rất khả thi, tuy nhiên với việc tăng kích cỡ của ứng
dụng, phần mềm kiểm chứng mô hình phải đối mặt với nhiều thách thức JPF cũng
không là ngoại lệ Câu trả lời của chúng ta đó là tăng sự linh hoạt của JPF để thích
nghi với một ứng dụng cụ thể Chúng ta có thể coi JPF nh là một Framework và từ
đó phát triển mở rộng để có thể giải quyết đ c bài toán cụ thể mà chúng ta muốn
Trang 232.1.2 Khả năng kiểm tra của JPF
JPF có thể kiểm tra tất cả các ch ơng trình Java JPF có thể tìm ra các khóa
chết hoặc ngoại lệ Ngoài ra chúng ta có thể tự phát triển mở rộng để kiểm tra các
thuộc tính khác Để hiểu rõ hơn về JPF chúng ta có thể xét ví dụ sau:
Tạo một lớp là Rand.java nh bên d ới, sau đó chúng ta sẽ dùng JPF để kiểm
tra xem có lỗi không
Hình 2.2 Sơ đồ trạng thái trong quá trình kiểm thử
import java.util.Random;
public class Rand {
public static void main (String[] args) {
Random random = new Random(42); //
(1)
int a = random.nextInt(2); // (2)
Trang 24Hoạt động của lớp trên đó là khởi tạo 2 biến a và b một cách ngẫu nhiên
trong các khoảng t ơng ứng là [0,2] và [0,3] Sau đó có một biến c có giá trị đ c
xác định bằng công thức c = a/(b+a-2)
Nếu ta chạy ch ơng trình java này thông th ờng thì có thể thấy kết quả là: a =
1, b = 0, và c = -1 Nh vậy ch ơng trình là không có lỗi Tuy nhiên nếu ta sử dụng
JPF để kiểm tra ch ơng trình trên thì sẽ thấy nh hình 2.2
Nhìn hình vẽ trên ta có thể thấy nếu chạy ch ơng trình java bình th ờng thì
ta chỉ có thể nhân đ c 1 trong 6 kết quả trên, do vậy khả năng lớn là không phát
hiện đ c ra lỗi ( Đ ờng bôi đỏ là ví dụ) Tuy nhiên JPF sẽ tìm ra tất cả các đ ờng
đi của ch ơng trình sau đó kiểm tra chúng Ta sẽ thấy có 2 tr ờng h p lỗi gây ra
bởi phép chia cho 0
Trang 25
2.1.3 Kiến trúc mức cao của JPF
Trang 26Search sẽ cung cấp một ph ơng thức Search đơn giản bao gồm một vòng lặp chính
sẽ duyệt qua tất cả các không gian trạng thái liên quan cho đến khi nó duyệt xong tất cả hoặc tìm ra một vi phạm thuộc tính (property violation)
2.1.4 Khả năng mở rộng của JPF
Hình 2.4 Mẫu Listener
JPF có thể đ c coi nh là một Framework mà tại đó bất kỳ nhà phát triển nào đều có thể mở rộng để phục vụ cho một mục đích cụ thể JPF cung cấp một cơ chế mở rộng để cho phép thêm vào các chức năng mới mà không phải thay đổi trực tiếp cài đặt của Search hoặc VM
Yêu cầu về khả năng mở rộng có thể đạt đ c bằng cách sử dụng mẫu Listerner trên hình 2.4 Các thể hiện sẽ tự đăng ký hoặc đăng ký với đối t ng Search/VM, nhận thông báo khi một đối t ng (Subject) t ơng ứng thực thi một hoạt động nhất định, và sau đó có thể t ơng tác với đối t ng để truy vấn các thông tin bổ sung hoặc điểu khiển hành vi của đối t ng
Trang 27Việc thay đổi các khía cạnh của đổi t ng đ c ánh xạ vào các ph ơng thức Observer riêng biệt, các thể hiện của đối t ng sẽ đ c truyền đi nh tham số Đối
t ng Subject sẽ theo dõi các listener đã đăng ký theo Multicaster
Có 3 mức khác nhau để có thể lấy đ c thông tin của đối t ng Subject bằng cách cài đặt listener
Generic – listener c trú bên ngoài các gói JPF và chỉ sử dụng các thông tin đã đ c công khai (public) theo gov.nasa.jpf.Search / VM
Search-specific – listener c trú bên ngoài gói JPF nh ng sẽ đ a các tham số thông báo của đối t ng Subject vào các cài đặt cụ thể (ví dụ: gov.nasa.jpf.search.heuristic.BFSHeuristic), và sử dụng các API của nó để lấy các thông tin cài đặt cụ thể
Internal - listener c trú trong các gói cài đặt Subject riêng biêt và truy cập các thông tin riêng của gói ( private)
2.1.5 Một số mở rộng của JPF
Với kiến trúc mở rộng linh hoạt, hiện nay đã có một số mở rộng đ c phát triển cho JPF
UI - User Interface Model Checking
Đây là mở rộng cho việc kiểm tra mô hình một lớp đặc biệt của các ứng dụng Java đó là các ch ơng trình Swing và AWT Mở rộng này đ c cài đăt nh một nh viện chuẩn đ c mô hình hóa MJI (MJI Là viết tắt của: Model Java Interface) nhằm thay thế các chức năng của Swing và AWT để mà các ứng dụng giao diện sử dụng chuẩn của Java có thể đ c kiểm thử với các đầu vào khác nhau
symbc - Symbolic Test Data Generation
Mở rộng này sử dụng BytecodeFactory để ghi đè lõi (core) JPF bytecodes nhằm sinh ra các ca kiểm thử riêng biệt Nói tóm lại nó hoạt động bằng cách sử dụng các thuộc tính/ tr ờng của JPF để thu thập các điều kiện đ ờng đi PC, sau đó
đ c đ a các PC vào một hệ thống tìm lời giải theo đinh dạng của hệ thống đó để
Trang 28cv - Compositional Verification Framework
Mở rộng này là một thuật toán học máy đ c sử dụng cho các lập luận thừa nhận/ đảm bảo, nhằm mục đích phân chia hệ thống thành các thành phần con và sau đó kiểm chứng từng thành phần đó một cách riêng rẽ Mục đích chính của mở rộng này là cải tiến khả năng của JPF, nó có thể đ c sử dụng để sinh ra môi tr ờng giả định cho kiểm chứng mô hình UML, để xác định các trình tự sự kiện đúng
numeric - Numeric Property Verification
Mở rộng này đ c sử dụng để kiểm chứng các thuộc tính của số học Ban đầu mở rộng đ c sử dụng nh nh một tập các lớp chỉ thị số học để phát hiện tràn
bộ nhớ, sau đó đ c mở rộng để kiểm chứng việc truyền giá trị không chính xác, so sánh dấu phẩy động chính xác (floating point comparison)
statechart - UML State Chart Model Checking
Mục đích của mở rộng này là kiểm tra l c đồ chuyển trạng thái UML Trong mở rộng này mỗi một biểu đồ chuyển trạng thái sẽ đ c biểu diễn t ơng ứng với một lớp Java (hoặc nhiều lớp) Sau đó quá trình kiểm tra sẽ là kiểm tra các lớp java đó
2.2 Thực thi tượng trưng
2.2.1 Những khái niệm cơ bản
Một ch ơng trình P có thể xem xét nh một hàm, P : S→ R , trong đó S là tập
h p các đầu vào (input) có thể và R là tập h p các đầu ra (output) có thể S có thể
đ c biểu diễn bởi vector I=(x1,…,xk,…,xn), trong đó xk là tham số đầu vào thứ k của P với k N Một bộ giá trị i=(d1, ,dk,…,dn) biểu thị cho một đầu vào của P, i
S, trong đó dk là các giá trị cụ thể sao cho dk Dxk với Dxk là miền giá trị của tham số đầu vào xk Sự thực thi của ch ơng trình P với đầu vào i S đ c biểu thị bởi P(i)
Biểu đồ luồng điều khiển (CFG) của một ch ơng trình P là một bộ G=(N, E, s, e), trong đó G là một đồ thị có h ớng, với N là tập h p các nút (node), E = {(n,m) | n,m N} là tập h p các cạnh, s là nút vào và e là nút ra, s và e là duy nhất Mỗi nút
Trang 29đ c định nghĩa nh một khối cơ bản (basic block) là một dãy liên tục các chỉ thị
(câu lệnh) sao cho luồng điều khiển khi đi vào nút và ra khỏi nút không bị ng ng lại (halt) Điều này có nghĩa là nếu bất cứ câu lệnh nào của block đ c thực thi thì toàn
bộ block đ c thực thi Mỗi cạnh của CFG nối 2 nút với nhau và đ c gán nhãn với một biểu thức điều kiện rẽ nhánh Nếu cạnh không đ c gán nhãn có nghĩa là điều kiện luôn đúng
Một đ ờng đi (path) cụ thể là dãy các nút: p=(p1, p2,…,pn) với pn là nút cuối của đ ờng đi p và (pi,pi+1) E (1 < i < n-1) Nếu tồn tại i S sao cho sự thực thi P(i) đi theo đ ờng đi p thì p gọi là đ ờng đi khả thi, ng c lại p là đ ờng đi không khả thi Một đ ờng đi bắt đầu tại nút vào và kết thúc tại nút ra gọi là đ ờng đi đầy
đủ, nếu kết thúc tại nút không phải là nút ra thì gọi là đ ờng đi không đầy đủ (path segment)
Một ch ơng trình P cũng có thể xem gồm tập h p các câu lệnh (statements) là thành phần nhỏ nhất trong một ch ơng trình mà có thể đ c thực thi riêng rẽ Bằng việc thực thi một câu lệnh ch ơng trình có thể chuyển đổi trạng thái thực thi của nó
từ trạng thái hiện thời tới trạng thái mới Một đ ờng đi thực thi của ch ơng trình P
là một dãy các câu lệnh mà có thể đ c thực thi theo thứ tự từ điểm bắt đầu của
ch ơng trình Đoạn đ ờng đi đầu tiên (path prefix) có độ dài n của đ ờng đi thực thi p là một dãy bao gồm n câu lệnh đầu tiên của p
Do đó việc sinh dữ liệu kiểm thử cho PUT là việc sinh một tập h p tối thiểu các đầu vào i Є S sao cho có thể thực thi tất cả các đ ờng đi trong CFG của ch ơng trình đ c PUT kiểm thử
2.2.2 Thực thi tượng trưng tĩnh
Ý t ởng chính của thực thi t ng tr ng (SE) [17] là thực thi ch ơng trình với các giá trị t ng tr ng (symbolic values) thay vì các giá trị cụ thể (concrete values) của các tham số đầu vào
Với mỗi tham số đầu vào một giá trị t ng tr ng đ c đ a ra để kết h p với
nó Mỗi biến trong ch ơng trình P mà giá trị của nó phụ thuộc vào giá trị của các
Trang 30đ c tính toán để kết h p cùng với nó Mỗi giá trị t ng tr ng biểu thị cho một tập
h p các giá trị cụ thể mà một biến hoặc một tham số đầu vào có thể nhận Kết quả trả về của một ch ơng trình đ c thực thi t ơng tr ng nếu có cũng đ c biểu thị bởi biểu thức của các giá trị t ng tr ng
Giá trị t ng tr ng của biến x có thể đ c biểu thị bởi:
(a) Một ký hiệu đầu vào(input symbol)
(b) Một biểu thức kết h p giữa các giá trị t ng tr ng bởi các toán tử (c) Một biểu thức kết h p giữa giá trị t ng tr ng và giá trị cụ thể bởi
toán tử
Một ký hiệu đầu vào biểu thị cho giá trị t ng tr ng của một tham số đầu vào lúc bắt đầu thực thi ch ơng trình Các tham số đầu vào khác nhau của P đ c biểu thị bởi các ký hiệu đầu vào khác nhau Các toán tử (operator) là các phép toán nh cộng (+), trừ (), nhân (*), chia (/)
Nếu giá trị của một biến x không phụ thuộc vào các giá trị đầu vào thì không
có giá trị t ng tr ng nào đ c tính toán để kết h p với nó Giá trị t ng tr ng của các biến và các tham số đầu vào đ c cập nhật nh các giá trị cụ thể của nó trong quá trình thực thi Gán một giá trị cụ thể từ một biến tới biến khác dẫn đến giá trị
t ng tr ng cũng đ c sao chép nếu biến đ c gán tới một biến khác có một giá trị
t ng tr ng Giả sử với một câu lệnh gán x=e, nếu e là một tham số đầu vào, thì giá trị t ng tr ng đ c gán cho x sẽ có dạng (a) Nếu e là một biểu thức tính toán gồm các toán hạng Các toán hạng đó có thể là biến, tham số đầu vào hoặc hằng thì giá trị t ng tr ng của biến x sẽ là một biểu thức t ng tr ng dạng (b) nếu mỗi toán hạng trong biểu thức có một giá trị t ng tr ng kết h p với nó, hoặc là một biểu thức t ng tr ng dạng (c) nếu có toán hạng là hằng số hoặc không có giá trị t ng
tr ng kết h p với nó Giá trị cụ thể của một hằng hoặc một biến cũng đ c sử dụng trong biểu thức t ng tr ng nếu nh hằng hoặc biến đó không có giá trị t ng tr ng kết h p với nó
Trạng thái của một ch ơng trình đ c thực thi t ng tr ng bao gồm các giá trị của các biến trong ch ơng trình, điều kiện đ ờng đi (PC) và biến đếm ch ơng trình
Trang 31(program counter) Biến đếm ch ơng trình xác định chỉ thị (câu lệnh) tiếp theo sẽ
đ c thực thi Mỗi PC là một biểu thức kết h p bởi các ràng buộc mà các giá trị đầu vào ch ơng trình cần thỏa mãn để ch ơng trình đ c thực thi theo đ ờng đi t ơng ứng với PC đó Mỗi ràng buộc là một biểu thức t ng tr ng dạng x o y trong đó x là giá trị t ng tr ng, y là giá trị t ng tr ng hoặc giá trị cụ thể và o {≤, ≠, =, <, >,
≥} Các ràng buộc đó chính là biểu thức của điều kiện rẽ nhánh và biểu thức phủ định của điều kiện rẽ nhánh t ơng ứng với nhánh true và nhánh false Tại mỗi câu lệnh rẽ nhánh, các ràng buộc đ c tạo ra Các ràng buộc này đ c biểu thị bởi biểu thức của các giá trị t ng tr ng hay biểu thức của giá trị t ng tr ng và giá trị cụ thể phụ thuộc vào biến xuất hiện trong biểu thức điều kiện của câu lệnh rẽ nhánh có giá trị t ng tr ng đ c tính toán để kết h p với nó hay không
Trong quá trình thực thi t ng tr ng, việc ch ơng trình đ c thực thi theo một
đ ờng đi cụ thể nào đó không phụ thuộc vào các giá trị cụ thể của các biến và các tham số đầu vào Tại các điểm rẽ nhánh, cả hai nhánh ra sẽ đ c xem xét để điều
h ớng sự thực thi hiện thời đi theo SE chủ yếu liên quan tới việc thực thi hai loại câu lệnh đó là câu lệnh gán (assignment statments) và câu lệnh rẽ nhánh Tại các câu lệnh gán thì giá trị t ng tr ng của các biến ch ơng trình cũng nh các tham số đầu vào có liên quan tới câu lệnh gán đó đ c cập nhật Tại các câu lệnh rẽ nhánh,
ch ơng trình sẽ đ c điều h ớng để thực thi theo cả hai nhánh Và hai ràng buộc
đ ờng đi t ơng ứng với hai nhánh sẽ đ c tạo ra Một ràng buộc là biểu thức điều kiện tại câu lệnh rẽ nhánh Còn ràng buộc kia là phủ định của biểu thức điều kiện rẽ nhánh Các ràng buộc này sẽ đ c cập nhật vào điều kiện đ ờng đi t ơng ứng với các nhánh đó Đồng thời các PC này sẽ đ c đánh giá để xác định đ ờng đi t ơng ứng với PC đó có khả thi Nếu PC đ c đánh giá trở thành false thì SE sẽ quay lui
và chỉ thực thi theo nhánh khả thi Các PC đ c tạo ra bằng cách thu gom các ràng buộc trên các đ ờng đi t ơng ứng và giải quyết các ràng buộc này sẽ sinh ra các giá trị cụ thể cho các tham số đầu vào
Để mô tả sự thực thi t ng tr ng một ch ơng trình Một cây thực thi t ng
tr ng (SET) đ c đ a ra để biểu thị cho các đ ờng đi thực thi trong quá trình thực
Trang 32trình đ c thực thi t ng tr ng và các cạnh biểu thị cho sự chuyển đổi trạng thái từ trạng thái này sang trạng thái khác
Hình 2.5 Cây thực thi tượng trưng
public void Swap(int x, int y){
Trang 33phủ định của điều kiện rẽ nhánh đ c thêm vào PC theo các nhánh t ơng ứng Trong thực thi t ng tr ng, nếu điều kiện rẽ nhánh đ c thêm vào PC thì PC đó
t ơng ứng với PC của nhánh mà điều kiện rẽ nhánh nhận giá trị true Sau khi thực thi câu lệnh 1, hàm Swap tiếp tục đ c thực thi theo nhánh mà điều kiện rẽ nhánh ở câu lệnh 1 nhận giá trị true Khi thực thi các câu lệnh gán 2, 3, 4 thì giá trị của các biến đ c cập nhật với giá trị mới Khi tới câu lệnh rẽ nhánh 5, thêm 2 nhánh đi mới đ c xem xét để thực thi với các giá trị t ng tr ng PC tiếp tục đ c cập nhật theo các nhánh t ơng ứng
Tại đây, PC đ c cập nhật với điều kiện rẽ nhánh ở 5 trở thành false do không tồn tại bộ giá trị nào thỏa mãn PC Vì vậy hàm Swap chỉ thực thi theo nhánh mà PC
đ c cập nhật với biểu thức phủ định của điều kiện rẽ nhánh tại 5 Và câu lệnh 6 sẽ không bao giờ đ c thực thi
Tại mỗi điểm rẽ nhánh, PC đ c cập nhật và một bộ xử lý ràng buộc đ c sử dụng để xác định nhánh t ơng ứng với PC đó có khả thi hay không để điều h ớng việc thực thi hiện thời đi theo nhánh đó Nếu PC đ c đánh giá tới false thì SE sẽ quay lui và chỉ thực thi ch ơng trình theo nhánh mà PC đ c đánh giá tới true
2.2.3 Thực thi tượng trưng động
Thực thi t ng tr ng động [10, 26] là kỹ thuật thực thi t ng tr ng dựa trên phân tích ch ơng trình động Thực thi t ng tr ng động chính là sự kết h p giữa thực thi cụ thể và thực thi t ng tr ng Trong thực thi t ng tr ng động, ch ơng trình đ c thực thi nhiều lần với những giá trị khác nhau của tham số đầu vào Bắt đầu bằng việc chọn những giá trị tùy ý cho các tham số đầu vào và thực thi ch ơng trình với những giá trị cụ thể đó Với những giá trị cụ thể này thì ch ơng trình sẽ đ c thực thi theo một đ ờng đi xác định Thực thi ch ơng trình với các giá trị cụ thể của tham số đầu vào và thu gom các ràng buộc trong quá trình thực thi theo đ ờng đi mà sự thực thi cụ thể này đi theo, đồng thời suy ra các ràng buộc mới
từ những ràng buộc đã thu gom đ c
Tại các câu lệnh rẽ nhánh, biểu thức điều kiện rẽ nhánh sẽ đ c đánh giá phụ
Trang 34nhánh nhận giá trị là True thì biểu thức của điều kiện rẽ nhánh sẽ đ c thu gom vào ràng buộc của PC và đ c ghi nhớ, đồng thời phủ định của điều kiện rẽ nhánh sẽ
đ c sinh ra và đ c thêm vào một PC t ơng ứng với nhánh còn lại mà sự thực thi
cụ thể đó không đi theo Một bộ xử lý ràng buộc (Constraint Solver) sẽ đ c sử dụng để giải quyết các ràng buộc mới sinh ra này để sinh ra các giá trị cụ thể của tham số đầu vào Ng c lại, nếu là False thì biểu thức phủ định của điều kiện rẽ nhánh sẽ đ c thu gom vào ràng buộc của PC t ơng ứng với nhánh đi mà sự thực thi hiện thời đang đi theo và đ c ghi nhớ Đồng thời điều kiện rẽ nhánh sẽ đ c sinh ra và thêm vào PC t ơng ứng với nhánh đi còn lại mà sự thực thi hiện thời không đi theo Các giá trị mới đ c sinh ra của các tham số đầu vào sẽ tiếp tục đ c thực thi và quá trình này sẽ đ c lặp lại cho tới khi ch ơng trình đ c thực thi theo tất cả các đ ờng đi
Do các ch ơng trình đ c thực thi với những giá trị cụ thể nên có thể thấy rằng tất cả các đ ờng đi phân tích đ c trong quá trình thực thi t ng tr ng động đều là các đ ờng đi khả thi
Hình 2.6 Thuật toán thực thi tượng trưng động
Thuật toán: DSE
S : Tập h p tất cả các câu lệnh của ch ơng trình P
S : Tập con của S (s S)
I : Tập h p các đầu vào của P
P(i): Thực thi ch ơng trình với đầu vào i I, sao cho s đ c thực thi
J : Tập h p các đầu vào của P đ c thực thi (J={i | P(i)})
C(i): Ràng buộc thu gom đ c từ việc thực thi P(i), hay còn gọi là điều kiện
đ ờng đi
C‘(i): Điều kiện đ ờng đi suy ra từ C(i)
B ớc 0: J:= {} (tập rỗng)
Trang 35B ớc 1: Chọn đầu vào i không thuộc J (dừng lại nếu không có i nào đ c tìm ra)
đó thực thi hàm DSE với giá trị null này Khi tới câu lệnh rẽ nhánh 2, điều kiện a==null đ c thỏa mãn do đó ràng buộc C(i):(a==null) đ c ghi nhớ Ràng buộc C‘(i) đ c suy ra bằng cách lấy phủ định của điều kiện rẽ nhánh, C‘(i): (a!=null) Solve (C‘(i)) suy ra đ c a={}
Tiếp tục thực thi ch ơng trình với giá trị a={} Với a={} khi tới câu lệnh rẽ nhánh 3, biểu thức a.length > 0 nhận giá trị false, ràng buộc C(i): (a!=null) &&
!(a.length >0) đ c ghi nhớ Ràng buộc C‘(i):(a!=null && a.length > 0) đ c sinh
ra, solve (C‘(i)) ta đ c giá trị mới của tham số đầu vào là {0}
Trang 36C‘(i):( a!=null && a.length>0 && a[0]!=123456789) đ c ghi nhớ Điều kiện C‘(i): (a!=null && a.length>0 && a[0]==123456789) đ c sinh ra, solve (C‘(i)) ta
đ c giá trị a={12345678} Đến đây thì không còn đ ờng đi nào của hàm DSE mà
ch a đ c thực thi và qua trình thực thi sẽ đ c dừng lại
Bảng 2.1 Ví dụ về thực thi tượng trưng động
Ràng buộc C‘(i) Input i Ràng buộc đ c ghi nhớ C(i)
&& a[0]!=123456789 {123456789}
a!=null && a.length>0
&& a[0]!=123456789 Một số hệ thống sinh kiểm thử tự động cài đặt DSE bằng cách khởi tạo một cây thực thi t ng tr ng để biểu thị các đ ờng đi thực thi khác nhau Nếu nh có thể xây dựng đ c một cây thực thi t ng tr ng đầy đủ thì có thể sinh ra các giá trị đầu vào sao cho có thể đạt đ c sự bao phủ luồng điều khiển (CFG coverage) [27]
ở mức cao
Với những hệ thống này, mã nguồn ch ơng trình cần đ c sửa đổi để cho phép thực thi t ng tr ng đ c thực hiện dọc theo việc thực thi cụ thể Ch ơng trình đ c thực thi với những giá trị ngẫu nhiên với một chiều sâu (depth) định
tr ớc của SET Chiều sâu đ c sử dụng để giúp cho việc thực thi một ch ơng trình
đ c dừng lại trong tr ờng h p ch ơng trình có vòng lặp vô tận hoặc các hàm đệ quy Khi ch ơng trình bắt đầu đ c thực thi thì một cây thực thi t ơng tr ng t ơng ứng cũng đ c khởi tạo Trong quá trình thực thi, các giá trị t ng tr ng của các biến sẽ đ ơc tính toán và các ràng buộc đ ờng đi sẽ đ c sinh ra từ các giá trị
t ng tr ng đó Với mỗi ràng buộc đ c sinh ra thì SET sẽ đ c thêm vào một đỉnh (node) t ơng ứng với ràng buộc đó Việc xây dựng SET tiến hành trong suốt quá trình thực thi Có thể xem mỗi lần thực thi là mỗi lần duyệt một đ ờng đi của SET