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

NGHIÊN CỨU PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH - LUẬN VĂN THẠC SĨ ĐẠI HỌC QUỐC GIA

54 69 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 54
Dung lượng 0,99 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đề tại luận văn Thạc Sĩ: "NGHIÊN CỨU PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH" thực hiện tại Đại Học Công Nghệ Đại Học Quốc Gia Hà Nội. Trong những năm gần đây, việc phát triển phần mềm ngày càng được chuyên nghiệp hóa. Các phần mềm được phát triển ngày càng có quy mô lớn. Yêu cầu đảm bảo chất lượng phần mềm là một trong những mục tiêu quan trong nhất, đặc biệt trong một số lĩnh vực như y khoa, ngân hàng, hàng không… Việc kiểm thử, kiểm chứng phần mềm một cách thủ công chỉ đảm bảo được phần nào chất lượng của phần mềm. Vì vậy rất nhiều các tổ chức, công ty đã nghiên cứu và phát triển các lý thuyết cũng như công cụ để kiểm chứng, kiểm thử phần mềm một cách tự động.Xuất phát từ nhu cầu thực tế trên, tác giả đã nghiên cứu một số lý thuyết, công cụtrong việc kiểm chứng và kiểm thử phần mềm. Một lý thuyết nền tảng rất quan trọng đó là lý thuyết về tính thỏa được, viết tắt là SMT (Satisfiability Modulo Theories). Lý thuyết về tính thỏa được đã được ứng dụng để giải quyết nhiều bài toán trong công nghệ phần mềm như:Kiểm chứng chương trìnhKhám phá chương trìnhMô hình hóa phần mềmSinh các ca kiểm thửHiện nay Microsoft Z3 là một công cụ tìm lời giải cho SMT đang được áp dụngtrong nhiều dự án của Microsoft như: Pex, Spec, SLAMSDV, Yogi. Z3 được đánh già là công cụ tìm lời giải mạnh nhất hiện nay. Tuy nhiên Z3 chỉ được áp dụng cho các ngôn ngữ của Microsoft. Vì vậy tác giả đặt ra vấn đề: Liệu có thể sử dụng Z3 để kiểm chứng cho các chương trình viết bằng ngôn ngữ khác như Java?Trong quá trình nghiên cứu về kiểm chứng chương trình tác giả cũng có tìm hiểuvề JavaPathFinder (JPF). JPF là một dự án mã nguồn mở được phát triển trên ngôn ngữ Java. Hiện nay có một mở rộng của JPF trong việc sinh tự động dữ liệu đầu vào để kiểm thử chương trình. Tuy nhiên còn rất nhiều hạn chế, vì vậy tác giả đã nghĩ đến việc làm sao để tích hợp được Z3 với JPF để có thể sinh tự động dữ liệu kiểm thử chương trình. Nếu việc tích hợp thành công thì sẽ dẫn tới việc giải quyết được lớp bài toán rộng hơn. Điều này là rất có ý nghĩa đối với thực tế.

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ  

PHAN VĂN TIẾN PHAN VĂN TIẾN  

NGHIÊN CỨU PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ

PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH HÌNH  

LUẬN VĂN THẠC SĨ  

Hà Nội

Hà Nội - 2011 - 2011

Trang 2

LỜI CẢM ƠN  

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ  

PHAN VĂN TIẾN PHAN VĂN TIẾN  

NGHIÊN CỨU PHƯƠNG PHÁP SINH DỮ LIỆU

NGHIÊN CỨU PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ

PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH HÌNH  

 NGÀ  NGÀ NH: CÔNG NGHỆ T  NH: CÔNG NGHỆ THÔNG TIN HÔNG TIN   CHUYÊN

CHUYÊN NGÀNH: CÔNG N  NGÀNH: CÔNG NGHỆ PHẦN MỀM GHỆ PHẦN MỀM  

MÃ SỐ:

MÃ SỐ: 60 48 10  60 48 10

LUẬN VĂN THẠC SĨ LUẬN VĂN THẠC SĨ  

 N  NGƯỜI HƯỚNG DẪN KHOA HỌC: TS GƯỜI HƯỚNG DẪN KHOA HỌC: TS.   NGUYỄN TRƯỜNG  NGUYỄN TRƯỜNG THẮNG THẮNG  

Hà Nội

Hà Nội - 2011 - 2011

Trang 3

LỜI CẢM ƠN  

Trước tiên tôi xin gửi lời cảm ơnTrước tiên tôi xin gửi lời cảm ơn chân thànchân thành và sâu sắc nhất tới TS Nguyễnh và sâu sắc nhất tới TS NguyễnTrường Thắng

Trường Thắng - - Viện công nghệ thông tinViện công nghệ thông tin - - Viện khoa học công nghệ Việt Nam Thầy đãtận tình chỉ bảo, giúp đỡ và truyền đạt cho tôi rất nhiều kiến thức và kinh nghiệm quý báutrong thời gian qua

trong thời gian qua.  

Tôi xin cảm ơn cácTôi xin cảm ơn các  thầy giáo, cô giáo trong khoa Công Nghệ Thông Tin, các thầythầy giáo, cô giáo trong khoa Công Nghệ Thông Tin, các thầycác cô luôn giành cho t

các cô luôn giành cho tôi những kiến thức, tình cảm và những ôi những kiến thức, tình cảm và những lời khuyên quý báu.lời khuyên quý báu.  

Cuối cùng tôi xin cảm ơn các bạn bè, đồng nghiệp và nhất là các thành viên tronggia đình đã tạo mọi điều kiện tốt

