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

Kết hợp các phương pháp sinh mẫu thử tự động và khoanh vùng lỗi để tăng hiệu quả trong quá trình kiểm thử phần mềm

74 21 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 74
Dung lượng 1,14 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ương tự, các phương pháp sinh mẫu thử tự động thườngtạo ra các bộ mẫu thử tuân theo tiêu chí riêng của mình mà không quan tâm bộ mẫuthử được sinh ra có phù hợp với quá trình khoanh vùng

Trang 1

ĐẠI HỌC QUỐC GIA TP HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA

-

PHẠM HỒNG LONG

KẾT HỢP CÁC PHƯƠNG PHÁP SINH MẪU THỬ TỰ ĐỘNG

VÀ KHOANH VÙNG LỖI TRONG KIỂM THỬ PHẦN MỀM

Chuyên ngành: Khoa học máy tính

Mã số: 60.48.01

LUẬN VĂN THẠC SĨ

TP HỒ CHÍ MINH, tháng 6 năm 2014

Trang 2

CÔNG TRÌNH ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA –ĐHQG -HCM

Cán bộ hướng dẫn khoa học: PGS TS Quản Thành Thơ

Cán bộ chấm nhận xét 1: TS Nguyễn Chánh Thành

Cán bộ chấm nhận xét 2: TS Nguyễn Thanh Hiên

Luận văn thạc sĩ được bảo vệ tại Trường Đại học Bách Khoa, ĐHQG Tp HCM ngày 17 tháng 07 năm 2014

Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm:

1 GS TS Phan Thị Tươi

2 PGS TS Quản Thành Thơ

3 TS Bùi Hoài Thắng

4 TS Nguyễn Chánh Thành

5 TS Nguyễn Thanh Hiên

Xác nhận của Chủ tịch Hội đồng đánh giá LV và Trưởng Khoa quản lý chuyên ngành sau khi luận văn đã được sửa chữa (nếu có)

CHỦ TỊCH HỘI ĐỒNG TRƯỞNG KHOA KH&KTMT

Trang 3

ĐẠI HỌC QUỐC GIA TP.HCM

TRƯỜNG ĐẠI HỌC BÁCH KHOA

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

Độc lập - Tự do - Hạnh phúc

NHIỆM VỤ LUẬN VĂN THẠC SĨ

Họ tên học viên: Phạm Hồng Long MSHV: 12073123

Ngày, tháng, năm sinh: 17/01/1989 Nơi sinh: Bình Dương

Chuyên ngành: Khoa học máy tính Mã số : 60.48.01

I TÊN ĐỀ TÀI: Kết hợp các phương pháp sinh mẫu thử tự động và khoanh vùng lỗi trong

kiểm thử phần mềm

II NHIỆM VỤ VÀ NỘI DUNG: Khảo sát các phương pháp sinh mẫu thử tự động và các

phương pháp khoanh vùng lỗi khác nhau, để xem những bộ mẫu thử do các phương pháp sinh mẫu thử tự động sinh ra có phù hợp để sử dụng cùng với các phương pháp khoanh vùng lỗi hay không

III NGÀY GIAO NHIỆM VỤ : 24/06/2013

IV NGÀY HOÀN THÀNH NHIỆM VỤ: 23/05/2014

V CÁN BỘ HƯỚNG DẪN: PGS TS Quản Thành Thơ

Trang 4

Lời cảm ơn

Tôi xin gửi lời cảm ơn sâu sắc của mình đến Phó giáo sư Tiến sĩ Quản Thành Thơ,người thầy đã nhiệt tình hướng dẫn để tôi có thể hoàn thành luận văn này Tôi cũngmuốn gửi lời cảm ơn đến Tiến sĩ Nguyễn Hứa Phùng, người đã dẫn dắt tôi đi nhữngbước đầu tiên trên con đường nghiên cứu khoa học Bên cạnh đó, tôi cũng hết sức biết

ơn các thầy cô trong trường Đại học Bách Khoa thành phố Hồ Chí Minh vì những kiếnthức quý báu họ đã truyền dạy Cuối cùng, tôi xin cảm ơn gia đình và bạn bè, nhữngngười luôn ở bên tôi trong suốt những năm qua

i

Trang 5

Tóm tắt

Phần mềm ngày càng đóng một vai trò quan trọng trong đời sống Điều này dẫnđến yêu cầu các phần mềm phải được kiểm thử nghiêm ngặt trước khi đưa vào sử dụng.Tuy vậy, quá trình kiểm thử phần mềm thủ công lại rất phức tạp Tương tự, nếu phầnmềm bị lỗi, việc tìm ra vị trí lỗi trong mã nguồn cũng là một việc không hề đơn giản

Để trợ giúp cho quá trình kiểm thử cũng như sửa lỗi phần mềm, có hai hướng nghiêncứu quan trọng là sinh mẫu thử tự động và khoanh vùng lỗi Trong quá khứ, hai hướngnghiên cứu này thường được xem xét một cách độc lập Luận văn này dựa vào phươngpháp thực nghiệm tiến hành khảo sát khả năng kết hợp của các phương pháp sinh mẫuthử tự động và các phương pháp khoanh vùng lỗi, với mục tiêu bước đầu tạo nên cầunối giữa hai hướng nghiên cứu trên

ii

Trang 6

Software plays an increasingly important role in our lives This leads to the ments that software must be strictly tested before being used However, the manualsoftware testing process is very complex Similarly, if the software fails, locating errors

require-in the source code is not a simple task at all To assist the testrequire-ing as well as fixrequire-ing cesses, there are two important research directions called automatic test cases generationand fault localization In the past, these two research directions are often considered in-dependently This thesis is based on empirical methods to survey the ability of combiningautomatic test case generation methods and fault localization methods, with the initialgoal of building a bridge between these two research directions

pro-iii

Trang 7

Lời cam đoan

Tôi xin cam đoan ngoại trừ những phần được ghi rõ là tham khảo trong bài báo cáonày, tất cả những công việc khác đều được hoàn thành bởi chính tôi và công việc nàychưa được trình bày ở bất cứ tài liệu nào khác

Phạm Hồng Long

iv

Trang 8

Mục lục

1.1 Tổng quan vấn đề 1

1.2 Mục tiêu của đề tài 3

1.3 Giới hạn của đề tài 4

1.4 Đóng góp của đề tài 5

1.5 Công việc liên quan 6

1.6 Cấu trúc luận văn 7

2 Sinh mẫu thử tự động 9 2.1 Kiểm thử hộp đen và kiểm thử hộp trắng 9

2.2 Kiểm thử dòng điều khiển 10

2.3 Sinh mẫu thử bằng phương pháp tìm kiếm 12

2.4 Các kỹ thuật tìm kiếm 13

2.4.1 Tìm kiếm ngẫu nhiên 14

2.4.2 Tìm kiếm bằng giải thuật leo đồi đơn giản 14

2.4.3 Tìm kiếm bằng giải thuật leo đồi dốc nhất 14

2.4.4 Tìm kiếm bằng giải thuật tôi luyện mô phỏng 15

2.4.5 Tìm kiếm bằng giải thuật di truyền 15

2.4.6 Ví dụ 16

2.5 Sinh mẫu thử bằng phương pháp giải ràng buộc 17

2.6 Thảo luận 18

v

Trang 9

Mục lục vi

3.1 Khoanh vùng lỗi dựa trên mô hình 20

3.2 Khoanh vùng lỗi dựa trên chứng minh 21

3.3 Khoanh vùng lỗi dựa trên phổ 22

3.4 Thảo luận 27

4 Phương pháp tiến hành 28 4.1 Mô hình hiện thực 28

4.2 Một số chi tiết hiện thực 30

5 Kết quả thí nghiệm 33 5.1 Chương trình thí nghiệm 33

5.2 Kết quả thí nghiệm 34

5.2.1 Tính trị tuyệt đối 35

5.2.2 Kiểm tra bằng 0 36

5.2.3 Kiểm tra tính chẵn lẻ 37

5.2.4 Kiểm tra số nguyên tố 38

5.2.5 Tính giai thừa 40

5.2.6 Tính tổng các số chẵn 41

5.2.7 Tìm số lớn hơn 42

5.2.8 Kiểm tra hai số bằng nhau 44

5.2.9 Tính số nghiệm của phương trình bậc hai 45

5.2.10 Kiểm tra tam giác đều 47

5.3 Nhận xét tổng hợp 48

6 Trang web hỗ trợ học lập trình 50 6.1 Động lực phát triển 50

6.2 Mô hình của trang web 50

6.3 Hoạt động của trang web 52

7 Kết luận 55 7.1 Tổng kết 55

7.2 Công việc tương lai 56

7.2.1 Khoanh vùng lỗi thích ứng 56

