16
Đầu vào của bài toán là một tiêu chí phủ kiểm thử và một đơn vị chương trình Java chứa các biến số nguyên, số thực và biến mảng. Đầu ra là tập dữ liệu cho tập các ca kiểm thử thỏa mãn tiêu chí phủ kiểm thử nêu trên. Tư tưởng của phương pháp nghiên cứu được mô tả khái quát ở hình 3.1.
Đầu tiên, mã nguồn được phân tích để sinh CFG tương ứng với tiêu chí phủ kiểm thử cho trước. Sau đó, chúng tôi xây dựng tập đường đi độc lập từ CFG nêu trên. Tiếp theo, quá trình phân tích tập đường đi độc lập để sinh tập đường kiểm thử thỏa mãn tiêu chí phủ kiểm thử được tiến hành. Ngoài ra, để kiểm thử tính đúng đắn của vòng lặp, các đường kiểm thử mới được xây dựng bằng cách phân tích các đường kiểm thử chứa vòng lặp. Tiếp theo, các đường kiểm thử được phân tích sử dụng kỹ thuật SE để sinh ra hệ ràng buộc. Mỗi hệ ràng buộc được giải bằng cách sử dụng kỹ thuật sinh ngẫu nhiên hoặc sử dụng công cụ SMT-Solver. Nếu sử dụng công cụ SMT-Solver, các hệ ràng buộc sẽ được chuyển đổi về dạng chuẩn SMT-Lib. Sau khi có được tập ca kiểm thử và tập dữ liệu, quá trình thực thi ca kiểm thử được tiến hành để lấy giá trị trả về của mã nguồn (nếu có) và đảm bảo ca kiểm thử thực thi không lỗi.
3.2.Xây dựng đồ thị dòng điều khiển từ mã nguồn
Chi tiết thuật toán sinh đồ thị dòng điều khiển của hàm Java thỏa mãn một tiêu chuẩn phủ kiểm thử cho trước được trình bày ở hình 3.2. Đầu vào thuật toán gồm hàm Java được lưu trong biến f và tiêu chí phủ kiểm thử lưu trong biến t. Đầu ra thuật toán là đồ thị dòng điều khiển(CFG) lưu trong biến graph. Đầu vào cùng một hàm Java, CFG ứng với tiêu chí phủ câu lệnh và phủ nhánh giống nhau và đơn giản hơn so với tiêu chí phủ điều kiện con.
Bước đầu tiên thuật toán, ta gán CFG chính là hàm đầu vào f. Ta sẽ kiểm tra xem
CFG có thỏa mãn độ phủ t hay không. Nếu CFG chưa thỏa mãn độ phủ t, ta tiến hành phân tách f thành một tập các khối mã nguồn con và lưu trong biến B. Tiếp theo, ta xây dựng đồ thị G(V,A) thỏa mãn mỗi đỉnh đồ thị G(trong tập đỉnh V) lưu một khối mã nguồn con, các cạnh mô tả thứ tự thực hiện của các khối mã nguồn con trongf (được lưu trong tập các cạnh A). Sau đó, đỉnh của graph lưu f được thay thế thành đồ thị G. Nếu đồ thị G tồn tại các đỉnh lưu câu lệnh break, continue và return thì con trỏ mà các đỉnh này trỏ tới đỉnh khác sẽ trỏ lại đến đúng đỉnh khác trong graph. Cuối cùng, những khối mã nguồn con còn khả năng phân tích tiếp ra các khối mã nguồn con khác, hàm đệ quy được gọi.
Một khối mã nguồn con không cần phân tích tiếp chỉ khi đã thỏa mãn tiêu chuẩn phủ kiểm thử. Cụ thể, với tiêu chuẩn phủ câu lệnh và phủ nhánh, các đỉnh trong CFG lưu câu lệnh đơn và điều kiện trong các khối lệnh điều khiển. Tuy nhiên, điều kiện của khối lệnh điều khiển có thể do một điều kiện hoặc nhiều điều kiện đơn hợp thành. Nếu phân tách tiếp các điều kiện khối lệnh điều khiển thành đồ thị mà các đỉnh là điều kiện
17
đơn và các cạnh là nhánh true/false thì sinh ra CFG thỏa mãn tiêu chuẩn phủ điều kiện con.
Begin
f: hàm đầu vào - Java
t: độ phủ (0 hoặc 1) Khởi tạo CFG:=f CFG thỏa mãn độ phủ t Chọn B:= {M1, M2, …, Mn} mà Mi có thể chia nhỏ được (1≤ i ≤ n) False Chia nhỏ B End True Cập nhật CFG