gia đình đã tạo mọi điều kiện tốt  nhất, động viên, cổ vũ tôi trong suốt quá trình học tập vànhất, động viên, cổ vũ tôi trong suốt quá trình học tập vànghiên cứu để hoàn thành tốt luận văn

nghiên cứu để hoàn thành tốt luận văn tốt nghiệp này.tốt nghiệp này.  

Tác giảTác giả  

Trang 4

LỜI CAM ĐOAN  

Tôi xin cam đoan rằng đây là công trình nghiên cứu của tôi trong đó có sự giúp đỡcủa thầy hướng dẫn Các nội dung nghiên cứu và kết quả trong đề tài này là hoàn toàntrung thực

trung thực.  

Trong luận văn, tôi có tham khảo đến một số tài liệu của một số tác giả đã được liệt

kê tại phần tài liệu tham

kê tại phần tài liệu tham khảo ở cuối luận văn.khảo ở cuối luận văn

Trang 5

MỤC LỤC  

MỞ ĐẦU

MỞ ĐẦU  8   8   

CHƯƠNG 1 CHƯƠNG 1    CƠ SỞ LÝ LUẬN CƠ SỞ LÝ LUẬN   10 10    1.1    Tổng quan kiểm định phần mềm Tổng quan kiểm định phần mềm  10   10   

1.2    Các nhóm kiểm định phần mềm Các nhóm kiểm định phần mềm  10   10   

CHƯƠNG 2 CHƯƠNG 2    JAVA PATH FINDER VÀ THỰC THI JAVA PATH FINDER VÀ THỰC THI TƯỢNG TRƯNG TƯỢNG TRƯNG  12   12   

2.1    Giới thiệu về JPF Giới thiệu về JPF 12 12   

2.1.1    JPF có thể kiểm tra những chương trình gì? JPF có thể kiểm tra những chương trình gì?   13 13    2.1.2    Kiến trúc mức cao của JPF Kiến trúc mức cao của JPF   14 14   

2.1.3    Khả năng mở rộng của JPF Khả năng mở rộng của JPF   15 15    2.1.4    Một số mở rộng của JPF Một số mở rộng của JPF   16 16   

2.2    Thực thi tượng trưng để sinh dữ liệu kiểm thử Thực thi tượng trưng để sinh dữ liệu kiểm thử   17 17   

2.2.1    Thực thi tượng trưng là g Thực thi tượng trưng là gì? ì?   17 17    2.2.2    Thực thi tượng trưng với JPF Thực thi tượng trưng với JPF  18   18   

2.2.3    Hướng dẫn thực thi tượng trưng với JPF Hướng dẫn thực thi tượng trưng với JPF   19 19    2.2.4    Hạn chế Hạn chế  29   29   

CHƯƠNG 3 CHƯƠNG 3    MICROSOFT Z3 31   

3.1    SMT là gì 31   

3.2    Z3 là gì 31   

3.3    Tại sao lại là Z3? Tại sao lại là Z3?   32 32    3.4    Kiến trúc của Z3 Kiến trúc của Z3 32 32   

3.5    Định dạng đầu vào Định dạng đầu vào  33   33   

3.6    Định dạng SMT Định dạng SMT-LIB -LIB 34 34    3.6.1    Các chức năng chính của SMT Các chức năng chính của SMT-LIB -LIB 34 34   

3.7    Các quan hệ, phương thức, và hằng số Các quan hệ, phương thức, và hằng số.  35   35   

3.7.1    Tất cả các phương thức là tuyệt đối ( total) Tất cả các phương thức là tuyệt đối ( total)   35 35   

3.7.2    Uninterpreted function và hằng số Uninterpreted function và hằng số 36 36   

3.7.3    Phương thức đệ quy Phương thức đệ quy   36 36    3.8    Số học Số học 37 37   

3.8.1    Sô học tuyến tính thực Sô học tuyến tính thực   37 37   

3.8.2    Số hoc tuyến tính nguyên Số hoc tuyến tính nguyên  37   37   

3.8.3    Trộn giữa số nguyên và số thực Trộn giữa số nguyên và số thực.   38 38    3.8.4    Số học phi tuyến tính Số học phi tuyến tính   38 38   

Trang 6

3.9    Kiểu dữ liệu Kiểu dữ liệu   39 39   

3.9.1    Kiểu bản ghi Kiểu bản ghi 39 39   

3.9.2    Kiểu liệt kê ( enumeration) Kiểu liệt kê ( enumeration)   39 39   

3.9.3    Kiểu dữ liệu đệ qui Kiểu dữ liệu đệ qui.  39   39   

3.10    Ví dụ về Z3 Ví dụ về Z3   40 40   

3.11    Một vài Một vài  ứng dụng của Z3 ứng dụng của Z3  40   40   

CHƯƠNG 4 CHƯƠNG 4    TÍCH HỢP Z3 VỚI JPF TÍCH HỢP Z3 VỚI JPF   42 42   

4.1     Nghiên cứu đánh giá các giải pháp  Nghiên cứu đánh giá các giải pháp   42 42   

4.2    Kiến trúc hệ thống Kiến trúc hệ thống   42 42    4.3    Chuyển đổi dữ liệu Chuyển đổi dữ liệu   43 43    4.4    Thiết kế và cài đặt Thiết kế và cài đặt   47 47    4.5    Kết quả và đánh giá Kết quả và đánh giá 48 48   

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI TÀI  53   53   

TÀI LIỆU THAM KHẢO TÀI LIỆU THAM KHẢO  54   54   

Trang 7

DANH MỤC CÁC HÌNH  

