Chương 1. Giới thiệu 3 dụng mã nguồn mở. Bears bao gồm 251 lỗi được thu thập thủ công từ các ứng dụng mã nguồn mở với mục đích phục vụ cho các công cụ APR. • Luận văn cài đặt và công bố miễn phí công cụ kèm theo LyFix4 , bao gồm: – Đề xuất và cài đặt công thức xác định vị trí gây lỗi phù hợp cho đối tượng là lỗi hồi quy – Cài đặt lại tám mẫu sửa lỗi dựa trên tư tưởng sửa lỗi hồi quy cho chương trình C ở [42] – Đề xuất và cài đặt ba mẫu sửa lỗi hồi quy mới cho Java (mở rộng dựa trên [36] và học từ bộ dữ liệu 51 lỗi quy đã thu thập) – Đề xuất và cài đặt thuật toán cải tiến từ thuật toán sửa lỗi của [42] để sinh được nhiều bản vá hơn và các bản vá có chất lượng tốt hơn • Luận văn tiến hành thực nghiệm đánh giá khả năng sửa lỗi của LyFix so với jRelifix (là công cụ sửa lỗi phiên bản Java mà luận văn đã cài đặt lại giống với phương pháp sửa lỗi đề xuất trong [42]), jGenProg, jMutRepair và TBar trên tập dữ liệu 51 lỗi hồi quy.
Đây là những lỗi hồi quy thực tế từ những hệ thống phần mềm mã nguồn mở được phát triển và kiểm thử tốt.3 Bố cục luận văn Các phần còn lại của luận văn được cấu trúc như sau. Chương 2 cung cấp các kiến thức nền tảng về tính chất của lỗi hồi quy và sửa lỗi tự động. Chương 3 mô tả phương pháp sửa lỗi đề xuất, bao gồm các bước: xác định bản cập nhật gây ra lỗi, thu thập thông tin mã nguồn nguồn thay đổi và nguyên liệu sửa lỗi, xác định vị trí gây ra lỗi, các mẫu sửa lỗi và thuật toán sửa lỗi. Chương 4 mô tả về kiến trúc và cài đặt công cụ, các kết quả thực nghiệm đánh giá về khả năng sửa lỗi hồi quy của phương pháp đề xuất được tiến hành và bàn luận.
Cuối cùng, Chương 5 kết luận lại toàn bộ công việc luận văn đã thực hiện, kèm theo các công việc tiếp theo có thể thực hiện để cải tiến và mở rộng công cụ.com/bqcuong/lyfix download by : skknchat@gmail.com 4 Chương 2 Kiến thức nền tảng Chương này cung cấp các kiến thức nền tảng cho luận văn. Đầu tiên, kiến thức kiểm thử hồi quy sẽ được giới thiệu một cách tổng quan. Tiếp theo, kiến thức về sửa lỗi chương trình tự động sẽ được trình bày, bao gồm: tổng quan, xác định vị trí gây ra lỗi, và các phương pháp sửa lỗi tự động phổ biến hiện nay.1 Kiểm thử hồi quy và lỗi hồi quy Các hệ thống phần mềm thay đổi không ngừng theo thời gian. Khi có một thay đổi mới được thêm vào mã nguồn, thay đổi này có thể phá hỏng các chức năng khác của chương trình mà trước đó hoạt động bình thường.
Kiểm thử hồi quy (regression testing) là một kỹ thuật được sử dụng để phát hiện các lỗi khi chương trình thay đổi. Kiểm thử hồi quy có thể áp dụng ở tất các mức kiểm thử: đơn vị, tích hợp, hệ thống, và chấp nhận [16]. Lỗi được phát hiện nhờ vào kiểm thử hồi quy gọi là lỗi hồi quy. Lỗi hồi quy được chia thành ba loại1 : • Local: Thay đổi mới gây ra lỗi, làm các chức năng tồn tại từ trước không hoạt động đúng như mong muốn nữa.
Cách sửa là khôi phục lại phần mã nguồn gây ra lỗi này.com/regression-testing/types.asp download by : skknchat@gmail.com Chương 2. Kiến thức nền tảng 5 • Unmasking: Thay đổi mới khiến luồng thực thi chương trình đi vào những câu lệnh gây ra những lỗi đã có từ trước. Cách sửa là thêm hoặc cập nhật lại các câu lệnh điều kiện để giúp luồng thực thi chương trình không còn đi vào các câu lệnh gây lỗi nữa. • Remote: Những thay đổi mới tạo ra các lỗi ở những phần mã nguồn khác trong chương trình.
Để sửa những lỗi này, ta buộc phải cập nhật lại mã nguồn ở những vị trí có lỗi cho phù hợp với thay đổi hoặc ta cần phải tạo ra các câu lệnh điều kiện để luồng thực thi chương trình không đi vào những câu lệnh gây lỗi đối với một số trạng thái nhất định. Kiến thức về thông tin, tính chất của các loại lỗi hồi quy sẽ giúp luận văn này phát triển kỹ thuật xác định vị trí lỗi, lựa chọn được các nguyên liệu sửa lỗi phù hợp, và thiết kế được các mẫu sửa lỗi tốt hơn. Kiến thức về các kỹ thuật kiểm thử hồi quy giúp luận văn thiết kế thuật toán, lựa chọn bộ ca kiểm thử rút gọn để tiết kiệm thời gian thẩm định bản vá.1: Các chiến lược kiểm thử hồi quy Hình 2.1 mô tả các chiến lược phổ biến được sử dụng để thực hiện kiểm thử hồi quy hiện nay. Trong thực tế, người ta chỉ thực thi một phần của bộ ca kiểm thử để thực hiện kiểm thử hồi quy.
Thử thách lớn nhất là cần thực thi lựa chọn đúng những ca kiểm thử có thể giúp đánh giá tốt nhất cho những phần mã nguồn thay đổi. Thực thi lại toàn bộ ca kiểm thử (Retest All) chỉ khả thi cho những dự án nhỏ. Trong những dự án có quy mô lớn, việc thực thi lại toàn bộ ca kiểm thử hầu như là download by : skknchat@gmail.com Chương 2. Kiến thức nền tảng 6 điều không thể bởi vì nó tốn rất nhiều thời gian và có thể làm chậm quá trình phát hành sản phẩm tới khách hàng.
Giảm thiểu bộ ca kiểm thử (Test Suite Minimization - TSM): Trong những hệ thống phần mềm quy mô lớn, bộ ca kiểm thử cho những hệ thống này thường rất đồ sộ, và luôn được cập nhật thêm mới các ca kiểm thử mỗi khi trải qua một bản phát triển mới. Việc thêm các ca kiểm thử mới có thể khiến những ca kiểm thử khác trở nên dư thừa bởi vì chức năng ca kiểm thử cũ có thể cũng đã được kiểm tra bởi những ca kiểm thử mới. Loại bỏ những ca kiểm thử dư thừa này không làm ảnh hướng tới độ phủ của bộ kiểm thử [41]. Các kỹ thuật TSM nhắm tới mục tiêu xác định và loại bỏ những ca kiểm thử dư thừa này ra khỏi bộ ca kiểm thử.
Một số nghiên cứu đã được đề xuất có kết quả tốt như là [25, 47, 15]. Lựa chọn ca kiểm thử (Test Case Selection): Có tên gọi khác là Regression Test Selection - RTS. Các kỹ thuật RTS giống với các kỹ thuật TSM là đều lựa chọn một tập ca kiểm thử con và chỉ thực hiện kiểm thử hồi quy trên tập đó. Điểm khác biệt chính giữa hai loại kỹ thuật này là RTS lựa chọn ca kiểm thư dựa vào các thay đổi của hệ thống được kiểm thử (System Under Test - SUT) còn TSM thì không.
Các kỹ thuật TSM thường lựa chọn ca kiểm thử dựa vào các chỉ số như độ phủ kiểm thử được đo từ một phiên bản nhất định của SUT. Ngược lại, RTS lựa chọn các ca kiểm thử dựa trên sự liên quan của chúng so với thay đổi giữa hai phiên bản của nguồn của SUT. Có nhiều nghiên cứu tập trung đã vào đề xuất các kỹ thuật RTS [39], [52], [53]. Ưu tiên ca kiểm thử (Test Case Prioritization - TCP): Các kỹ thuật TCP không lựa chọn một tập các ca kiểm thử còn mà tập trung vào việc sắp xếp độ ưu tiên thực thi của các kiểm thử theo một thứ tự dựa vào một số tiêu chí nào đó để có thể tìm được lỗi nhanh nhất.
Điều này giúp cho các kiểm thử viên có thể tối đa tỷ lệ có thể tìm được lỗi sớm của bộ kiểm thử. Các kỹ thuật TCP có thể chia làm ba nhóm chính dựa trên các mức điều khiển, câu lệnh, và hàm của chương trình [38]. Một số nghiên cứu đề xuất các kỹ thuật TCP là [26], [22], [23]. download by : skknchat@gmail.com Chương 2.
Kiến thức nền tảng 7 2.2 Sửa lỗi chương trình tự động Sửa lỗi chương trình là một trong các bước của công việc gỡ lỗi chương trình cũng như vòng đời của lỗi chương trình, bao gồm: Nhận diện lỗi - Nhận diện sự tồn tại của lỗi trong chương trình, quan sát các dấu hiện của lỗi để phục vụ cho các bước sau; Xác định vị trí gây ra lỗi - Thường là bước khó nhất, mục tiêu là để xác định xem phần nào của chương trình gây ra lỗi, cụ thể nhất là ở dòng nào; Sửa lỗi - Xác định cách giải quyết lỗi như thế nào, sau đó đề xuất bản vá và thẩm định lại bản vá.2: Các bước tiêu chuẩn trong các kỹ thuật APR hiện nay [27] Sửa lỗi chương trình tự động nhắm tới mục đích tự động hóa quá trình gỡ lỗi, giảm nhu cầu về sự can thiệp của con người trong công việc này. Các kỹ thuật APR hiện tại thường gồm ba bước chính để thực hiện nhiệm vụ sửa lỗi một hoàn chỉnh như mô tả ở Hình 2.2: Xác định vị trí gây ra lỗi → Sinh và đề xuất bản vá → Thẩm định bản vá. Tương tự ở quá trình gỡ lỗi tự nhiên của con người, mô-đun xác định vị trí gây lỗi ở APR cũng nhằm mục đích xác định các phần mã nguồn nghi ngờ gây ra lỗi (ở mức dòng, phương thức, hoặc tệp). Mô-đun sinh bản vá sẽ cố gắng sửa lỗi bằng cách tạo ra nhiều bản vá ứng cử viên nhờ việc biến đổi mã nguồn có lỗi theo phương pháp đề xuất (cú pháp, ngữ nghĩa, hướng dữ liệu, v.
Những bản vá ứng cử viên này sẽ được mô-đun thẩm định bản vá kiểm tra xem có thực sự sửa lỗi thành công hay không thông qua việc thực hiện đánh giá chương trình đã được vá lỗi theo một đặc tả cho trước (bộ ca kiểm thử, đặc tả hình thức, v. Kết quả cuối cùng sẽ là một danh sách bản vá lỗi được đề xuất cho người dùng mà có thể sử dụng để sửa lỗi chương trình ban đầu. Từ đầu những năm 2000, đã có rất nhiều nghiên cứu được thực hiện nhằm đề xuất các giải pháp phát hiện lỗi trong phần mềm [3, 6, 40] và xác định vị trí gây ra download by : skknchat@gmail.com Chương 2. Kiến thức nền tảng 8 lỗi [37, 18, 19].
Các nghiên cứu cho việc tự động sửa lỗi xuất hiện theo sau với một số lượng bài báo còn hạn chế. Tuy nhiên, kể từ khi Weimer và cộng sự giới thiệu một phương pháp sửa lỗi mới dựa trên tư tưởng lập trình di truyền [45] vào năm 2009, APR đã phát triển rất mạnh mẽ và trở thành một hướng nghiên cứu hẹp thiết yếu đối với lĩnh vực công nghệ phần mềm.