7.2.2 Tăng khả năng tương tác của trang web 57

Trang 10

Danh mục hình

4.1 Mô hình đề xuất 29

6.1 Mô hình của trang web gồm các nhân tố và module 50

6.2 Giao diện các bài tập của trang web 53

6.3 Giao diện lập trình của trang web 53

6.4 Giao diện của trang web khi bài giải đúng 53 6.5 Giao diện của trang web khi bài giải sai (sử dụng module Fault Localization) 54 6.6 Giao diện của trang web khi bài giải sai (sử dụng module Group Testing) 54

vii

Trang 11

Danh mục bảng

2.1 So sánh ưu, nhược điểm của các phương pháp sinh mẫu thử tự động 19

3.1 So sánh ưu, nhược điểm của các phương pháp khoanh vùng lỗi 27

5.1 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Tính trị tuyệt đối 35

5.2 Số thành phần cần kiểm tra trong phiên bản Abs1 35

5.3 Số thành phần cần kiểm tra trong phiên bản Abs2 35

5.4 Số thành phần cần kiểm tra trong phiên bản Abs3 36

5.5 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Kiểm tra bằng 0 36

5.6 Số thành phần cần kiểm tra trong phiên bản Zero1 36

5.7 Số thành phần cần kiểm tra trong phiên bản Zero2 37

5.8 Số thành phần cần kiểm tra trong phiên bản Zero3 37

5.9 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Kiểm tra tính chẵn lẻ 37

5.10 Số thành phần cần kiểm tra trong phiên bản Even1 38

5.11 Số thành phần cần kiểm tra trong phiên bản Even2 38

5.12 Số thành phần cần kiểm tra trong phiên bản Even3 38

5.13 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Kiểm tra số nguyên tố 39

5.14 Số thành phần cần kiểm tra trong phiên bản Prime1 39

5.15 Số thành phần cần kiểm tra trong phiên bản Prime2 39

5.16 Số thành phần cần kiểm tra trong phiên bản Prime3 39

5.17 Số thành phần cần kiểm tra trong phiên bản Prime4 40

5.18 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Tính giai thừa 40

5.19 Số thành phần cần kiểm tra trong phiên bản Fact1 40

5.20 Số thành phần cần kiểm tra trong phiên bản Fact2 41

5.21 Số thành phần cần kiểm tra trong phiên bản Fact3 41

5.22 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Tính tổng các số chẵn 42

5.23 Số thành phần cần kiểm tra trong phiên bản SumE1 42

5.24 Số thành phần cần kiểm tra trong phiên bản SumE2 42

5.25 Số thành phần cần kiểm tra trong phiên bản SumE3 42

5.26 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Tìm số lớn hơn 43

5.27 Số thành phần cần kiểm tra trong phiên bản Lar1 43

viii

Trang 12

Danh mục bảng ix

5.28 Số thành phần cần kiểm tra trong phiên bản Lar2 43

5.29 Số thành phần cần kiểm tra trong phiên bản Lar3 43

5.30 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Kiểm tra hai số bằng nhau 44

5.31 Số thành phần cần kiểm tra trong phiên bản Eq1 44

5.32 Số thành phần cần kiểm tra trong phiên bản Eq2 44

5.33 Số thành phần cần kiểm tra trong phiên bản Eq3 45

5.34 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Tìm số nghiệm của phương trình bậc hai 45

5.35 Số thành phần cần kiểm tra trong phiên bản Root1 46

5.36 Số thành phần cần kiểm tra trong phiên bản Root2 46

5.37 Số thành phần cần kiểm tra trong phiên bản Root3 46

5.38 Số thành phần cần kiểm tra trong phiên bản Root4 46

5.39 Số thành phần cần kiểm tra trong phiên bản Root5 46

5.40 Thời gian sinh ra bộ mẫu thử đối với các phiên bản chương trình Kiểm tra tam giác đều 47

5.41 Số thành phần cần kiểm tra trong phiên bản Tri1 47

5.42 Số thành phần cần kiểm tra trong phiên bản Tri2 47

5.43 Số thành phần cần kiểm tra trong phiên bản Tri3 48

5.44 Số thành phần cần kiểm tra trong phiên bản Tri4 48

Trang 13

Để đảm bảo chất lượng của phần mềm, thường phần mềm sẽ phải trải qua một quátrình gọi là kiểm thử phần mềm (software testing) trước khi đưa ra thị trường Việckiểm thử phần mềm diễn ra ở nhiều mức độ khác nhau như:

• Kiểm thử đơn vị (unit testing): Là việc kiểm thử ở mức thấp nhất, được tiến hànhtrên các hàm chức năng của phần mềm, để xem hàm đó có thực hiện đúng đặc tảyêu cầu hay không

• Kiểm thử module (module testing): Là việc kiểm thử xem các dịch vụ của module

có phù hợp với đặc tả của module đó không

• Kiểm thử tích hợp (integration testing): Là việc kiểm thử xem từng phân hệ củaphần mềm có đảm bảo với đặc tả thiết kế của phân hệ đó không

• Kiểm thử hệ thống (system testing): Là việc kiểm thử các yêu cầu không chức năngcủa phần mềm như hiệu suất, bảo mật, làm việc trong môi trường căng thẳng,

• Kiểm thử độ chấp nhận của người dùng (acceptance testing): Là việc kiểm tra xemngười dùng có chấp thuận sử dụng phần mềm không

1

Trang 14

Chương 1 Giới thiệu 2

Quy trình kiểm thử phần mềm truyền thống được thực hiện một cách thủ công Ở

đó, các nhân viên kiểm thử phải tạo ra các mẫu thử (testcase) cho phần mềm Mỗi mẫuthử bao gồm dữ liệu đầu vào (input ) và giá trị đầu ra mong đợi (expected output ) Nếukhi nhận dữ liệu đầu vào, giá trị đầu ra của phần mềm giống như giá trị mong đợi thìphần mềm xem như đã được hiện thực đúng Ngược lại nghĩa là quá trình hiện thựcphần mềm đã có sai sót Để đảm bảo kiểm tra hết chức năng cần thiết của phần mềm,

bộ mẫu thử (testsuite) thường rất lớn và phức tạp

Như vậy ta thấy quy trình kiểm thử phần mềm muốn đạt được chất lượng tốt thìphải tốn nhiều thời gian và công sức Thực tế cho thấy riêng việc kiểm thử phần mềmchiếm đến hơn 50% thời gian và công sức trong quy trình phát triển phần mềm [2] Đểgiảm bớt sự vất vả trong công việc này, nhiều công trình nghiên cứu đã được tiến hànhnhằm giúp việc kiểm thử phần mềm có thể được tiến hành một cách tự động

Trong các lĩnh vực nghiên cứu để trợ giúp quá trình kiểm thử phần mềm, lĩnh vựcthu hút nhiều sự quan tâm nhất và đạt được nhiều kết quả nhất là lĩnh vực sinh mẫuthử tự động (automated testcase generation) Một hệ thống sinh mẫu thử tự động cókhả năng dựa vào đặc tả chức năng của đối tượng cần được kiểm thử (hàm chức năng,module, ) hoặc dựa vào cấu trúc bên trong của đối tượng để tạo ra các dữ liệu đầuvào một cách tự động Bộ dữ liệu đầu vào này phải thỏa mãn những yêu cầu được xácđịnh trước Sau đó việc kiểm thử sẽ được tiến hành dựa trên tập dữ liệu đầu vào này.Bên cạnh việc tạo dữ liệu cho việc kiểm thử, một trong những vấn đề lớn khác trongphát triển phần mềm là sửa phần mềm khi có lỗi xảy ra Để có thể sửa lỗi phần mềm,việc trước tiên là xác định vị trí những câu lệnh bị lỗi trong mã nguồn của chương trình.Phương pháp truyền thống để xác định vị trí của những câu lệnh này là quan sát trạngthái của chương trình qua từng câu lệnh trong quá trình thực thi các mẫu thử sai Đểlàm được như vậy, lập trình viên thường chèn vào các câu lệnh giúp in ra giá trị các biếncủa chương trình trong quá trình thực thi Những giá trị này giúp thể hiện trạng tháicủa chương trình Đến một thời điểm nào đó, nếu trạng thái của chương trình khác vớimong đợi thì có khả năng chương trình đã bị lỗi ở vị trí đó

Như ta thấy, đây cũng là một quá trình tốn rất nhiều thời gian và công sức Cónhiều khó khăn khác nhau trong quá trình quan sát đường thực thi của một chươngtrình như đường thực thi quá dài, số biến của chương trình quá lớn, các biến quá phứctạp, Ngày nay, mặc dù các môi trường phát triển tích hợp (Integrated DevelopmentEnviroment – IDE ) đã hỗ trợ nhiều công cụ sửa lỗi như tạo các điểm dừng, thực thichương trình theo từng câu lệnh, hiển thị giá trị của các biến trong quá trình thực thi, [3–5] thì việc sửa lỗi phần mềm vẫn còn rất phức tạp Do vậy, ngay cả các lập trìnhviên có kinh nghiệm cũng thường rất vất vả trong việc thực hiện nhiệm vụ này