Hình 2.1:

Hình 2.1: Mô hình Mô hình hoạt động hoạt động của JPFcủa JPF   12 12  

Hình 2.2: Sơ đồ trạng thái trong quá trình kiểm thửHình 2.2: Sơ đồ trạng thái trong quá trình kiểm thử   13 13  

Hình 2.3: Kiến trúc mức cao

Hình 2.3: Kiến trúc mức cao   1414  

Hình 2.4: Mẫu Listener Hình 2.4: Mẫu Listener     1515  

Hình 4.1: Kiến trúc hệ thống   43 43Hình 4.2: Sơ đồ mức gói

Hình 4.2: Sơ đồ mức gói    4747  

Hình 4.3: Sơ đồ lớp tổng quátHình 4.3: Sơ đồ lớp tổng quát   4848  

Hình 4.4: Kết quả với ChocoHình 4.4: Kết quả với Choco số học tuyến tínhsố học tuyến tính   49 49  

Hình 4 5: Kết quả với z3Hình 4 5: Kết quả với z3 số học tuyến tính.số học tuyến tính.  50  50  

Hình 4 6: Kết quả với Choco – Hình 4 6: Kết quả với Choco –   số học phi tuyến tínhsố học phi tuyến tính   51 51  

Hình 4 7: Kết quả với Z3 – Hình 4 7: Kết quả với Z3 –   số học phi tuyến tínhsố học phi tuyến tính   52 52  

Trang 8

MỞ ĐẦU  Trong những năm gần đây, việc phát triển phần mềm ngày càng được chuyênnghiệp hóa Các phần mềm được phát triển ngày càng có quy mô lớn Yêu cầu đảm bảochất lượng phần mềm là một trong những mục tiêu quan

chất lượng phần mềm là một trong những mục tiêu quan  trong nhất, đặc biệt trong một sốtrong nhất, đặc biệt trong một sốlĩnh vực như y khoa, ngân hàng, hàng không… Việc kiểm thử, kiểm chứng phần mềmmột cách thủ công chỉ đảm bảo được phần nào chất lượng của phần mềm Vì vậy rấtnhiều các tổ chức, công ty đã nghiên cứu và phát triển các lý thuyết cũng như công cụ đểkiểm chứng, kiểm thử phần mềm một cách tự động

kiểm chứng, kiểm thử phần mềm một cách tự động.  

Xuất phát từ nhu cầu thực tế trên, tác giả đã nghiên cứu một số lý thuyết, công cụtrong việc kiểm chứng và kiể

trong việc kiểm chứng và kiểm thử phần mềm Một lý thum thử phần mềm Một lý thuyết nền tảng rất quan trọng đó làyết nền tảng rất quan trọng đó là

lý thuyết về tính thỏa được, viết tắt là SMT (Satisfiability Modulo Theories) Lý thuyết vềtính thỏa được đã được ứng dụng để giải quyết nhiều bài toán trong công nghệ phần mềmnhư:

như:  

   Kiểm chứng chương trình Kiểm chứng chương trình  

   Khám phá chương trình Khám phá chương trình  

   Mô hình hóa phần mềm Mô hình hóa phần mềm  

   Sinh các ca kiểm Sinh các ca kiểm  thử thử  

Hiện nay Microsoft Z3 là Hiện nay Microsoft Z3 là một công cụ tìm một công cụ tìm lời giải cho SMT đang lời giải cho SMT đang được áp dụngđược áp dụngtrong nhiều

trong nhiều dự án của Microsoft dự án của Microsoft như: Pex, Spec#, SLAM/SDV, như: Pex, Spec#, SLAM/SDV, Yogi Z3 được Yogi Z3 được đánh giàđánh già

là công cụ tìm lời giải mạnh nhất hiện nay Tuy nhiên Z3 chỉ được áp dụng cho các ngônngữ của Microsoft Vì vậy tác giả đặt ra vấn đề: Liệu có thể sử dụng Z3 để kiểm chứngcho các chương trình viết bằng ngôn ngữ khác như Java?

cho các chương trình viết bằng ngôn ngữ khác như Java?   

Trong quá trình nghiên cứu về kiểm chứng chương trình tác giả cũng có tìm hiểu

về JavaPathFinder (JPF) JPF là một dự án mã nguồn mở được phát triển trên ngôn ngữJava Hiện nay có một mở rộng của JPF trong việc sinh tự động dữ liệu đầu vào để kiểmthử chương trình Tuy nhiên còn rất nhiều hạn chế, vì vậy tác giả đã nghĩ đến việc làm sao

để tích hợp được Z3 với JPF để có thể sinh tự động dữ liệu kiểm thử chương trình Nếuviệc tích hợp thành công thì sẽ dẫn tới việc giải quyết được lớp bài toán rộng hơn Điềunày là rất có ý nghĩa đối

này là rất có ý nghĩa đối với thực tế.với thực tế.  

Mục tiêu đề tài:  

Mục tiêu của đề tài là nghiên cứu nắm bắt rõ về Z3 và JPF Sau đó bước đầu tíchhợp thành công Z3 và JPF để có thể sinh tự động dữ liệu kiểm thử chương trình Java chocác bài toán mà hiện nay JPF không thể thực hiện được (ví dụ: sinh tự động dữ liệu cho

số học phi tuyến tính)

số học phi tuyến tính).  

Trang 9

CẤU TRÚC CỦA LUẬN VĂN  

Luận văn bao gồm các phần sau:

Luận văn bao gồm các phần sau:  

