I. Giới thiệu
Kiểm thử đơn vị là một trong những pha quan trọng nhất để đảm bảo chất lượng của phần mềm, đặc biệt là các phần mềm nhúng. Hai phương pháp phổ biến là kiểm thử hộp đen và kiểm thử hộp trắng. Kiểm thử hộp đen chỉ kiểm tra tính đúng đắn của đầu ra với đầu vào cho trước mà không quan tâm đến mã nguồn chương trình. Ngược lại, kiểm thử hộp trắng đánh giá chất lượng mã nguồn bằng cách sử dụng các kĩ thuật phân tích mã nguồn. Tuy nhiên, chi phí kiểm thử hộp trắng lớn hơn rất nhiều so với kiểm thử hộp đen. Đặc biệt, trong các dự án công nghiệp, chi phí kiểm thử hộp trắng có thể chiếm hơn 50% tổng chi phí phát triển phần mềm. Nguyên nhân là do số lượng hàm cần kiểm thử lên tới hàng nghìn, thậm chí hàng chục nghìn hàm. Kết quả là chi phí để kiểm thử hết những hàm này khá lớn, ảnh hưởng đến tốc độ phát triển dự án. Do đó, quá trình kiểm thử hộp trắng cần được tự động hóa để giải quyết bài toán về chi phí.
1.1. Tầm quan trọng của kiểm thử tự động
Kiểm thử tự động giúp giảm thiểu chi phí và thời gian kiểm thử. Nó cho phép phát hiện lỗi sớm trong quy trình phát triển phần mềm. Việc áp dụng kĩ thuật kiểm thử tự động định hướng đã chứng minh tính hiệu quả trong việc sinh dữ liệu kiểm thử. Tuy nhiên, các vấn đề còn tồn tại cần giải quyết, như việc sinh dữ liệu kiểm thử đầu tiên chưa đủ tốt và sinh tập dữ liệu kiểm thử có số lượng nhỏ nhưng đạt độ phủ cao.
II. Tổng quan kĩ thuật kiểm thử tự động định hướng
Mục tiêu của chương này là cung cấp nền tảng lý thuyết trong sinh dữ liệu kiểm thử tự động, bao gồm khái niệm dữ liệu kiểm thử và độ phủ, đồ thị dòng điều khiển, cây cú pháp trừu tượng, và tổng quan về kĩ thuật kiểm thử tự động định hướng. Dữ liệu kiểm thử là những bộ giá trị được sinh từ chương trình mà không sử dụng giá trị đầu ra mong muốn. Độ phủ là một thước đo quan trọng để đánh giá chất lượng mã nguồn. Các loại độ phủ phổ biến trong sinh dữ liệu kiểm thử đơn vị gồm phủ nhánh, phủ câu lệnh, và độ phủ điều kiện con. Độ phủ càng lớn đồng nghĩa với chất lượng bộ dữ liệu kiểm thử càng cao.
2.1. Đồ thị dòng điều khiển
Đồ thị dòng điều khiển (Control Flow Graph - CFG) là một công cụ quan trọng trong việc phân tích mã nguồn. Nó giúp xác định các nhánh và đường đi trong mã nguồn, từ đó hỗ trợ sinh dữ liệu kiểm thử hiệu quả hơn. Việc xây dựng CFG cho phép lập trình viên hiểu rõ hơn về cách thức hoạt động của chương trình, từ đó phát hiện các vấn đề tiềm ẩn mà có thể không được phát hiện qua các phương pháp kiểm thử khác.
III. Phương pháp kiểm thử tự động dự án C C
Phương pháp đề xuất trong luận văn này tập trung vào việc sinh dữ liệu kiểm thử cho các dự án C/C++. Quy trình này bao gồm nhiều bước, từ việc phân tích mã nguồn, xây dựng đồ thị dòng điều khiển, đến việc sinh dữ liệu kiểm thử. Đặc biệt, việc sử dụng kĩ thuật thực thi tượng trưng và SMT-Solver giúp tìm bộ giá trị thỏa mãn đường thi hành. Quá trình này lặp đi lặp lại cho đến khi đạt được độ phủ tối đa hoặc đạt đến giới hạn thời gian cho trước. Phương pháp này không chỉ giúp giảm thiểu số lượng bộ dữ liệu kiểm thử mà còn đảm bảo độ phủ cao.
3.1. Quy trình sinh dữ liệu kiểm thử
Quy trình sinh dữ liệu kiểm thử bắt đầu bằng việc phân tích mã nguồn để xây dựng đồ thị dòng điều khiển. Sau đó, tập các đường thi hành có thể có trên đồ thị này được thu thập bằng cách áp dụng thuật toán duyệt đồ thị theo chiều sâu. Tập dữ liệu kiểm thử này được sắp xếp theo thứ tự ưu tiên, ví dụ như đường ngắn nhất có độ ưu tiên cao nhất. Với từng đường thi hành được sắp xếp, kĩ thuật thực thi tượng trưng và SMT-Solver được áp dụng để tìm bộ giá trị thỏa mãn đường thi hành đó.
IV. Công cụ và thực nghiệm
Công cụ kiểm thử tự động CFT4Cpp được xây dựng dựa trên phương pháp đề xuất. Công cụ này sử dụng các thư viện hỗ trợ như Z3 cho việc giải hệ ràng buộc và CDT cho phân tích mã nguồn. Kết quả thực nghiệm cho thấy công cụ CFT4Cpp có khả năng sinh dữ liệu kiểm thử hiệu quả, so sánh với các công cụ khác như KLEE, PathCrawler, CAUT, và CREST. Kết quả nghiên cứu đã được đăng trong hai hội nghị NICS 2016 và SoICT 2017 với đánh giá khả quan về tính thực tiễn của phương pháp đề xuất.
4.1. Kết quả thực nghiệm
Kết quả thực nghiệm cho thấy số lượng bộ dữ liệu kiểm thử và độ phủ đạt được với công cụ CFT4Cpp cao hơn so với các công cụ khác. Việc so sánh thời gian biên dịch và thực thi dữ liệu kiểm thử cũng cho thấy công cụ này có hiệu suất tốt hơn. Điều này chứng tỏ rằng phương pháp đề xuất không chỉ hiệu quả trong việc sinh dữ liệu kiểm thử mà còn tối ưu hóa quy trình kiểm thử tự động.
V. Kết luận
Luận văn đã trình bày một phương pháp kiểm thử tự động cho các dự án C/C++ với mục tiêu sinh dữ liệu kiểm thử đạt độ phủ tối đa. Các vấn đề tồn tại trong kĩ thuật kiểm thử tự động định hướng đã được phân tích và giải quyết. Kết quả thực nghiệm cho thấy tính hiệu quả của phương pháp đề xuất, mở ra hướng đi mới cho việc kiểm thử tự động trong các dự án phần mềm. Tương lai, cần tiếp tục nghiên cứu và cải tiến để nâng cao hơn nữa hiệu quả của phương pháp này.