Trang 15

Chương 1 Giới thiệu 3

Để giảm bớt những vất vả đó, lĩnh vực nghiên cứu các kỹ thuật khoanh vùng lỗi(fault localization) cũng nhận được rất nhiều sự chú ý Mục đích của kỹ thuật này làdựa vào thông tin của việc thực thi bộ mẫu thử để đưa ra nhận định về vị trí lỗi trongchương trình Thông tin mà các kỹ thuật khoanh vùng lỗi đưa ra có thể là một bảngxếp hạng khả năng gây ra lỗi của các thành phần trong chương trình từ cao đến thấp,cũng có thể là tập hợp các thành phần bị nghi ngờ là gây ra lỗi, tùy theo kỹ thuật được

sử dụng

Như vậy, ta thấy cả hai lĩnh vực sinh mẫu thử tự động và khoanh vùng lỗi đều lànhững lĩnh vực nghiên cứu quan trọng, trợ giúp rất nhiều cho việc phát triển phần mềm.Đáng tiếc, cho đến lúc này, theo hiểu biết của chúng tôi, hai lĩnh vực này chủ yếu vẫntồn tại và phát triển độc lập Chẳng hạn, các nghiên cứu trong lĩnh vực khoanh vùnglỗi luôn giả định sự tồn tại trước của một bộ mẫu thử mà không quan tâm bộ mẫu thửnày được sinh ra như thế nào Tương tự, các phương pháp sinh mẫu thử tự động thườngtạo ra các bộ mẫu thử tuân theo tiêu chí riêng của mình mà không quan tâm bộ mẫuthử được sinh ra có phù hợp với quá trình khoanh vùng lỗi trong phần mềm hay không

Sự thiếu sót này đã tạo động lực để chúng tôi tiến hành khảo sát khả năng kết hợp củahai lĩnh vực, nhằm trả lời câu hỏi xem bộ mẫu thử do các kỹ thuật sinh mẫu thử tựđộng tạo ra có thực sự hỗ trợ tốt cho các kỹ thuật khoanh vùng lỗi hay không

1.2 Mục tiêu của đề tài

Như đã trình bày ở trên mục tiêu nghiên cứu của đề tài là khảo sát khả năng kết hợpcủa hai lĩnh vực sinh mẫu thử tự động và khoanh vùng lỗi, hai lĩnh vực đóng vai trò rấtquan trọng trong quá trình phát triển phần mềm và vẫn thường được nghiên cứu độclập, để xem những mẫu thử được sinh ra tự động có thực sự giúp ích cho việc xác địnhlỗi của chương trình cần được kiểm thử hay không

Để thực hiện mục tiêu tổng quát đã đề ra, cần thực hiện từng bước những mục tiêunhỏ như sau:

• Khảo sát các phương pháp sinh mẫu thử tự động

• Khảo sát các phương pháp khoanh vùng lỗi

• Chọn và hiện thực những phương pháp phù hợp với giới hạn của đề tài

• Chọn những chương trình thí nghiệm phù hợp với giới hạn của đề tài

• Kiểm tra khả năng áp dụng những bộ mẫu thử được sinh tự động vào nhữngphương pháp khoanh vùng lỗi trên các chương trình thí nghiệm

Trang 16

Chương 1 Giới thiệu 4

• Đánh giá, báo cáo kết quả

Phương pháp nghiên cứu của đề tài là dựa trên kết quả thí nghiệm Thí nghiệmtrước tiên bao gồm việc chọn ra một số chương trình có lỗi Sau đó lần lượt áp dụngcác phương pháp sinh mẫu thử tự động trên các chương trình này để tạo ra những bộmẫu thử khác nhau Những bộ mẫu thử cùng với kết quả thực thi chúng trên chươngtrình sẽ trở thành đầu vào cho các phương pháp khoanh vùng lỗi Kết quả trả về từcác phương pháp khoanh vùng lỗi sẽ là tiêu chí để đánh giá khả năng kết hợp giữa cácphương pháp Chi tiết về phương pháp hiện thực sẽ được nói rõ ở Chương 4 Kết quảthí nghiệm và đánh giá sẽ được trình bày ở Chương 5

Ngoài mục tiêu chính vừa nêu, dựa trên nhận định các phương pháp khoanh vùnglỗi có tiềm năng lớn trong việc hỗ trợ việc học lập trình của sinh viên nhờ vào khả năngchỉ ra vị trí lỗi sai cụ thể trong mã nguồn nếu có, chúng tôi quyết định đặt thêm nhiệm

vụ tích hợp các phương pháp khoanh vùng lỗi vào một trang web hỗ trợ học lập trìnhsẵn có do nhóm nghiên cứu SAVE thuộc trường Đại học Bách Khoa thành phố Hồ ChíMinh phát triển Nếu thành công, chúng tôi tin các sinh viên sẽ có trong tay một công

cụ tốt để tự rèn luyện khả năng lập trình của mình mà không cần phụ thuộc quá nhiềuvào giảng viên

Bên cạnh những mục tiêu trước mắt là khảo sát khả năng kết hợp của hai lĩnh vựcsinh mẫu thử tự động và khoanh vùng lỗi cũng như nâng cao tính năng của trang webhọc lập trình sẵn có, đề tài này còn đặt ra mục tiêu xa hơn là dựa vào kết quả thí nghiệm

có được, để đề xuất ra được một bộ khung quy trình kiểm thử phần mềm với sự kết hợptốt nhất có thể giữa hai lĩnh vực sinh mẫu thử tự động và khoanh vùng lỗi Đây là mộtmục tiêu rất có ý nghĩa trong ngành công nghiệp phần mềm nhưng sẽ đòi hỏi một thờigian nghiên cứu lâu dài hơn

1.3 Giới hạn của đề tài

Do hạn chế về mặt thời gian, nên phạm vi nghiên cứu của đề tài trước mắt được giớihạn lại như sau:

• Về phương pháp sinh mẫu thử tự động: Các phương pháp sinh mẫu thử tự độngđược khảo sát là các phương pháp áp dụng cho việc kiểm thử dòng điều khiển(control flow testing) của chương trình, và chủ yếu dùng kĩ thuật tìm kiếm theokinh nghiệm (heuristic search) để sinh mẫu thử Bên cạnh đó, kĩ thuật sinh mẫuthử dựa vào tìm kiếm ngẫu nhiên (random search) cũng được khảo sát và xem nhưgiá trị nền để so sánh với các kĩ thuật sinh mẫu thử dựa vào tìm kiếm theo kinh

Trang 17

Chương 1 Giới thiệu 5

nghiệm Chi tiết về các phương pháp sinh mẫu thử tự động sẽ được trình bày ởChương 2

• Về phương pháp khoanh vùng lỗi: Các phương pháp khoanh vùng lỗi được khảosát là các phương pháp dựa trên phổ thực thi (spectrum) của chương trình Nguyêntắc hoạt động của các phương pháp này như sau: Dựa vào kết quả thực thi bộ mẫuthử của chương trình, các phương pháp này sẽ đưa ra kết quả là một bảng xếphạng từ cao đến thấp về khả năng gây ra lỗi của từng thành phần trong chươngtrình Đặc trưng của các phương pháp khoanh vùng lỗi này là chúng chỉ phù hợpvới những chương trình có một lỗi Chương 3 sẽ được dùng để trình bày rõ hơn vềcác phương pháp khoanh vùng lỗi

• Về chương trình thí nghiệm: Những chương trình mẫu được chọn để thí nghiệmchưa phải là những chương trình thực tế trong công nghiệp Thay vào đó, bộ thínghiệm sẽ bao gồm những chương trình có độ phức tạp vừa và nhỏ thể hiện dướidạng hàm chức năng dùng để giải những bài tập quen thuộc trong các khóa học

về lập trình Những chương trình này được hiện thực bằng ngôn ngữ với cú pháp

và ngữ nghĩa tương tự như ngôn ngữ C/C++ Mỗi chương trình sẽ được cố ý chènvào một lỗi Chi tiết về những chương trình thí nghiệm sẽ được đề cập cụ thể trongChương 5

1.4 Đóng góp của đề tài

Đề tài này vừa có ý nghĩa về mặt học thuật, vừa có ý nghĩa về mặt thực tiễn:

