Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 69 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
69
Dung lượng
1,43 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Trần Bình Dương SINH CA KIỂM THỬ THAM SỐ HĨA CHO 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 - 2009 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CƠNG NGHỆ Trần Bình Dương SINH CA KIỂM THỬ THAM SỐ HĨA CHO 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: TS Trương Anh Hoàng LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com LỜI CẢM ƠN Lời em xin gửi lời cảm ơn chân thành tới TS Trương Anh Hồng, người thầy đáng kính tận tình hướng dẫn em suốt thời gian thực khóa luận Em muốn bày tỏ lịng biết ơn đến thầy giáo trường Đại học Công Nghệ - Đại học Quốc Gia Hà nội, đặc biệt thầy cô khoa công nghệ thơng tin tận tình dạy dỗ tạo điều kiện học tập thuận lợi cho em suốt bốn năm học qua Cuối cùng, em xin gửi lời cảm ơn tới gia đình đình em Nếu khơng có tình yêu, ủng hộ động viên từ gia đình em khơng thể hồn thành khố luận có kết ngày hơm Hà nội, 05/2009 Sinh viên Trần Bình Dương i LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com TÓM TẮT NỘI DUNG Kiểm thử đơn vị tham số hóa cịn khái niệm mẻ nhiều nhà phát triển phần mềm Kiểm thử đơn vị tham số hóa dần đóng vài trị quan trọng phát triển phần mềm Khóa luận đời để nghiên cứu phương pháp kiểm thử ứng dụng cho mục đích kiểm thử chương trình Java Nội dung khóa luận tập trung vào việc áp dụng khả kiểm chứng Java bytecode mã nguồn mở hiệu phổ biến Java PathFinder để xây dựng hệ thống hỗ trợ kiểm thử đơn vị tham số hóa cho mục đích kiểm thử chương trình Java Kết khóa luận xây dựng hệ thống để thực thi ca kiểm thử đơn vị tham số hóa viết cho chương trình Java đơn giản Bên cạnh đó, khóa luận trình bày cách sâu sắc kiểm thử đơn vị tham số hóa kỹ thuật phức tạp đằng sau phương pháp kiểm thử số nghiên cứu liên quan Qua khóa luận kết thúc việc phác thảo số hướng phát triển tiếp để hệ thống xử lý kiểu liệu phức tạp ii LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com MỤC LỤC LỜI CẢM ƠN .i TÓM TẮT NỘI DUNG ii MỤC LỤC iii CÁC KÝ HIỆU VIẾT TẮT .v DANH MỤC HÌNH VẼ vi Chương 1: Kiểm thử đơn vị tham số hóa 1.1 Kiểm thử phần mềm .3 1.2 Kiểm thử đơn vị 1.3 Kiểm thử đơn vị tham số hóa 1.3.1 Khái niệm 1.3.2 Mối quan hệ UT PUT 1.3.3 Kiểm thử đơn vị tham số hóa với Pex 1.3.4 Các mẫu kiểm thử tham số hóa 1.3.5 Lựa chọn đầu vào kiểm thử với Pex .10 Chương 2: Sinh liệu kiểm thử tự động cho PUT 12 2.1 Thực thi tượng trưng 13 2.1.1 Những khái niệm .13 2.1.2 Thực thi tượng trưng tĩnh 14 2.1.3 Thực thi tượng trưng động 17 2.2 Xây dựng ràng buộc .23 2.2.1 Lưu trữ giá trị tượng trưng 24 2.2.2 SE với kiểu liệu nguyên thủy 25 2.2.3 SE với đối tượng 28 2.2.4 SE với lời gọi phương thức 30 2.3 Sinh liệu kiểm thử cho PUT .31 Chương 3: Sinh ca kiểm thử tham số hóa với JPF 36 3.1 Kiến trúc JPF 36 3.2 Symbolic JPF 40 3.2.1 Bộ tạo thị 40 3.2.2 Các thuộc tính 41 3.2.3 Xử lý điều kiện rẽ nhánh 42 3.2.4 Ví dụ .43 3.2.5 Kết hợp thực thi cụ thể thực thi tượng trưng 47 iii LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.3 Sinh PUT với Symbolic JPF 48 3.4 Mở rộng Symbolic JPF 53 3.4.1 Các phương pháp cũ 53 3.4.2 Hướng mở rộng .54 KẾT LUẬN .58 TÀI LIỆU THAM KHẢO iv LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com CÁC KÝ HIỆU VIẾT TẮT CFG DSE JPF PC PUT SE SET TIS UT Control Flow Graph Dynamic Symbolic Execution Java PathFinder Path Condition Parameterized Unit Test Symbolic Execution Symbolic Execution Tree Test Input Selector Unit Test v LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com DANH MỤC HÌNH VẼ Hình 1: Mối quan hệ UT PUT .8 Hình : Cây thực thi tượng trưng 16 Hình 3: Cây thực thi tượng trưng quản lý riêng 22 Hình : Hệ thống kiểm thử tổng quát 24 Hình 5: Gán giá trị tượng trưng cho tham số đầu vào 26 Hình 6: Thực thi tượng trưng với câu lệnh gán .27 Hình 7: Thực thi tượng trưng với câu lệnh rẽ nhánh .28 Hình 8: Khởi tạo đối tượng làm đầu vào cho chương trình 29 Hình Sinh ràng buộc liên quan tới đối tượng 30 Hình 10: Thuật tốn sinh liễu kiểm thử 32 Hình 11: Các thực thi cục tương ứng với hàm abs TestAbs 34 Hình 12: Kiến trúc JPF 37 Hình 13: Bộ sinh lựa chọn JPF .39 Hình 14 Bộ tạo thị JPF .40 Hình 15 Trạng thái chương trình thực thi Symbolic JPF .41 Hình 16: Bùng nổ việc thực thi tượng trưng Symbolic JPF 48 Hình 17: Kiến trúc hệ thống cài đặt 49 Hình 18 Một ví dụ với hệ thống cài đặt 52 vi LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com MỞ ĐẦU Trong kinh tế nay, ngành cơng nghiệp phần mềm giữ vai trị quan trọng Với số nước có cơng nghệ thơng tin phát triển ngành cơng nghiệp phần mềm có khả chi phối kinh tế Tuy nhiên để đảm bảo chất lượng cho phần mềm thách thức không nhỏ ngành công nghiệp phần mềm Việc phát khắc phục lỗi cho phần mềm công việc địi hỏi nhiều nỗ lực chi phí phát triển phần mềm Với lĩnh vực ứng dụng ngày mở rộng phần mềm chất lượng phần mềm quan tâm hàng đầu Trong kỹ nghệ phần mềm kiểm thử phương pháp dùng để phát lỗi phần mềm Trong kiểm thử đơn vị giai đoạn quy trình kiểm thử Kiểm thử đơn vị công việc bắt buộc phát triển phần mềm Theo nghiên cứu Micorosoft có tới 79% nhà phát triển phần mềm phải viết ca kiểm thử đơn vị để thực việc kiểm thử phần mềm mức đơn vị Rõ ràng kiểm thử đơn vị công việc nặng nhọc làm nhiều thời gian chi phí phát triển phần mềm Do có phương pháp kiểm thử đơn vị đời giúp cải thiện phương pháp kiểm thử đơn vị truyền thống kiểm thử đơn vị tham số hóa Với kiểm thử đơn vị tham số hóa cơng sức giành cho việc kiểm thử phần mềm mức đơn vị giảm đáng kể Kiểm thử đơn vị tham số hóa giúp việc phát lỗi phần mềm đạt hiệu cao nâng cao chất lượng phần mềm Kiểm thử đơn vị tham số hóa cịn phương pháp kiểm thử đơn vị áp dụng mơi trường NET Vì việc nghiên cứu kiểm thử đơn vị tham số hóa ứng dụng nhu cầu cấp bách Và khóa luận đời mục đích Nội dụng khóa luận gồm chương: Chương 1: Trình bày tổng quan kiểm thử làm rõ chất kiểm thử đơn vị tham số hóa thơng qua cơng cụ Pex Microsoft Chương 2: Nghiên cứu phương pháp sinh liệu làm đầu vào kiểm thử cho ca kiểm thử đơn vị tham số hóa Trong chương ta trình bày hệ thống kiểm thử tổng quát dùng để thực thi ca kiểm thử đơn vị tham số hóa viết cho ngôn ngữ Java LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương 3: Trong chương ta nghiên cứu (framework) kiểm chứng Java bytecode mã nguồn mở phổ biến Java PathFinder áp dụng khả để xây dựng thực thi ca kiểm thử tham số hóa viết cho chương trình Java đơn giản Đồng thời ta đề xuất giải pháp để mở rộng Java PathFinder cho mục đích hồn thiện kiểm thử mà ta xây dựng LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Việc thông dịch thị IF_ICMPEQ theo ngữ nghĩa thực thi tượng trưng bắt đầu việc lấy giá trị tượng trưng lưu thuộc tính tương ứng với phần tử stack (dòng 2, 3) Nếu giá trị tượng trưng lấy null JPF chuyển hướng thực thị thị IF_ICMPEQ theo ngữ nghĩa thực thi cụ thể (dòng 5) Nếu hai giá trị khơng null, sinh lựa chọn (CG) tạo (dòng 7) CG sinh lựa chọn cho phép nhánh xem xét để điều hướng thực thi theo (dòng 8) 3.2.5 Kết hợp thực thi cụ thể thực thi tượng trưng Symbolic JPF hỗ trợ tốt cho việc kiểm thử phần mềm mức đơn vị Symbolic JPF kết hợp thực thi cụ thể với thực thi tượng trưng cho phép thực thi phương thức cách kết hợp giá trị đầu vào cụ thể giá trị đầu vào tượng trưng Để thực thi tượng trưng phương thức, ta cần cấu hình để JPF sử dụng lớp thông dịch bytecode theo ngữ nghĩa thực thi tương trưng SymbolicInstructionFactory, định tên phương thức cần thực thi tượng trưng đầu vào phương thức cụ thể tượng trưng Các đầu vào bao gồm tham số đầu vào phương thức trường toàn cục (global) mà phương thức truy cập Một chương trình bắt đầu thực thi theo ngữ nghĩa thực thi cụ thể Tất lớp thị bytecode tượng trưng (các lớp Instruction) chuyển quyền (delegate) thực thi tới lớp thị bytecode cha mà cài đặt việc thông dịch bytecode theo ngữ nghĩa thực thi cụ thể khơng có thơng tin tượng trưng lưu trữ thuộc tính kết hợp với liệu Một listener quản lý việc thực thi cụ thể bên máy ảo JPF bùng nổ (trigger) việc thực thi tượng trưng lần phương thức với tên định gọi Từ thời điểm đó, thực thi tượng trưng tiếp tục Các thông tin tượng trưng lưu trữ thuộc tính xử lý Khi phương thức thực thi xong, JPF in thông tin thu q trình thực thi phương thức Một listener đặc biệt cài đặt để bùng nổ thực thi tượng trưng lúc trình thực thi cụ thể (Hình 16) 47 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Hình 16: Bùng nổ việc thực thi tượng trưng Symbolic JPF Listener chuyển thực thi cụ thể xử lý ràng buộc PC thời, tính tốn giá trị cụ thể tương ứng với biến tiếp tục thực thi chế độ thực thi cụ thể Từ việc thực thi chương trình kết hợp đầu vào cụ thể đầu vào tượng trưng với Symbolic JPF Ta sử dụng việc thực thi cụ thể chương trình để thiết lập ngữ cảnh thực thi cụ thể khác phân tích tượng trưng mức đơn vị Với phương thức có nhiều đầu vào ta định số đầu vào cụ thể để giảm phức tạp điều kiện đường việc thực thi tượng trưng phương thức Tất nhiên, định số đầu vào cụ thể việc thực thi tương trưng khơng theo tất nhánh mà theo nhánh mà phụ thuộc vào đầu vào cụ thể 3.3 Sinh PUT với Symbolic JPF Symbolic JPF hỗ trợ việc thực thi tượng trưng phương thức nhận tham số đầu vào có kiểu liệu dạng số học (int, long, float, double) Từ khả Symbolic JPF ta xây dựng kiểm thử cho phép viết phương thức kiểm thử tham số hóa (PUT) để kiểm thử lớp Java đơn giản gồm phương thức nhận tham số đầu vào có kiểu mà Symbolic JPF hỗ trợ Trong Java, có kiểm thử JUnit hỗ trợ viết thực thi ca kiểm thử đơn vị Ta viết PUT dựa kiểm thử xây dựng hệ thống để thực thi PUT để sinh tự động ca kiểm thử JUnit Với JUnit ta viết lớp kiểm thử mà chứa ca kiểm thử đơn vị JUnit Ta viết lớp kiểm thử mà chứa ca kiểm thử tham số hóa Nền kiểm thử JUnit ta sử dụng JUnit 3.8 Do ta cần viết PUT để sinh ca kiểm thử đơn vị JUnit tương ứng với phiên Cấu trúc lớp kiểm thử phiên bên dưới: 48 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com import junit.framework.TestCase; //other libraries public class ClassName extends TestCase { public ClassName(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } //JUnit Test Methods } Tên phương thức kiểm thử JUnit bắt đầu test Nền kiểm thử JUnit quy ước điều để xác định phương thức phương thức kiểm thử Quy ước giống ta sử dụng thuộc tính [TestMethod] để định phương thức UT kiểm thử VSUnit[29] NET Ta viết lớp kiểm thử tham số hóa có cấu trúc Chỉ khác ca kiểm thử đơn vị JUnit thay ca kiểm thử tham số hóa Bằng cách viết ca kiểm thử tham số hóa dựa kiểm thử JUnit ta giảm công sức để xây dựng lại thư viện xác nhận (assertion) giúp việc sinh lại ca kiểm thử đơn vị JUnit dễ dàng Ta sử dụng công cụ Eclipe Classic 3.4.2 để làm môi trường phát triển ứng dụng viết ca kiểm thử tham số hóa Hình 17: Kiến trúc hệ thống cài đặt 49 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Với Symbolic JPF, phương thức muốn thực thi tượng trưng cần định để Symbolic JPF thực thi chúng Việc phương thức có thực thi tượng trưng hay khơng phụ thuộc vào việc ta cấu hình để thực thi với JPF Đoạn mã bên sử dụng cho việc cấu hình: // điều khiển JPF để sử dụng tập hợp bytecode tượng trưng +vm.insn_factory.class=gov.nasa.jpf.symbc.SymbolicInstructionFactory // cấu hình JFF để sử dụng Listener cho việc báo cáo kết +jpf.listener=gov.nasa.jpf.symbc.SymbolicListener // cấu hình để sử dụng thư viện tốn học +vm.peer_packages=gov.nasa.jpf.symbc:gov.nasa.jpf.jvm // cấu hình để sử dụng xử lý ràng buộc mong muốn +symbolic.dp=iasolver // định phương thức cần thực thi tượng trưng +symbolic.method=UnitUnderTest(sym#sym#con) // định lớp chứa phương thức cần thực thi tượng trưng Main JPF máy ảo để thực thi tượng trưng phương thức lớp định để thực thi phải chứa phương thức main Và phương thức main phương thức cần thực thi tượng trưng gọi bình thường với giá trị cụ thể Với phương thức cần thực thi tượng trưng ta cần định tên tham số thực thi tượng trưng thực thi cụ thể Giả sử phương thức UnitUnderTest đoạn mã cấu hình tham số đầu vào định cho thực thi tượng trưng, tham số thứ thực thi cụ thể Nếu ta không định xử lý ràng buộc sử dụng với cấu hình +symbolic.method xử lý ràng buộc choco[27] sử dụng mặc định Ta muốn thực thi tượng trưng phương thức kiểm thử PUT Lớp kiểm thử chứa phương thức kiểm thử PUT không chứa phương thức main JPF khơng thể thực thi thơng thường Do thành phần PUTDriver cài đặt để xử lý điều Hệ thống ta cài đặt để thực việc cấu hình động JPF quản lý việc thực thi JPF qua lớp PUTListener cho việc báo cáo sinh ca kiểm thử JUnit Hệ thống cài đặt ta có ưu điểm so với Pex ta thực thi tất PUT lần chạy Để thực điều ta cần đồng hóa để thực thi ca kiểm thử Tất ca kiểm thử JUnit sinh từ việc thực thi lớp kiểm thử chứa ca kiểm thử tham số hóa đưa vào lớp kiểm thử JUnit 50 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Tuy nhiên đề cập trên, hệ thống ta áp dụng khả Symbolic JPF để thực thi PUT PUT nhận tham số đầu vào có kiểu số int, float, long, double thực thi Hệ thống ta mở rộng dễ dàng để thực thi ca kiểm thử tham số hóa nhận tham số đầu vào có kiểu tham chiếu khác Symbolic JPF mở rộng để thực thi tượng trưng phương thức Để thực thi ca kiểm thử tham số hóa viết cho mơi trường Eclipse Ta chạy run configuration tiến hành cấu sau: Main Class : put.framework.PUTRunner Program arguments :[] Giả sử có lớp UnderTest chứa phương thức Add đơn giản sau: public int Add(int x, int y){ String s = “”; if(x == 2*y) { s = s + ”K50”; } if(x > y){ return x - y; } return x + y; } Ta có PUT testAdd để kiểm tra việc thực thi phương thức Add import junit.framework.TestCase; import put.framework.Assume; public class PUT extends TestCase { void testAdd(int x, int y){ Assume.isTrue(x>0 && x