trưng để sinh dữ liệu kiểm thử cho chương trình  trong JPF Mở rộng này sẽ cho trong JPF Mở rộng này sẽ cho  phép sinh tự động

 phép sinh tự động dữ liệu kiểm thử c dữ liệu kiểm thử chương trình Java hương trình Java.  

Chương 3:: Microsoft Z3

 Nội

 Nội dung: dung: Giới Giới thiệu thiệu về về lý lý thuyết thuyết tính tính thỏa thỏa   được SMT, Z3, các lý thuyết được SMT, Z3, các lý thuyết được hỗ trợ trên Z3, các API của

được hỗ trợ trên Z3, các API của Z3 để tích hợp với JPF, các ứng dụng của Z3 để tích hợp với JPF, các ứng dụng của Z3 Z3.  

Chương 4::  Tích hợp JPF với Z3 Tích hợp JPF với Z3  

Trình bày kết quả sau khi nghiên cứu, triển khai và hướng phát triển tiếp theo.

Trang 10

CHƯƠNG 1    CƠ SỞ LÝ LUẬN  

1.1     T ổng quan kiểm định phần mềm 

 Nh Nhưư chúng tachúng ta đã biếtđã biết,, việcviệc  kiểmkiểm  thửthử   phần phần  mềmmềm là là mộtmột khâu không khâu không thểthể  thiếuthiếu trong trongcác b

các bướcước phát phát triểntriển   phần phần  mềm, đặcmềm, đặc   biệt biệt các các phần phần  mềmmềm  lớnlớn,, nhiềunhiều module do module do nhiềunhiều ng ngườiười   phát triểntriển,, dễdễ sinh ra các sinh ra các lỗilỗi  tiềmtiềm  ẩnẩn mà nhà phát mà nhà phát triểntriển không không thểthể l lườngường tr  tr ước Trong lĩnhvực kiểm định 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ưngtựu chung có thể phân theo ba

tựu chung có thể phân theo ba  nhóm chính: P  nhóm chính: Phân tích mã nguồn tĩnh (static codehân tích mã nguồn tĩnh (static codeanalysis), k 

analysis), k iểm thử dữ liệu động (dynamic data testing) và kỹ thuật hình thứciểm thử dữ liệu động (dynamic data testing) và kỹ thuật hình thức  dựa trên môdựa trên môhình (model-

hình (model- based  based verification) verification) Hai Hai nhóm nhóm đầu đầu tập tập trung trung vào vào việc việc nâng nâng cao cao chất chất lượnglượng phần

 phần mềm mềm tại tại mức mức mã mã nguồn, nguồn, trong trong khi khi nhóm nhóm cuối cuối cùng cùng xử xử lý lý phần phần mềm mềm tại tại mức mức trừutrừutượng cao hơn – 

tượng cao hơn –  mô hình. mô hình

1.2     C ác nhóm kiểm định phần mềm 

Phân tích mã nguồn tĩnhồn tĩnh là k là k ỹỹ thu thuậật phát hit phát hiệện ln lỗi chương trình mà không yêu cầỗi chương trình mà không yêu cầuuchạy chương trình đó Không giống như kỹạy chương trình đó Không giống như kỹ   thuthuậậtt kiểểm m th thử    d dữ    li liệu động  đòi hỏđòi hỏi i phphảảiich

chạy chương trình vớ ạy chương trình vớ i di dữữ li liệu đầệu đầu vào thu vào thậật, k t, k ỹỹ thu thuậật phân tích mã ngut phân tích mã nguồn tĩnh chỉồn tĩnh chỉ xem xét xem xét

mã ngu

mã nguồồn cn của chương trình.ủa chương trình

K ỹỹ   thu thuậật t ki kiểểm m th thử    ph phầần n m mềềm m d dự a trên mô hình: khác v khác vớ ớ i hai nhómi hai nhóm ở ở  trên trên ở ở   điểm đối tượng đượ 

điểm đối tượng đượ c kic kiểểm thm thửử  là các mô hình đượ là các mô hình đượ c tr c tr ừu tượ ừu tượ ng hóa tng hóa từừ h hệệ th thống đượ ống đượ c xemc xemxét Quá trình tr 

xét Quá trình tr ừu tượ ừu tượ ng hóa là ving hóa là việc lượ ệc lượ c bc bỏỏ nh nhữững chi ting chi tiếết ct củủa ha hệệ th thốống trong khi chng trong khi chỉỉ gi giữữ  llạại nhi nhữững thông tin/khía cng thông tin/khía cạạnh quan tr nh quan tr ọọng cng cần được lưu tâm Kỹần được lưu tâm Kỹ thu thuậật tr t tr ừu tượng hóa đơnừu tượng hóa đơngi

giảản hóa hn hóa hệệ  ththống được xem xét và do đó giảống được xem xét và do đó giảm không gian tìm kim không gian tìm kiếếm và thm và thờ ờ i gian phâni gian phântích chương trình đi nhiề

tích chương trình đi nhiều lu lầần so vn so vớ ớ i lúc thi lúc thựực hic hiệện công vin công việc phân tích đó trên mã nguồệc phân tích đó trên mã nguồn.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ợpkiể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ợpcác testcase mà chúng ta sử dụng Hai tiêu chí chính của việc đánh giá chất lượng kiểmthử đó là

thử đó là  hiệu quả cho chất lượng phần mềm được kiểm thử là độ phủ dòng chảy (controlhiệu quả cho chất lượng phần mềm được kiểm thử là độ phủ dòng chảy (controlflow coverage) và độ phủ dữ liệu (data coverage) Tiêu chí thứ nhất tập trung vào việckiể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 trongcấu trúc chương trình – 

cấu trúc chương trình –   reachable control points) Trong khi tiêu chí thứ hai tập trung vàoreachable control points) Trong khi tiêu chí thứ hai tập trung vàotập dữ liệu kiểm thử ứng với mỗi điể

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.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á