• Về mặt học thuật, hai lĩnh vực sinh mẫu thử tự động và khoanh vùng lỗi từ trướcđến nay vẫn thường được nghiên cứu một cách độc lập, vì vậy đề tài này sẽ tạo racầu nối giữa hai lĩnh vực nghiên cứu trên

• Về mặt thực tiễn, do hai lĩnh vực sinh mẫu thử tự động và khoanh vùng lỗi đềuđóng một vai trò lớn trong ngành công nghiệp phần mềm nên việc kết hợp đượchai lĩnh vực này sẽ trợ giúp rất nhiều cho việc phát triển phần mềm

Bên cạnh đó, như mục tiêu đã đặt ra, một phần nội dung của đề tài (các phươngpháp khoanh vùng lỗi) đã được sử dụng để tạo ra một sản phẩm thực tiễn Đó là mộttrang web1 giúp sinh viên có thể rèn luyện khả năng lập trình Trang web được thiết kếbao gồm nhiều bài tập có sẵn Sinh viên có thể chọn bài tập, tiến hành lập trình và nộpbài giải ngay trong giao diện trang web Bài giải sẽ được hệ thống phân tích tự động

1

http://elearning.cse.hcmut.edu.vn/provegroup/index.jsp

Trang 18

Chương 1 Giới thiệu 6

Nếu phát hiện có lỗi sai, hệ thống có thể cung cấp phản ví dụ (counter example) cũngnhư chỉ ra những câu lệnh có khả năng gây ra lỗi trong chương trình Với hệ thống này,sinh viên có thể tự nâng cao khả năng lập trình của mình mà không cần phụ thuộc quánhiều vào sự hướng dẫn của giảng viên Nội dung Chương 6 sẽ dành để nói về trang webvừa nêu

Ngoài ra, trong quá trình thực hiện đề tài, chúng tôi đã công bố được hai bài báokhoa học Bài đầu tiên đã được báo cáo trong hội nghị International Engineering andTechnology Education Conference (IETEC) lần thứ hai tổ chức tại thành phố Hồ ChíMinh vào tháng 11 năm 2013 Bài thứ hai đã được tạp chí International Journal ofQuality Assurance in Engineering and Technology Education (IJQAETE) chấp nhận và

dự kiến sẽ được xuất bản vào tháng 7 năm 2014 Thông tin trích dẫn của hai bài báonày như sau:

• Long H Pham, Nam P Mai, Mai H Dinh, Tho T Quan, Hung Q Ngo, (2013),Assisting Students in Finding Their Own Bugs in Programming Exercises usingVerification and Group Testing Techniques, In Proceedings of the 2nd Interna-tional Engineering and Technology Education Conference (IETEC’13), Ho ChiMinh City, Vietnam

• Long H PHAM, Giang V TRINH, Mai H DINH, Nam P MAI, Tho T QUANand Hung Q NGO (2014), Assisting Students in Finding Bugs and Their Loca-tions in Programming Solutions, In International Journal of Quality Assurance inEngineering and Technology Education (IJQAETE), IGI Global (accepted)

1.5 Công việc liên quan

Các phương pháp khoanh vùng lỗi khi hoạt động luôn giả định sự tồn tại của một bộmẫu thử có sẵn mà không quan tâm đến bộ mẫu thử này được sinh ra như thế nào.Điểm thiếu sót này có thể được khắc phục khi kết hợp với các phương pháp sinh mẫuthử tự động Nhiều tác giả cũng đã nhận ra điều này và đưa ra nhiều nghiên cứu thú

Trang 19

Chương 1 Giới thiệu 7

dựa vào tìm kiếm theo kinh nghiệm, sẽ được đề cập đến trong Chương 3) Phươngpháp hoạt động bằng cách thêm mẫu thử để tăng số lượng khối cơ bản động

• Shay Artzi [7] cùng một số tác giả khác sử dụng giải thuật concolic execution (mộtphương pháp kết hợp giữa symbolic execution và concrete execution) để sinh ranhững bộ mẫu thử với nhiều tiêu chuẩn khác nhau rồi kiểm tra độ hiệu quả củacác phương pháp khoanh vùng lỗi trên các bộ mẫu thử này Những chương trình

mà các tác giả dùng để kiểm tra là các chương trình PHP dùng để tạo ra trang webđộng với hai loại lỗi: lỗi thực thi (execution failure) là lỗi làm cho chương trình bịhỏng hoặc gây ra cảnh báo, lỗi HTML (HTML failure) là lỗi sinh ra những trangweb không theo đúng quy tắc chuẩn của HTML

Như vậy ta thấy đề tài này có thể xem như một sự bổ sung cho những công trìnhnghiên cứu trước đó Trong khi các công trình trước tập trung vào một vài giải thuậtsinh mẫu thử tự động nhất định do tác giả tự nghĩ ra hoặc cải tiến, đề tài này đặt ramục tiêu khảo sát thực nghiệm sự kết hợp của nhiều phương pháp sinh mẫu thử tự động

và nhiều phương pháp khoanh vùng lỗi khác nhau với nhau

1.6 Cấu trúc luận văn

Nội dung các phần còn lại của luận văn được phân bố như sau:

• Chương 2 và Chương 3 sẽ lần lượt trình bày một số vấn đề tổng quát về các kỹthuật sinh mẫu thử tự động và khoanh vùng lỗi Các phương pháp sinh mẫu thử

tự động và khoanh vùng lỗi được chọn để khảo sát cũng sẽ được trình bày rõ Nộidung của hai chương này sẽ giúp người đọc tiếp cận những phần còn lại của luậnvăn một cách dễ dàng hơn

• Nội dung chính của luận văn nằm ở Chương 4 Chương này sẽ dùng để trình bày

về mô hình, chi tiết hiện thực, phương pháp đánh giá mà chúng tôi sử dụng đểgiải quyết bài toán đã được đặt ra

• Chương 5 sẽ được dùng để trình bày về bộ chương trình thí nghiệm và kết quảthí nghiệm Như đã nói ở trên, dữ liệu được sử dụng trong thí nghiệm là nhữngchương trình hiện thực các bài tập thường thấy trong các khóa học về lập trình.Mỗi chương trình được dùng trong thí nghiệm sẽ được cố ý chèn vào một lỗi

• Chương 6 sẽ trình bày một cái nhìn tổng quát về trang web sản phẩm của đề tàibao gồm cấu trúc của trang web, chức năng của từng module chính cũng như cáchthức các module liên kết lại với nhau trong việc phân tích bài giải của sinh viên

Trang 20

Chương 1 Giới thiệu 8

• Trong chương cuối cùng, Chương 7, chúng tôi dùng để tổng kết, nhận xét nội dungbáo cáo, cũng như nêu lên một số hướng mở rộng đề tài có thể được tiến hànhtrong tương lai

Trang 21

Chương 2

Sinh mẫu thử tự động

2.1 Kiểm thử hộp đen và kiểm thử hộp trắng

Như đã trình bày trong Chương 1, kiểm thử phần mềm là một bước quan trọng trongquy trình phát triển phần mềm Trong lĩnh vực kiểm thử phần mềm, các phương phápkiểm thử thường được chia làm hai loại lớn [2]:

• Kiểm thử hộp đen (black box testing): Trong phương pháp kiểm thử hộp đen, kiểmthử viên tiến hành việc xây dựng mẫu thử dựa vào đặc tả về yêu cầu chức năngcủa chương trình (thường được trình bày dưới dạng ngôn ngữ tự nhiên) chứ khôngcần dựa vào mã nguồn của chương trình

• Kiểm thử hộp trắng (white box testing): Ngược lại với kiểm thử hộp đen, trongkiểm thử hộp trắng, kiểm thử viên phải dựa vào mã nguồn của chương trình, nghĩa

là dựa vào việc chương trình đã được viết như thế nào để xây dựng mẫu thử

Do kiểm thử hộp trắng phải dựa vào mã nguồn của chương trình nên thường đòi hỏikiểm thử viên phải có kĩ năng về lập trình để có thể hiểu được chương trình đang đượckiểm thử Điều này ngược lại với kiểm thử hộp đen do trong phương pháp này kiểm thửviên chỉ cần dựa vào đặc tả chức năng của chương trình để xây dựng bộ mẫu thử.Bên cạnh đó, do yêu cầu phải hiểu được mã nguồn chương trình nên việc kiểm thửhộp trắng thường mất nhiều thời gian và công sức hơn so với kiểm thử hộp đen (đốivới cùng cấp độ kiểm thử) Điều này dẫn đến việc kiểm thử hộp trắng thường chỉ thíchhợp cho giai đoạn kiểm thử đơn vị trong quy trình phát triển phần mềm Trong khi đóphương pháp kiểm thử hộp đen có thể áp dụng cho nhiều cấp độ khác nhau, từ kiểmthử đơn vị đến kiểm thử hệ thống Tuy vậy, kiểm thử hộp trắng lại có ưu điểm là việc

9

Trang 22

Chương 2 Sinh mẫu thử tự động 10

kiểm thử được tiến hành kĩ lưỡng hơn và do đó phát hiện được nhiều lỗi hơn so với kiểmthử hộp đen

Các phương pháp kiểm thử hộp trắng lại được chia thành:

• Kiểm thử dòng điều khiển (control flow testing): Là kiểm thử giải thuật chức năngcủa chương trình Phương pháp này dùng để kiểm tra xem chương trình có thựcthi đúng chức năng được đưa ra trong bản đặc tả chương trình hay không

• Kiểm thử dòng dữ liệu (data flow testing): Là kiểm thử đời sống của từng biến dữliệu được dùng trong chương trình Phương pháp này được dùng để kiểm tra xem

có lỗi trong quá trình sử dụng biến của chương trình hay không Các lỗi thườnggặp bao gồm: truy xuất biến chưa được khởi tạo, khai báo biến nhưng không sửdụng,

Do mục tiêu của đề tài này muốn khảo sát khả năng kết hợp các giải thuật sinh mẫuthử tự động với các kĩ thuật khoanh vùng lỗi và thực tế là các giải thuật sinh mẫu thử

tự động tập trung nhiều vào việc kiểm thử dòng điều khiển trong kiểm thử hộp trắngnên phần tiếp theo sẽ trình bày chi tiết về nội dung này

2.2 Kiểm thử dòng điều khiển

Trong kiểm thử dòng điều khiển có một số khái niệm như sau:

• Đồ thị dòng điều khiển (control flow graph): Là một đồ thị có hướng dùng để biểudiễn trực quan cấu trúc của chương trình Đồ thị dòng điều khiển bao gồm tậphợp các nút, mỗi nút biểu diễn cho một thành phần và một tập hợp các cạnh nốigiữa các nút với nhau, hai nút được nối với nhau nếu như trong chương trình ta

có thể chuyển trực tiếp giữa hai thành phần tương ứng

• Đường thực thi (execution path): Là danh sách có thứ tự các lệnh được thi hànhứng với một lần chạy cụ thể của đơn vị phần mềm, bắt đầu từ điểm nhập đếnđiểm kết thúc của đơn vị phần mềm Thường mục tiêu lý tưởng trong việc kiểmthử dòng điều khiển là có thể sinh ra bộ mẫu thử đi qua tất cả các đường thựcthi của chương trình Đáng tiếc trong thực tế, chỉ một chương trình nhỏ cũng cóthể có số lượng đường thực thi rất lớn nên việc sinh ra bộ mẫu thử lý tưởng nhưvậy là không thể thực hiện được Đó là chưa kể có khả năng đường thực thi quádài gây khó khăn cho việc kiểm thử

Trang 23

Chương 2 Sinh mẫu thử tự động 11

• Phủ kiểm thử (coverage): Do không thể sinh ra một bộ mẫu thử lý tưởng nên kháiniệm phủ kiểm thử được đưa ra để đánh giá chất lượng của một bộ mẫu thử Phủkiểm thử là tỉ lệ các thành phần thực sự được kiểm thử so với tổng thể sau khi đãthực thi hết các mẫu thử Phủ kiểm thử bao gồm nhiều mức độ khác nhau Thôngthường, phủ kiểm thử càng lớn thì độ tin cậy càng cao

Các mức độ của phủ kiểm thử bao gồm:

• Mức 0 : Bộ mẫu thử được tạo ra để kiểm thử những gì có thể kiểm thử được,những lỗi còn lại sẽ được phát hiện khi người dùng sử dụng chương trình và báolại Theo như định nghĩa thì không cần kiểm thử gì cả cũng xem như đạt đượcphủ kiểm thử mức 0 Vì vậy thật ra đây chỉ là mức đưa ra như một cận dưới củakhái niệm phủ kiểm thử

• Mức 1 : Bộ mẫu thử dùng trong quá trình kiểm thử phải bảo đảm sao cho mỗi câulệnh của chương trình được thực thi ít nhất một lần Vì vậy phủ kiểm thử mức 1còn được gọi là phủ câu lệnh (statement coverage)

• Mức 2 : Bộ mẫu thử dùng trong quá trình kiểm thử phải bảo đảm sao cho mỗiđiểm quyết định luận lý trong chương trình được thực thi ít nhất một lần chomỗi trường hợp TRUE và FALSE Điều này tương đương với việc mỗi nhánh củachương trình đều được kiểm thử nên phủ kiểm thử mức 2 còn được gọi là phủ cácnhánh (branch coverage) Một bộ mẫu thử đạt phủ kiểm thử mức 2 thì cũng đạtphủ kiểm thử mức 1

• Mức 3 : Bộ mẫu thử dùng trong quá trình kiểm thử phải bảo đảm sao cho mỗi điềukiện con trong từng điểm quyết định luận lý trong chương trình đều được thực thi

ít nhất một lần cho mỗi trường hợp TRUE và FALSE Vì yêu cầu này nên phủkiểm thử mức 3 còn được gọi là phủ các điều kiện con (subcondition coverage).Chú ý là phủ kiểm thử mức 3 và mức 2 không so sánh được với nhau, nghĩa là tồntại bộ mẫu thử đạt phủ kiểm thử mức 2 nhưng không đạt phủ kiểm thử mức 3 vàngược lại

• Mức 4 : Bộ mẫu thử dùng trong quá trình kiểm thử phải bảo đảm mỗi điều kiệncon trong từng điểm quyết định luận lý trong chương trình được thực thi ít nhấtmột lần cho mỗi trường hợp TRUE và FALSE và bản thân mỗi điểm quyết địnhluận lý cũng được thực hiện ít nhất một lần cho mỗi trường hợp TRUE và FALSE.Phủ kiểm thử mức 4 còn được gọi là phủ các nhánh và các điều kiện con (branchand subcondition coverage) Tất nhiên một bộ mẫu thử đạt phủ kiểm thử mức 4thì cũng đạt phủ kiểm thử mức 2 và mức 3

Trang 24

Chương 2 Sinh mẫu thử tự động 12

Ví dụ 2.1 Xét một chương trình như sau (để đơn giản, giả sử chương trình không cóshort circuit):

2.3 Sinh mẫu thử bằng phương pháp tìm kiếm

Các kĩ thuật sinh mẫu thử tự động thường hỗ trợ cho việc kiểm thử dòng điều khiểntrong kiểm thử hộp trắng Trong số các kĩ thuật đó, các kĩ thuật dựa trên phương pháptìm kiếm thường được áp dụng rộng rãi nhất Để có thể áp dụng phương pháp tìm kiếmvào việc sinh mẫu thử tự động, trước hết cần đáp ứng hai yêu cầu:

• Thiết kế không gian tìm kiếm (search space) bao gồm các giải pháp cho vấn đềcần giải quyết Không gian tìm kiếm phải được thiết kế sao cho việc chuyển từ giảipháp này sang giải pháp khác có thể thực hiện được một cách dễ dàng và hợp lí.Trong bài toán sinh mẫu thử tự động, không gian tìm kiếm chính là tập hợp tất

cả các mẫu thử có thể sinh ra và giải pháp ở đây chính là từng mẫu thử đơn lẻ

Trang 25

Chương 2 Sinh mẫu thử tự động 13

• Phải có một hàm lượng giá (objective function) để so sánh độ tốt của giải phápnày với giải pháp khác trong quá trình tìm kiếm Thông thường, hàm lượng giá sẽnhận đầu vào là giải pháp cần lượng giá và trả về kết quả là một con số phản ánh

độ tốt của giải pháp ứng với bài toán đang được xét đến

Nguyên tắc của việc dùng kĩ thuật tìm kiếm để sinh mẫu thử tự động được thựchiện qua các bước như sau [8]:

• Bước 1 : Xây dựng đồ thị dòng điều khiển của chương trình Dựa vào đồ thị dòngđiều khiển vừa được xây dựng, ta có thể liệt kê tất cả đường thực thi của chươngtrình

• Bước 2 : Chọn trên đồ thị này một đường thực thi theo tiêu chí độ bao phủ đượcđưa ra

• Bước 3 : Tìm kiếm trong không gian các mẫu thử để chọn ra mẫu thử phù hợp vớiđường thực thi được chọn Để đánh giá mức độ phù hợp của mẫu thử đang xét đốivới đường thực thi được chọn, ta cần sử dụng hàm lượng giá Ở đây, hàm lượnggiá sẽ được xây dựng dựa trên việc mẫu thử được xét có tạo ra được đường thựcthi này hay không và nếu có sai lệch thì sự sai lệch là bao nhiêu