Trang 11

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í controlfl

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.ow 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ôngsứ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ể

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đượ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 đượcnhiều trường hợp hơn, đặt biệt là cá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.lỗi logic, tiết kiệm chi phí sản xuất.  

Đánh giá tập p d dữ    li liệệu u ki kiểểm m th thử :: Ngoại  Ngoại trừ trừ những những chương chương trình trình đơn đơn giản, giản, sẽ sẽ làlàkhông thực tế

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ể.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ả 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ớ 

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,lớn, các dữ liệu đầu vào,đầu ra sẽ được log lại để theo dõi trạng thái

đầ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 raTrong khi không có một công cụ để tạo ramộ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âukhông thể thiếu để có thể đánh giá được chất lượng phần mềm

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ìmVì thế người ta phải tìmcác

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ớih 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ớimỗ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ử

kiểm thử.   Nếu kiểm  Nếu kiểm thử không đầthử không đầy đủ được hếy đủ được hết mọi khía t mọi khía cạnh của cạnh của phần mềm phần mềm đồng nghĩađồng nghĩavới việc chúng ta bỏ sót nhiều lỗi

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ốngCác tấn suất của các trường hợp cũng không giốngnhau

Khái niệm ca kiểm thử Khái niệm ca kiểm thử đơn giản là kiểm đơn giản là kiểm chứng các trạng thái đưa ra thể hiện chứng các trạng thái đưa ra thể hiện chochohoạ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

 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.  

Trang 12

CHƯƠNG 2    JAVA PATH FINDER VÀ THỰC THI TƯỢNG

thử chương trình Java.  

2.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 [5].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

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ể 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

đượ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ủa1 mô tả mô hình hoạt động củaJPF

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

 phần mềm mềm kiểm kiểm chứng chứng mô mô hình hình phải phải đối đối mặt mặt với với nhiều nhiều thách thách thức thức JPF JPF cũng cũng không không làlàngoại lệ

ngoại lệ Câu trả lời của chúng Câu trả lời của chúng ta đó là tăng sự lta đó là tăng sự linh hoạt của JPF để thíinh hoạt của JPF để thích nghi với mộtch 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

rộng để có thể giải quyết được bài toán cụ thể mà cbài toán cụ thể mà chúng ta muốn.húng ta muốn.  

Trang 13

2.1.1    JPF có thể kiểm tra những chương trình gì?  

JPF có thể kiểm JPF có thể kiểm tra tất cả các chương tra tất cả các chương trình Java trình Java JPF có thể tìm JPF có thể tìm ra các khóara các khóa  chếtchếthoặ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ínhkhác Để hiểu rõ hơn về JPF chúng ta có thể xét ví dụ sau:

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 traxem có lỗi không

xem có lỗi không.  