• Bước 4 : Tiếp tục quay lại bước 2 và chọn một đường thực thi khác cho đến khi cóđược bộ mẫu thử thỏa mãn tiêu chí độ bao phủ được đề ra

2.4 Các kỹ thuật tìm kiếm

Khâu quan trọng trong kĩ thuật sinh mẫu thử tự động là tìm kiếm trong không gianmẫu thử để chọn ra mẫu thử phù hợp Các kĩ thuật tìm kiếm mẫu thử trong không gianmẫu thử được khảo sát trong luận văn này bao gồm [9]:

• Tìm kiếm ngẫu nhiên (random search)

• Tìm kiếm bằng giải thuật leo đồi đơn giản (simple hill climbing search)

• Tìm kiếm bằng giải thuật leo đồi dốc nhất (steepest hill climbing search)

• Tìm kiếm bằng giải thuật tôi luyện mô phỏng (simulated annealing search)

• Tìm kiếm bằng giải thuật di truyền (genetic algorithm search)

Trang 26

Chương 2 Sinh mẫu thử tự động 14

Trong giải thuật này, các mẫu thử được sinh ra một cách ngẫu nhiên với hi vọng sẽ chọnđược mẫu thử đáp ứng được yêu cầu đề ra Giải thuật tìm kiếm ngẫu nhiên có ưu điểm

là rất dễ hiện thực Hơn nữa, trong trường hợp mẫu thử cần sinh ra không quá phứctạp, giải thuật này có thể cho kết quả rất nhanh Tuy vậy, giải thuật tìm kiếm ngẫunhiên lại khó sinh ra được những mẫu thử đáp ứng điều kiện phức tạp Sở dĩ có hiệntượng này là do giải thuật tìm kiếm ngẫu nhiên không sử dụng thông tin về mẫu thửhiện có để định hướng cho việc sinh ra mẫu thử mới Điều này trái với các giải thuậtthuộc nhóm tìm kiếm theo kinh nghiệm như các giải thuật được trình bày dưới đây

Giải thuật bắt đầu bằng việc sinh ra một mẫu thử ngẫu nhiên và xem mẫu thử này nhưđiểm bắt đầu Từ mẫu thử này, lần lượt sinh ra và lượng giá các mẫu thử lân cận Nếutrong các mẫu thử lân cận này có một mẫu thử tốt hơn mẫu thử hiện có ứng với giátrị của hàm lượng giá, mẫu thử hiện có sẽ được cập nhật lại bằng mẫu thử tốt hơn này.Quy trình này được lặp lại cho đến khi mẫu thử hiện có đáp ứng được yêu cầu đề rahoặc tất cả các mẫu thử lân cận với mẫu thử hiện có đều không tốt hơn nó

Giải thuật bắt đầu bằng việc sinh ra một mẫu thử ngẫu nhiên và xem mẫu thử này nhưđiểm bắt đầu Từ mẫu thử này, sinh ra và lượng giá tất cả các mẫu thử lân cận Trongtất cả mẫu thử lân cận này, chọn ra mẫu thử tốt nhất ứng với giá trị của hàm lượnggiá Nếu mẫu thử tốt nhất này tốt hơn mẫu thử hiện có, mẫu thử hiện có sẽ được cậpnhật lại bằng mẫu thử tốt nhất này Quy trình này được lặp lại cho đến khi mẫu thửhiện có đáp ứng được yêu cầu đề ra hoặc tất cả các mẫu thử lân cận với mẫu thử hiện

có đều không tốt hơn nó

Các giải thuật leo đồi có ưu điểm là dễ hiện thực và thời gian thực thi nhanh Giảipháp được cải tiến dần dần qua từng bước giống như việc đang leo lên một ngọn đồi.Tuy vậy, trong nhiều trường hợp độ hiệu quả của giải thuật lại không cao Giải thuật cókhả năng dừng khi gặp phải đỉnh đồi cục bộ hoặc đồng bằng Đỉnh đồi cục bộ là trạngthái giải pháp hiện có là giải pháp tối ưu cục bộ, tất cả các giải pháp lân cận đều có giátrị thấp hơn nó nhưng nó lại không phải giải pháp tối ưu toàn cục Đồng bằng là trườnghợp giải pháp rơi vào một vùng mà tất cả các giải pháp lân cận đều có giá trị bằng nhauứng với hàm lượng giá Khi rơi vào đỉnh đồi cục bộ hay đồng bằng, giải thuật không thểtiếp tục do tất cả các giải pháp lân cận đều không tốt hơn giải pháp hiện có và kết quả

Trang 27

Chương 2 Sinh mẫu thử tự động 15

là giải pháp tối ưu toàn cục không thể đạt được Để giải quyết vấn đề này, thường giảithuật được mở rộng bằng cách tiến hành với nhiều điểm khởi đầu khác nhau

Tương tự như các giải thuật leo đồi nhưng giải thuật tôi luyện mô phỏng cho phép từgiải pháp hiện tại chuyển đến một giải pháp xấu hơn nhằm giảm bớt khả năng giải thuậtdừng khi giải pháp rơi vào trạng thái tối ưu cục bộ Giải thuật bắt đầu bằng việc sinh

ra một mẫu thử ngẫu nhiên và xem mẫu thử này như điểm bắt đầu Từ mẫu thử này,lần lượt sinh ra và lượng giá các mẫu thử lân cận Nếu trong các mẫu thử lân cận này

có một mẫu thử tốt hơn mẫu thử hiện có ứng với giá trị của hàm lượng giá, mẫu thửhiện có sẽ được cập nhật lại bằng mẫu thử tốt hơn này Nếu trong các mẫu thử lân cậnnày có một mẫu thử xấu hơn mẫu thử hiện có thì mẫu thử hiện có sẽ được cập nhật lạibằng mẫu thử này với một xác suất p nào đó Quy trình này được lặp lại cho đến khimẫu thử hiện có đáp ứng được yêu cầu đề ra hoặc không thể cập nhật tiếp cho mẫu thửhiện có

Trong giải thuật, giá trị của p được tính bằng công thức:

p = e−δt

với δ là chênh lệch giá trị lượng giá giữa mẫu thử hiện có và mẫu thử mới, còn t là mộtgiá trị điều khiển gọi là nhiệt độ Khởi đầu giải thuật, giá trị của t khá lớn, biểu thị khảnăng di chuyển tự do của giải thuật trong không gian tìm kiếm Theo thời gian, giá trịcủa t sẽ giảm dần khi những giải pháp tốt bắt đầu đạt được Tuy nhiên, cần lưu ý nếugiá trị của t giảm quá nhanh, giải thuật sẽ không khai thác hết không gian tìm kiếm và

có khả năng giải pháp đạt được cũng chỉ là một giải pháp tối ưu cục bộ như các giảithuật leo đồi Tên và ý tưởng của giải thuật bắt nguồn từ quá trình luyện kim, trong đócác kim loại được nung nóng chảy rồi làm lạnh cho trở về thể rắn ban đầu Các quansát cho thấy cấu trúc của kim loại thay đổi tương ứng với tốc độ làm lạnh

Không giống các giải thuật trên chỉ lưu giữ một mẫu thử hiện có, giải thuật di truyềnlưu giữ một tập các mẫu thử Ban đầu, tập mẫu thử này được sinh ra một cách ngẫunhiên Giá trị của từng mẫu thử trong tập mẫu thử ứng với hàm lượng giá cũng đượctính Những mẫu thử có giá trị tốt nhất sẽ được chọn làm mẫu thử bố mẹ Các mẫu thử

bố mẹ này được dùng để lai tạo sinh ra các mẫu thử mới thuộc thế hệ tiếp theo Tậpmẫu thử lúc này được cập nhật gồm các mẫu thử bố mẹ và các mẫu thử mới sinh ra

Trang 28

Chương 2 Sinh mẫu thử tự động 16

Do có bước lai tạo này nên thường các mẫu thử được biểu diễn bằng một chuỗi bit vàviệc lai tạo giữa hai mẫu thử được tiến hành bằng cách hoán đổi một số bit cho nhau

Để có thể khai thác tốt không gian lời giải, một phương pháp khác được tiến hành

để làm phong phú các mẫu thử, đó là phương pháp tạo đột biến Trong phương phápnày, các mẫu thử tự thay đổi một số bit của mình để tạo ra mẫu thử mới Quá trình nàylặp lại cho đến khi chọn được mẫu thử thỏa tiêu chí Khi áp dụng giải thuật di truyềncần chú ý trong việc chọn mẫu thử bố mẹ, vì nếu liên tục chọn những mẫu thử có giá trịlượng giá tốt sẽ dần dẫn đến sự thống trị của những mẫu thử này trong các thế hệ, từ

đó ảnh hưởng đến việc khai thác không gian lời giải Không khó để nhận ra giải thuậtnày có cách hoạt động tương tự như cơ chế di truyền trong sinh học

• Phương pháp ngẫu nhiên sẽ tiếp tục sinh ngẫu nhiên một mẫu thử tiếp theo màkhông sử dụng thêm thông tin nào từ mẫu thử n = −1 hiện có

• Phương pháp leo đồi đơn giản sẽ xét mẫu thử lân cận với mẫu thử n = −1 Mẫuthử đầu tiên được xét là mẫu thử n = −2 không tốt hơn so với n = −1 Mẫu thửtiếp theo là n = 0 Mẫu thử này tốt hơn so với n = −1 do đi qua nhiều thành

Trang 29

Chương 2 Sinh mẫu thử tự động 17

phần của đường thực thi yêu cầu hơn nên sẽ được cập nhật là mẫu thử hiện hành.Tiếp theo khi n = 1 được xét đây là mẫu thử thỏa yêu cầu

• Phương pháp leo đồi dốc nhất cũng sẽ xét mẫu thử lân cận với mẫu thử n = −1nhưng không cập nhật mẫu thử hiện hành ngay khi tìm được mẫu thử tốt hơn

mà chỉ cập nhật khi đã xét qua hết các mẫu thử lân cận và cập nhật với mẫuthử tốt nhất Trong tất cả các mẫu thử lân cận với n = −1 thì n = 1 là tốt nhấtnên phương pháp leo đồi dốc nhất sẽ cập nhật trực tiếp mẫu thử hiện hành thành

n = 1

• Phương pháp tôi luyện mô phỏng hoạt động tương tự như phương pháp leo đồiđơn giản, nhưng khi đang ở trạng thái n = 0 phương pháp này chấp nhận việcquay lại trạng thái n = −1 với một xác suất nào đó

Riêng phương pháp di truyền sẽ sinh ra một tập các mẫu thử và hoạt động theocách được mô tả ở Mục 2.4.5

2.5 Sinh mẫu thử bằng phương pháp giải ràng buộc

Ngoài việc sinh mẫu thử bằng phương pháp tìm kiếm như vừa nêu, một cách khác cóthể dùng để sinh mẫu thử tự động đó là giải các ràng buộc ứng với đường thực thi củachương trình Nguyên tắc của phương pháp sinh mẫu thử tự động này như sau [10]:

• Bước 1 : Xây dựng đồ thị dòng điều khiển của chương trình Dựa vào đồ thị dòngđiều khiển vừa được xây dựng, ta có thể liệt kê tất cả đường thực thi của chươngtrình

• Bước 2 : Chọn trên đồ thị này một đường thực thi theo tiêu chí độ bao phủ đượcđưa ra

• Bước 3 : Tìm điều kiện ràng buộc ứng với đường thực thi này Đưa điều kiện nàyvào một bộ giải (solver ) ta có thể tìm ra mẫu thử ứng với đường thực thi đượcchọn

• Bước 4 : Tiếp tục quay lại bước 2 và chọn một đường thực thi khác cho đến khi cóđược bộ mẫu thử thỏa mãn tiêu chí độ bao phủ được đề ra

Ví dụ 2.2 Giả sử có chương trình tính trị tuyệt đối của một số nguyên như sau:

Trang 30

Chương 2 Sinh mẫu thử tự động 18

Một phiên bản mở rộng của phương pháp vừa nêu được trình bày trong [13] Ở đây,điều kiện ràng buộc của chương trình cần kiểm thử được kết hợp với điều kiện ràngbuộc của chương trình đã được kiểm thử trước đó nhằm cải tiến số lượng và chất lượngmẫu thử sinh ra

Ví dụ 2.3 Giả sử chương trình tính trị tuyệt đối của một số nguyên ở trên được sửalại như sau:

Trang 31

Chương 2 Sinh mẫu thử tự động 19

Phụ thuộc vào bộ giải

Bảng 2.1: So sánh ưu, nhược điểm của các phương pháp sinh mẫu thử tự động.

Các phương pháp sinh mẫu thử tự động dựa trên việc tìm kiếm còn có đặc điểm là

có thể sinh ra nhiều mẫu thử khác nhau ứng với cùng một đường thực thi Ở đây, bướcđầu khảo sát, chúng tôi chọn hiện thực các phương pháp sinh mẫu thử dựa trên việctìm kiếm Việc so sánh với các phương pháp sinh mẫu thử dựa trên việc giải các ràngbuộc có thể được tiến hành trong tương lai

Trang 32

Chương 3

Khoanh vùng lỗi

Khoanh vùng lỗi là phương pháp giúp xác định thành phần gây ra lỗi trong chươngtrình một cách tự động dựa vào thông tin của việc thực thi bộ mẫu thử (mẫu thử đi quanhững thành phần nào trong chương trình, có lỗi hay không) Hiện nay các phương phápkhoanh vùng lỗi được chia làm ba loại: dựa trên mô hình (model-based ) [14, 15], dựa trênchứng minh (proof-based ) [16–18] và thông dụng nhất là dựa trên phổ (spectrum-based )[19–24]

3.1 Khoanh vùng lỗi dựa trên mô hình

Các phương pháp khoanh vùng lỗi dựa trên mô hình bắt đầu từ thông tin của các mẫuthử xây dựng một mô hình gồm các ràng buộc rồi giải mô hình đó Để cung cấp mộtcái nhìn khái quát về phương pháp này chúng ta xem xét ví dụ sau [15]:

Ví dụ 3.1 Cho một chương trình có ba thành phần được kí hiệu S0, S1 và S2.Chương trình được tiến hành kiểm thử với bộ gồm năm mẫu thử Thông tin về đườngthực thi của từng mẫu thử qua các thành phần của chương trình cùng với kết quả kiểmthử được thể hiện qua bảng sau:

Trang 33

Chương 3 Khoanh vùng lỗi 21

Ý nghĩa của bảng trên được hiểu như sau:

• Ở các cột S∗, giá trị 1 nghĩa là mẫu thử đi qua thành phần S∗, giá trị 0 nghĩa làmẫu thử không đi qua thành phần S∗

• Ở cột Output, giá trị 1 nghĩa là chương trình có lỗi với mẫu thử đó, giá trị 0 nghĩa

là chương trình thực thi đúng với mẫu thử đó

Phương pháp khoanh vùng lỗi dựa trên mô hình sẽ dựa vào các mẫu thử khiến chươngtrình bị lỗi trong bảng trên và xây dựng thành các ràng buộc:

−S0|−S2 (nghĩa là S0 và/hoặc S2 có lỗi)

−S1|−S2 (nghĩa là S1 và/hoặc S2 có lỗi)

−S0 (nghĩa là S0 có lỗi)

−S1 (nghĩa là S1 có lỗi)

Giải hệ các ràng buộc trên sẽ giúp tìm ra các thành phần nghi ngờ lỗi Kết quả trả vềđược thể hiện dưới dạng các tập hợp, chẳng hạn khi giải hệ bốn ràng buộc trên ta có kếtquả {{S0, S1}} (nguyên tắc là các tập hợp trả về chứa ít thành phần của chương trìnhnhất có thể mà vẫn thỏa mãn được các ràng buộc)

Trong ví dụ đơn giản trên chỉ có một tập hợp được trả về, trong trường hợp kết quảbao gồm nhiều tập hợp khác nhau, các tập hợp này sẽ được đánh giá dựa vào nhữngquy tắc xác suất để tìm mức độ phù hợp của chúng với kết quả thực thi bộ mẫu thử

Từ đó, các tập hợp sẽ được xếp hạng từ cao đến thấp

3.2 Khoanh vùng lỗi dựa trên chứng minh

Phương pháp khoanh vùng lỗi dựa trên chứng minh không sử dụng thông tin từ tất cảmẫu thử mà chỉ cần một mẫu thử sai nào đó trong bộ mẫu thử Phương pháp này bắtđầu bằng việc xây dựng một công thức mô tả quá trình thực thi của chương trình vớimột mẫu thử sai nào đó Công thức này có dạng chuẩn giao (conjunctive normal form),bao gồm ba thành phần: phần tiền điều kiện (precondition), phần mô tả đường thực thicủa mẫu thử qua chương trình và phần hậu điều kiện (postcondition)

Ý nghĩa của từng thành phần như sau:

• Phần tiền điều kiện: mô tả điều kiện ban đầu của mẫu thử đang được xét, thểhiện qua những ràng buộc đối với các biến giá trị đầu vào

Trang 34

Chương 3 Khoanh vùng lỗi 22

• Phần mô tả đường thực thi của mẫu thử qua chương trình: mô tả các bước chuyểntrạng thái của chương trình tương ứng với mẫu thử đang được xét, thể hiện quaviệc biến đổi giá trị các biến ứng với từng câu lệnh khác nhau trên đường thực thi