import java.util.Random;

 public class Rand { public static void main  public static void main (String[] args) {(String[] args) {Random

Random random random = = new new Random(42); Random(42); // // (1)(1)

int int a a = = random.nextInt(2); random.nextInt(2); // // (2)(2)System.out.println("a=" + a);

int int b b = = random.nextInt(3); random.nextInt(3); // // (3)(3)System.out.println("

System.out.println(" b=" b=" + + b);b);

int int c c = = a/(b+a a/(b+a -2); -2); // // (4)(4)System.out.println("

Trang 14

Hoạ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áckhoang tương ứng la [0,2] và [0,3] Sau đó có một biến c có giá trị được xác định bằngcông thức c = a/(b+a

công thức c = a/(b+a-2).-2)

 Nếu ta chạ Nếu ta chạy chương trình java này chương trình java này thông thường thì có thể y thông thường thì có thể thấy kết quả thấy kết quả là: a = 1, là: a = 1, bb

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 ralỗ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ìnhsau đó kiểm tra chúng

sau đó kiểm tra chúng Ta sẽ thấy có 2 Ta sẽ thấy có 2 trường hợp lỗi gây ra bởi phép chia cho trường hợp lỗi gây ra bởi phép chia cho 0.0.  

2.1.2    Kiến trúc mức cao của JPF  

Trang 15

Hình Hình 2-3 biểu diễn 3 biểu diễn sơ đồ kisơ đồ kiến trúc mức ến trúc mức cao của JPF JPF cao của JPF JPF được thiết được thiết kế thành 2kế thành 2thành phần chính đó là: JVM,

2-thành phần chính đó là: JVM, và Search. và Search

JVM JVM là một bộ là một bộ sinh trạng thái sinh trạng thái cụ thể Java Bằng cụ thể Java Bằng việc thực hiện các chỉ việc thực hiện các chỉ thị Javathị Java bytecode

Search chịu trách nhiệm lựa chọn trạng thái mà JVM nên xử lý, hoặc hướng JVMsinh trạng thái tiếp theo, hoặc yêu cầu JVM quay trở lại một trạng thái trước đó Nói mộtcác khác Search có thể coi như các driver cho các đối tượng JVM Search cũng cấu hình

và đánh giá các đối tượng thuộc tính Các cài đặt chính của Search bao gồm tìm kiếm theo

độ sâu (DFSearch) và HeuristicSearch Một cài đặt Search sẽ cung cấp một phương thứcSearch đơ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ạngthá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.3    Khả năng mở rộng của JPF  

Trang 16

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 Searchhoặc VM

thông báo khi một đối tượng (Subject) tương ứng thực thi một hoạt động thực thi một hoạt động nhất định, và saunhấ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

vi của đối tượng.  

Việc thay đổi các khía cạnh của đổi tượng được ánh xạ vào các phương thứcObserver riêng biệt, các thể hiện của đối tượng sẽ được truyền đi như tham số Đối tượngSubject sẽ theo dõi các listener đã đăng ký theo Multicaster

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áchcài đặt listener

cài đặt listener.  

    GenericGeneric –  –    listener cư trú bên ngoài các gói JPF và chỉ sử dụng các thông tin đã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

được công khai (public) theo gov.nasa.jpf.Search / VM.  

    Search-specificSearch-specific –  –   listener cư trú bên ngoài gói JPF nhưng sẽ đưa các tham số thônglistener cư trú bên ngoài gói JPF nhưng sẽ đưa các tham số thông báo

 báo của của đối đối tượng tượng Subject Subject vào vào các các cài cài đặt đặt cụ cụ thể thể (ví (ví dụ:dụ:gov.nasa.jpf.search.heuristic

gov.nasa.jpf.search.heuristic.BFSHeuristic), và sử dụng các API của nó để lấy cácBFSHeuristic), và sử dụng các API của nó để lấy cácthông tin cài đặt cụ thể

thông tin cài đặt cụ thể.  

    Internal -Internal - listener cư trú listener cư trú trong các gói trong các gói cài đặt Subject cài đặt Subject riêng biêt và riêng biêt và truy cập truy cập cáccácthông tin riêng của gói ( private)

thông tin riêng của gói ( private)   

2.1.4    Một số mở rộng của JPF  

Với kiến trúc mở rộng linh hoạt,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ểnhiện nay đã có một số mở rộng được phát triểncho JPF

UI

UI - Use - User r II nte nterf rf ac ace e M M od ode el Chec l Checki ki ng ng

Đâ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à

đó là các chương trình Swing và AWT Mở rộng này được càAWT Mở rộng này được cài đăt như một như việni đăt như một như việnchuẩ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

có thể được kiểm thử với các đầu vào khác nhau.  

ssymbc - Sy ymbc - Symbol mboliic Tes c Test D t Data Ge ata Gener nerati ation  on   

Mở rộng

Mở rộng  này sử dụng BytecodeFactory để ghi đè lõi (core) JPF bytecodes nhằmnày sử dụng BytecodeFactory để ghi đè lõi (core) JPF bytecodes nhằmsinh 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

Trang 17

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àomột hệ thống tìm lời giải theo đinh dạng của hệ thống đó để đưa ra dữ liệu kiểm thử Mởrộng này sẽ được

rộng này sẽ được  trình bày chi tiết hơn ở phần 2trình bày chi tiết hơn ở phần 2.2 2

cv

cv - Comp - Compos ositi iti onal Veri onal Veri fi fi ca cation F tion F rame ramework work

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

đảm bảo, nhằm mục đích đích phân chia hệ tphân chia hệ thống thành các hống thành các thành phần con thành phần con và sau đó kvà sau đó kiểmiểmchứ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ếnkhả năng của JPF, nó có thể được sử dụng để sinh ra môi trường giả định cho kiểm chứngmô

mô hình UML, để xác định cáhình UML, để xác định các trình tự sự kiện đúng.c trình tự sự kiện đúng

numeri numeri c - c - Num Num e eri ri c P c Prope roperty Verif rty Verif ication ication

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)

động chính xác (floating point comparison).  

sstate tatechart - U chart - U M M L L S State tate Char Char t M t M ode odel Ch l Ch e ecki cking ng

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ớpJava (hoặc nhiều lớp) Sau đó quá trình kiểm tra sẽ là kiểm tra các lớp java đó

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 để sinh dữ liệu kiểm thử   2.2.1    Thực thi tượng trưng là gì?  

Đổi giá trị giữa 2 biếnĐổi giá trị giữa 2 biến   Đường đi cụ thểĐường đi cụ thể  

Trang 18

Hình 2.5: Ví dụ về thực thi tượng trư ng

Kỹ thuật thực thi tượng trưng là kỹ thuật thực thi chương trình bằng cách sử dụngcác giá trị tượng trưng, không phải sử dụng các giá trị cụ thể [2] Để hiểu rõ thực thitượng trưng là gì, xét ví dụ chuyển đổi giứa 2

tượng trưng là gì, xét ví dụ chuyển đổi giứa 2 biến x và y:biến x và y:  

Ở ví dụ trên, nếu trong trường hợp thực

Ở ví dụ trên, nếu trong trường hợp thực thi tượng trưng, giá trị của x và thi tượng trưng, giá trị của x và y là các giáy là các giátrị tượng trưng X, Y chứ không phải là các giá trị cụ thế Kết quả của quá trình thực thitượng trưng sẽ duyệt hết các dường đi có thể có của chương trình, và cho ra điều kiênđường đi

Ưu điểm của phương pháp này là ta có thể thực thi tại bất kỳ điểm nào trongchương trình và có thể trộn giữa đầu vào tượng trưng với đầu vào cụ thể Phương phápnày sẽ cho ta các điều kiện đường đi của chương trình, và với việc sử dụng các công cụtìm lời giải cho các điều kiện đường đi (coi mỗi điều kiện đường đi là một biểu thức) sẽsinh ra dữ liệu kiểm thử cho c

sinh ra dữ liệu kiểm thử cho chương trình.hương trình.  

TuTuy nhiên phương pháp này cũng có giới hạn đó là có thể bùng nổ các đường điy nhiên phương pháp này cũng có giới hạn đó là có thể bùng nổ các đường đitrong việc thực thi tượng trưng

trong việc thực thi tượng trưng.  

2.2.2    Thực thi tượng trưng với JPF  

Thực thi tượng trưng là một mở rộng của JPF Mở rộng này của JPF sẽ thực thitượng trưng các chương trình java Một trong những ứng dụng chính của mở rộng này, đó

là tự động sinh dữ liệu kiểm thử bao p

là tự động sinh dữ liệu kiểm thử bao phủ toàn bộ chương trình của mhủ toàn bộ chương trình của mã nguồn.ã nguồn.  

Trang 19

Mở rộng này phối hợp thực thi tượng trưng với kiểm chứng mô hình và các ràng buộc giải qu

 buộc giải quyết để sinh yết để sinh dữ liệu kiểm dữ liệu kiểm thử Trong cthử Trong công cụ ông cụ này, các này, các chương trình được chương trình được thựcthựcthi trên đầu vào tượng trưng Các giá trị của các biến được biểu diễn như và các biểu thức

số và ràng buộc, chúng được sinh từ việc phân tích cấu trúc mã nguồn Những ràng buộcsau đó được giải quyết để sinh ra các dữ liệu kiểm thử để đảm bảo đạt được phần mãnguồn đó

nguồn đó.  

Tại thời điểm hiện tại JPF hỗ trợ các tham số nguyên và thực Tuy nhiên vẫn cònmột số trường hợp cần giải quyết cho

một số trường hợp cần giải quyết cho số thực.số thực.  

Hiện tại mở rộng này chỉ hỗ trợ các ràng buộc tuyến tính (số học tuyến tính), sôhhọc phi tuyến là chưa được hỗ trợ Thông tin tượng trưng đươc truyền theo các thuộc tínhọc phi tuyến là chưa được hỗ trợ Thông tin tượng trưng đươc truyền theo các thuộc tínhkết hợp với các biến và các toán tử Thực thi tượng trưng có thể bắt đầu từ bất kỳ điểmnào trong chương trình và nó có thể

nào trong chương trình và nó có thể thực thi tượng trưng riêng biệt với nhau.thực thi tượng trưng riêng biệt với nhau

2.2.3    Hướng dẫn thực thi tượng trưng với JPF  

Để thực hiên một phương thức một cách tượng trưng, người sử dụng cần đặc tảtham số phương thức nào là tượng trưng/cụ thể Các tham biến toàn cục cũng có thể đượcđặc tả để thực thi tượng trưng, theo các sự chú thích đặc biệt Đây là một ví dụ để chạymột thực thi tượng trung Ví dụ này cho phép thực thi tượng trưng của phương thức testtrong lớp chính

trong lớp chính.  

+vm.insn_factory.class=gov.nasa.jpf.symbc.SymbolicInstructionFactory +jpf.listener=gov.nasa.jpf.symbc.SymbolicListener

+symbolic.method=test(sym#con) +search.multiple_errors=true +jpf.report.console.finished=

 public class MyClass1 { public int myMethod(i public int myMethod(int x, int y) {nt x, int y) {int z = x + y;

if (z > 0) {

z = 1;

} else {

z = z - x;

Trang 20

trong phương thức main() của lớp MyClass1.  

Trong ví dụ đơn giản này, driver chỉ cần gọi myMethod() với số và kiểu tham sốđúng sau đó in ra điều kiện đường đi (Path condition – 

đúng sau đó in ra điều kiện đường đi (Path condition –   PC) Điều lưu ý là tham số chínhPC) Điều lưu ý là tham số chínhxác không phải là vấn đề, vì chúng ta sẽ thực thi myMethod() một cách tượng trưng, tất cảcác giá trị cụ thể sẽ được thay thế bằng giá trị tượng trưng

các giá trị cụ thể sẽ được thay thế bằng giá trị tượng trưng   

Chúng ta có thể xem các ca kiểm thử (test case) bằng cách in ra điều kiện đường

đi Việc này thực hiện được bằng

đi Việc này thực hiện được bằng cách gọi phương thức:cách gọi phương thức:

gov.nasa.jpf.symbc.Debug.printPC()

gov.nasa.jpf.symbc.Debug.printPC() Sau đây Sau đây là mã nguồn là mã nguồn đầy đủ:đầy đủ:  

 public class MyClass1 { public int myMethod(int  public int myMethod(int x, int y) {x, int y) {int z = x + y;

int x = mc.myMethod(1, 2);

Debug.printPC("MyClass1.myMethod Path Condition: ");

}}

}}

Trang 21

Khi đó nếu chạy bằng Eclipse sẽ cho kết quả sau:

Hình 2.6: Đầu ra trên Eclipse cho Đầu ra trên Eclipse cho MyClass1 MyClass1  

 Nhìn vào kết quả ở trên các PC sẽ chỉ ra các ca kiểm thử là Nhìn vào kết quả ở trên các PC sẽ chỉ ra các ca kiểm thử là  

Ca kiểm thử 1 tương ứng với ương ứng với z > 0 của câu lệnh iz > 0 của câu lệnh if của phương thức myf của phương thức myMethod.Method

Ca kiểm thử 2 tương ứng với nhánh z≤0

Ca kiểm thử 2 tương ứng với nhánh z≤0.  

Trang 22

// The test driver public static void m public static void main(String[] args) {ain(String[] args) {MyClass2 mc = new MyClass2();

+vm.storage.class=

+symbolic.method=myMethod2(sym#sym) +search.multiple_errors=true

+jpf.report.console.finished=

 MyClass2

Hình 2.7: Đầu ra của MyClass2 trên Đầu ra của MyClass2 trên Eclipse Eclipse  

Khi đó chúng ta sẽ nhận đƣợc 4 ca kiểm thử nhƣ sau:

Khi đó chúng ta sẽ nhận đƣợc 4 ca kiểm thử nhƣ sau:  

    Ca kCa kiểm thử iểm thử 1: 1: y y = 10000= 10000000, 000, x =x = -9999999-9999999

Trang 23

    Ca kiểm Ca kiểm thử 2: thử 2: y y == -4, -4, x x = = 55

    Ca kiểm Ca kiểm thử 3: thử 3: y y == -10000000, x = -10000000-10000000, x = -10000000

    Ca kiểm Ca kiểm thử 4: thử 4: y y == -10000000, x = 5-10000000, x = 5Tuy nhiên giả sử chúng ta chỉ cần quan tâm trong các ca kiểm thử mà lệnh if đƣợcthực hiện, khi đó chúng ta chỉ cần quan tâm đến ca kiểm thử 2 và 3 Chúng ta có thể chỉchạy JPF nhƣ ở trên và lọc chúng một cách thủ công Tuy nhiên có một cách khác tốt hơn

đó là ta sử dụng Verify.ignoreIf() để bắt JPF quay trở lại khi một câu lênh if đƣợc tìm rahơn một lần, ví dụ ta có thể

hơn một lần, ví dụ ta có thể thông báo myMethod2() nhƣ sau:thông báo myMethod2() nhƣ sau:

import gov.nasa.jpf.jvm.Verify;

import gov.nasa.jpf.symbc.Debug;

 public class MyClass2 { private int myMeth private int myMethod2(int x, int y) {od2(int x, int y) {int jpfIfCounter = 0;

int z = x + y;

if (z > 0) { jpfIfCounter++;

z = 1;

}}

if (x < 5) { jpfIfCounter++;

Verify.ignoreIf(jp Verify.ignoreIf(jpfIfCounter > fIfCounter > 1); 1);

z = -z;

}}

Verify.ignoreIf(jpfIfC Verify.ignoreIf(jpfIfCounter == 0); ounter == 0);

return z;

}}

// The test driver public static void m public static void main(String[] args) {ain(String[] args) {MyClass2 mc = new MyClass2();

int x = mc.myMethod2(1, 2);

Debug.printPC("\nMyClass2.myMethod2 Path Condition: ");

}}

}}

Trang 24

Các chú thích (annotations) được bôi đậm Và bây giờ ta có thể chạy chương trình và kếtquả là sẽ chỉ nhận được 2 ca kiểm thử cần thiết:

quả là sẽ chỉ nhận được 2 ca kiểm thử cần thiết:  

    Test Test Case Case 1: y 1: y = = -4, -4, x x = = 55

    Test Case Test Case 2: 2: y = y = -10000000, x = -10000000, x = -10000000-10000000

2.2.3.3    Bổ sung tiền điều kiện  

Giả sử rằng ta muốn giới hạn các ca kiểm thử được sinh ra, nhưng bây giờ vấn đề

là bạn muốn rằng phương thức của bạn sẽ chỉ được gọi với các tham số trong một khoảngnào Ví dụ trong MyClass1.myMethod() bạn tin tưởng rằng x và y được giới hạn trongkhoảng

if

if (-100 (-100 <= <= x x && && x x <= <= 100 100 && && 1 1 <= <= y y && && y y <= <= 3) 3) {{

Trang 25

myMethod() cần phải đƣợc symboliccần phải đƣợc symbolic  

Hình 2.9: Đầu ra của MyDriver trên Đầu ra của MyDriver trên Eclipse Eclipse  

Kết quả sẽ cho ra các ca kiểm thử với các tham số nằm trong khoảng giới hạn

    Ca kiểm Ca kiểm thử thử 1: 1: y y = = 1, 1, x = x = 00  

    Ca kiểm Ca kiểm thử thử 2: 2: y y = = 1, 1, x =x = -100-100

Trang 26

Chạy Eclipse với các tham số cấu hình nhƣ sau:

Chạy Eclipse với các tham số cấu hình nhƣ sau:  

+vm.insn_factory.class=gov.nasa.jpf.symbc.SymbolicInstructionFactory +vm.classpath=.

+vm.storage.class=

+symbolic.method=myMethodFP(sym#sym) +search.multiple_errors=true

+jpf.report.console.finished=

 MyClassFP

Trang 27

Hình 2 10: Đầu ra của MyClassFP trên Eclipse  

Khi đó kêt quả ta sẽ được các ca kiểm thử sau:

    Ca kiểm thử 1: y =Ca kiểm thử 1: y = -4.999992597731762E-7, x = -5000.00000025-4.999992597731762E-7, x = -5000.00000025

    Ca kiểm Ca kiểm thử thử 2: 2: y y = = 0.0, 0.0, x = x = 0.00.0  

    Ca kiểm Ca kiểm thử 3: thử 3: y y == -4.999992597731762E-7, -4.999992597731762E-7, x x = = -5000.00000025-5000.00000025

Ở đây ta thấy nhận được 3 ca kiểm thử tuy nhiên trong trường hợp kiểu là sốnguyên ta chỉ nhận được 2 ca kiểm thử Đó là bởi vì JPF thực thi trên JVM bytecode,không phải là Java source code Khi z là biến double, đoạn mã

Ngày đăng: 04/08/2020, 16:16

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w