• Phần hậu điều kiện: mô tả giá trị đầu ra mong đợi của chương trình đối với mẫuthử đang được xét, thể hiện thông qua các ràng buộc đối với các biến khi kết thúcchương trình

Do mẫu thử đang xét làm cho chương trình chạy sai nên ba thành phần trên sẽ tạothành một công thức bất thỏa mãn (insatisfiable formula) Sau khi xây dựng được côngthức, việc tiếp theo là tìm xem những thành phần nào trong công thức khi loại bỏ hoặcthay đổi có thể làm cho công thức trở thành khả thỏa mãn (satisfiable) Các câu lệnhtương ứng với những thành phần này có khả năng là câu lệnh lỗi

Có hai phương pháp dùng để tìm những thành phần cần loại bỏ hoặc thay đổi này:

• Trong [16], các tác giả sử dụng một phương pháp goi là MAT-SAT Phương phápnày sẽ tìm trong công thức các thành phần có thể tồn tại cùng nhau mà vẫn làmcông thức là khả thỏa mãn với số lượng thành phần nhiều nhất có thể Phần cònlại của công thức là những thành phần có thể bỏ đi hoặc thay đổi để làm côngthức trở thành khả thỏa mãn Chú ý không phải thành phần nào trong công thứccũng có thể là thành phần bỏ đi hoặc thay đổi Chẳng hạn, những thành phần ứngvới mô tả tiền điều kiện và hậu điều kiện được đánh dấu là luôn phải được giữ lại

• Trong [17, 18], các tác giả tiến hành tìm trên phần mô tả đường thực thi của mẫuthử những công thức phụ trợ gọi là error invariant ứng với quá trình thực thi từngcâu lệnh của mẫu thử Các công thức error invariant có hai đặc điểm quan trọng.Thứ nhất là với một error invariant Ii ứng với câu lệnh thứ i công thức bao gồmtiền điều kiện và phần mô tả đường thực thi của những câu lệnh từ đầu cho đến i

có thể suy ra Ii, và thứ hai Ii giao với công thức bao gồm phần mô tả đường thựcthi sau câu lệnh i và hậu điều kiện sẽ tạo thành một công thức bất thỏa mãn Nóicách khác, error invariant như một cách tóm tắt trạng thái khiến cho chương trìnhchạy sai ứng với mỗi điểm trên đường thực thi Những thành phần giữa hai errorinvariant giống nhau được xem như an toàn Ngược lại, những thành phần nằmgiữa hai error invariant khác nhau là những thành phần cần loại bỏ hoặc thay đổi

3.3 Khoanh vùng lỗi dựa trên phổ

Khác với hai loại trên, giá trị đầu ra của các phương pháp khoanh vùng lỗi dựa trênphổ không phải tập hợp các thành phần được cho là gây ra lỗi mà là một bảng xếp hạng

Trang 35

Chương 3 Khoanh vùng lỗi 23

khả năng gây ra lỗi của các thành phần trong chương trình từ cao đến thấp Với giá trịđầu ra như vậy, các phương pháp khoanh vùng lỗi dựa trên phổ thích hợp cho trườnghợp chương trình có một lỗi

Các phương pháp khoanh vùng lỗi dựa trên phổ có ưu điểm là đơn giản, dễ hiệnthực, thời gian thực thi nhanh Độ đa dạng của các phương pháp khoanh vùng lỗi loạinày cũng cao hơn so với các phương pháp dựa trên mô hình và dựa trên chứng minh.Các phương pháp phổ biến được giới thiệu như dưới đây

Hợp tập hợp (set union) [19]: Trong số các mẫu thử được dùng để kiểm tra chươngtrình, chọn ra một mẫu thử mà chương trình chạy sai, lấy các thành phần nằm trênmẫu thử sai này trừ đi hợp các thành phần nằm trên tất cả các mẫu thử đúng

Einit= Ef − [

p∈P

Ep

Ý nghĩa của các kí hiệu trong công thức trên như sau:

• Ef: tập hợp các thành phần nằm trên mẫu thử sai

Einit Thành phần càng gần với các thành phần trong Einit thì được xem như càng cókhả năng gây ra lỗi, thành phần nào càng xa với các thành phần trong Einit thì đượcxem như càng ít có khả năng gây ra lỗi

Giao tập hợp (set intersection) [19]: Tương tự như phương pháp hợp tập hợp, nhưng

ở đây cách tính Einit là lấy giao các thành phần nằm trên tất cả các mẫu thử đúng trừ

đi các thành phần nằm trên mẫu thử sai được chọn

Einit= \

p∈P

Ep− Ef

Trang 36

Chương 3 Khoanh vùng lỗi 24

Láng giềng gần nhất (nearest neighbor ) [19]: Gần giống với hợp tập hợp, nhưng trướctiên chọn trong số các mẫu thử đúng một mẫu thử có các thành phần gần giống với cácthành phần của mẫu thử sai nhất rồi mới tiến hành trừ Tác giả đề xuất hai cách để

đo độ giống nhau là khoảng cách nhị phân (binary distancing) và khoảng cách hoán vị(permutation distancing)

Giống như phương pháp hợp tập hợp, cả hai phương pháp giao tập hợp và láng giềnggần nhất sau khi có Einit, giải thuật SDG-ranking được thực hiện để xếp hạng khả nănggây ra lỗi cho các thành phần còn lại

Kiểm thử nhóm (group testing) [20, 21]: Các phương pháp khoanh vùng lỗi dựa trênphổ vừa nêu đều không sử dụng hết thông tin về việc thực thi bộ mẫu thử của chươngtrình Kiểm thử nhóm là phương pháp khoanh vùng lỗi dựa trên phổ giúp khai thác hết

bộ mẫu thử này Trong phương pháp kiểm thử nhóm, một ma trận nhị phân (binarymatrix ) được xây dựng để mô tả các đường thực thi có thể có của chương trình Matrận này có đặc điểm như sau:

• Các cột của ma trận ứng với các thành phần của chương trình

• Các hàng của ma trận ứng với các đường thực thi của chương trình Hàng i, cột

j có giá trị 1 nếu và chỉ nếu đường thực thi thứ i đi qua thành phần j, ngược lại

nó có giá trị 0

Một vector nhị phân được dùng để thể hiện kết quả thực thi bộ mẫu thử ứng vớichương trình, trong đó vị trí i của vector này có giá trị 1 nếu có ít nhất một mẫu thửứng với hàng i trong ma trận là mẫu thử sai, ngược lại vị trí i sẽ có giá trị 0 Nhữnghàng của ma trận không có một mẫu thử nào tương ứng sẽ bị loại bỏ Sau khi có matrận và vector, vector sẽ được dùng để so sánh với từng cột trong ma trận, cột nào trùngvới vector thì thành phần ứng với cột đó xem như có khả năng lỗi cao nhất Các thànhphần còn lại xem như có khả năng gây lỗi như nhau

Ví dụ 3.2 Giả sử có chương trình như sau, các câu lệnh và biểu thức thể hiện dướidạng trừu tượng S0, S1 và S2

Trang 37

Chương 3 Khoanh vùng lỗi 25

Ma trận ứng với chương trình trên là:

S0 S1 S2

Giả sử sau khi thực thi chương trình trên với bộ mẫu thử ta có được vector [1 1], khi

đó thành phần S0 sẽ được xem như có khả năng gây lỗi cao nhất Trường hợp vector là[1 0] hay [0 1] thành phần S1 hay S2 sẽ được xem như có khả năng gây lỗi cao nhất

Tarantula [22], Ochiai [23] và Jaccard [24]: Ta thấy, các phương pháp khoanh vùnglỗi dựa trên phổ nêu trên cũng còn khá phức tạp Không giống những phương pháptrên, các phương pháp Tarantula, Ochiai và Jaccard xếp hạng khả năng gây ra lỗi củacác thành phần bằng các công thức toán học Các công thức này mô tả mối liên hệ giữacác thành phần của chương trình với các mẫu thử Nhiệm vụ của chúng là gán cho mỗithành phần trong chương trình một số thực có giá trị từ 0 đến 1 gọi là điểm nghi ngờ(suspicious score) Điểm nghi ngờ của một thành phần càng cao thì khả năng thànhphần đó là thành phần lỗi càng lớn Các công thức tuy khác nhau về chi tiết nhưng bêntrong đều có một ý tưởng chung Ý tưởng của các công thức này là thành phần nào càngxuất hiện nhiều trong các mẫu thử sai thì thành phần đó càng có khả năng là thànhphần lỗi cần tìm

Ba công thức Tarantula, Ochiai và Jaccard được trình bày như dưới đây:

Ngày đăng: 01/02/2021, 00:12

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