## Tổng quan nghiên cứu

Trong bối cảnh phát triển phần mềm hiện đại, kiểm thử đơn vị đóng vai trò thiết yếu trong việc đảm bảo chất lượng sản phẩm, đặc biệt với các phần mềm nhúng sử dụng ngôn ngữ C/C++. Theo ước tính, 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 trong các dự án công nghiệp lớn. Vấn đề đặt ra là làm thế nào để tự động hóa kiểm thử đơn vị nhằm giảm thiểu chi phí và tăng hiệu quả kiểm thử. Luận văn tập trung nghiên cứu phương pháp phân tích mã nguồn và sinh dữ liệu kiểm thử tự động cho các dự án C/C++ nhằm giải quyết các hạn chế của kỹ thuật kiểm thử tự động định hướng hiện nay, như sinh dữ liệu kiểm thử đầu tiên chưa hiệu quả và số lượng bộ dữ liệu kiểm thử lớn nhưng chưa đạt độ phủ tối đa.

Mục tiêu nghiên cứu là đề xuất một phương pháp sinh dữ liệu kiểm thử đầu tiên dựa trên phân tích mã nguồn thay vì sinh ngẫu nhiên, đồng thời phát triển thuật toán LDFS để giảm thiểu số lượng bộ dữ liệu kiểm thử trong khi vẫn đảm bảo độ phủ cao. Phạm vi nghiên cứu tập trung vào các dự án phần mềm C/C++ trong môi trường phát triển tại Việt Nam, với thời gian thực hiện từ năm 2015 đến 2017. Ý nghĩa của nghiên cứu được thể hiện qua việc nâng cao hiệu quả kiểm thử đơn vị, giảm chi phí phát triển phần mềm và tăng độ tin cậy của sản phẩm phần mềm.

## Cơ sở lý thuyết và phương pháp nghiên cứu

### Khung lý thuyết áp dụng

Luận văn dựa trên các lý thuyết và mô hình sau:

- **Kỹ thuật kiểm thử tự động định hướng (Concolic Testing):** Kết hợp giữa thực thi chương trình với phân tích biểu thức điều kiện để sinh dữ liệu kiểm thử tối ưu, giúp đạt độ phủ cao.
- **Đồ thị dòng điều khiển (Control Flow Graph - CFG):** Biểu diễn cấu trúc điều khiển của hàm, dùng để xác định các đường thi hành và tính độ phủ.
- **Kỹ thuật thực thi tượng trưng (Symbolic Execution):** Biểu diễn các đường thi hành dưới dạng hệ ràng buộc logic, sử dụng SMT-Solver để tìm nghiệm thỏa mãn.
- **Độ phủ kiểm thử (Coverage Criteria):** Bao gồm độ phủ câu lệnh, độ phủ nhánh và độ phủ điều kiện con (MC/DC), là thước đo chất lượng bộ dữ liệu kiểm thử.
- **Mô hình bộ nhớ trong thực thi tượng trưng:** Mô phỏng trạng thái biến kiểu cơ bản, con trỏ, mảng và kiểu dẫn xuất trong quá trình phân tích.

### Phương pháp nghiên cứu

Nguồn dữ liệu chính là các dự án phần mềm C/C++ thực tế được thu thập từ các kho mã nguồn mở và các dự án nội bộ. Cỡ mẫu gồm hơn 20 hàm kiểm thử với độ phức tạp khác nhau, bao gồm các hàm có vòng lặp, đệ quy và xử lý con trỏ.

Phương pháp phân tích sử dụng kỹ thuật phân tích mã nguồn tĩnh kết hợp với kỹ thuật kiểm thử động định hướng. Thuật toán LDFS được phát triển để sinh dữ liệu kiểm thử dựa trên việc xây dựng cây cấu trúc dự án, chèn câu lệnh đánh dấu, xây dựng đồ thị dòng điều khiển, xếp hạng đường thi hành và giải hệ ràng buộc bằng SMT-Solver Z3. Quá trình thực thi dữ liệu kiểm thử được tối ưu hóa bằng kỹ thuật đơn giản hóa hệ ràng buộc và tạo bộ thực thi dữ liệu kiểm thử tổng quát.

Timeline nghiên cứu kéo dài trong 2 năm, từ 2015 đến 2017, bao gồm các giai đoạn: khảo sát và tổng quan lý thuyết, phát triển phương pháp và công cụ, thực nghiệm và đánh giá, hoàn thiện luận văn.

## Kết quả nghiên cứu và thảo luận

### Những phát hiện chính

1. **Hiệu quả sinh dữ liệu kiểm thử đầu tiên:** Phương pháp sinh dữ liệu kiểm thử đầu tiên dựa trên phân tích mã nguồn giúp giảm thời gian sinh dữ liệu không gây lỗi, so với phương pháp sinh ngẫu nhiên truyền thống. Thời gian sinh dữ liệu đầu tiên giảm khoảng 30-40% trong các trường hợp có biến con trỏ.

2. **Giảm số lượng bộ dữ liệu kiểm thử:** Thuật toán LDFS sinh ra số lượng bộ dữ liệu kiểm thử ít hơn đáng kể so với các công cụ hiện có như KLEE, PathCrawler, CAUT và CREST, trong khi vẫn đạt độ phủ 100%. Ví dụ, trong hàm uninit_var, CFT4Cpp sinh 5 bộ dữ liệu kiểm thử, trong khi KLEE sinh 27 và PathCrawler hơn 20.

3. **Độ phủ kiểm thử cao:** Công cụ CFT4Cpp đạt độ phủ nhánh và câu lệnh 100% trên tất cả các hàm kiểm thử, vượt trội hơn so với PathCrawler và tương đương hoặc tốt hơn CREST, CAUT.

4. **Tối ưu thời gian biên dịch và thực thi:** Kỹ thuật tạo bộ thực thi dữ liệu kiểm thử tổng quát giúp giảm số lần biên dịch từ n lần xuống còn 1 lần, rút ngắn thời gian thực thi tổng thể khoảng 50% so với phương pháp truyền thống.

### Thảo luận kết quả

Nguyên nhân chính của hiệu quả trên là do phương pháp đề xuất tận dụng phân tích mã nguồn sâu sắc để sinh dữ liệu kiểm thử đầu tiên hợp lệ, tránh lỗi do con trỏ NULL gây ra. Thuật toán LDFS ưu tiên sinh dữ liệu kiểm thử với số lần lặp vòng lặp nhỏ nhất trước, giúp giảm độ phức tạp và số lượng bộ dữ liệu cần thiết.

So với các nghiên cứu trước, phương pháp này khắc phục được hạn chế của kỹ thuật kiểm thử tự động định hướng truyền thống, vốn sinh dữ liệu đầu tiên ngẫu nhiên và dễ gây lỗi, dẫn đến thất bại trong sinh dữ liệu kiểm thử. Kết quả thực nghiệm cho thấy CFT4Cpp có tính thực tiễn cao, phù hợp với các dự án C/C++ công nghiệp.

Dữ liệu có thể được trình bày qua bảng so sánh số lượng bộ dữ liệu kiểm thử và độ phủ giữa các công cụ, cũng như biểu đồ thời gian sinh dữ liệu kiểm thử và thực thi, giúp minh họa rõ ràng hiệu quả của phương pháp.

## Đề xuất và khuyến nghị

1. **Áp dụng phương pháp sinh dữ liệu kiểm thử đầu tiên dựa trên phân tích mã nguồn:** Giúp giảm thiểu lỗi do dữ liệu kiểm thử không hợp lệ, nâng cao hiệu quả kiểm thử. Thời gian thực hiện: ngay trong giai đoạn phát triển phần mềm. Chủ thể thực hiện: nhóm phát triển và kiểm thử phần mềm.

2. **Triển khai thuật toán LDFS trong quy trình kiểm thử tự động:** Giảm số lượng bộ dữ liệu kiểm thử cần thiết mà vẫn đảm bảo độ phủ tối đa, tiết kiệm chi phí và thời gian. Thời gian thực hiện: trong vòng 6 tháng sau khi hoàn thiện công cụ. Chủ thể thực hiện: đội ngũ kiểm thử và quản lý dự án.

3. **Tối ưu hóa quy trình biên dịch và thực thi dữ liệu kiểm thử:** Sử dụng bộ thực thi dữ liệu kiểm thử tổng quát để giảm thời gian biên dịch, tăng tốc độ kiểm thử. Thời gian thực hiện: song song với phát triển công cụ. Chủ thể thực hiện: nhóm phát triển công cụ kiểm thử.

4. **Đào tạo và nâng cao nhận thức về kỹ thuật kiểm thử tự động định hướng:** Giúp các kỹ sư phần mềm hiểu và áp dụng hiệu quả phương pháp mới. Thời gian thực hiện: liên tục trong quá trình phát triển và bảo trì phần mềm. Chủ thể thực hiện: bộ phận đào tạo và phát triển nhân sự.

## Đối tượng nên tham khảo luận văn

1. **Nhà phát triển phần mềm C/C++:** Nắm bắt phương pháp sinh dữ liệu kiểm thử tự động giúp cải thiện chất lượng mã nguồn và giảm thiểu lỗi trong quá trình phát triển.

2. **Kỹ sư kiểm thử phần mềm:** Áp dụng kỹ thuật kiểm thử tự động định hướng và thuật toán LDFS để tối ưu hóa quy trình kiểm thử, tiết kiệm thời gian và chi phí.

3. **Quản lý dự án phần mềm:** Hiểu rõ về chi phí và hiệu quả của các kỹ thuật kiểm thử để đưa ra quyết định đầu tư hợp lý cho công tác đảm bảo chất lượng.

4. **Nhà nghiên cứu và sinh viên ngành Công nghệ thông tin:** Tham khảo phương pháp và kết quả nghiên cứu để phát triển các giải pháp kiểm thử phần mềm tiên tiến hơn trong tương lai.

## Câu hỏi thường gặp

1. **Phương pháp sinh dữ liệu kiểm thử đầu tiên dựa trên phân tích mã nguồn có ưu điểm gì?**  
Phương pháp này giúp sinh dữ liệu kiểm thử hợp lệ ngay từ đầu, tránh lỗi do con trỏ NULL hoặc dữ liệu không phù hợp, giảm thời gian sinh dữ liệu và tăng hiệu quả kiểm thử.

2. **Thuật toán LDFS khác gì so với các kỹ thuật kiểm thử tự động định hướng truyền thống?**  
LDFS ưu tiên sinh dữ liệu kiểm thử với số lần lặp vòng lặp nhỏ nhất trước, giảm số lượng bộ dữ liệu kiểm thử cần thiết mà vẫn đảm bảo độ phủ tối đa, giúp tiết kiệm chi phí và thời gian.

3. **Công cụ CFT4Cpp có thể áp dụng cho những dự án nào?**  
CFT4Cpp phù hợp với các dự án phần mềm C/C++ có quy mô từ nhỏ đến lớn, đặc biệt là các phần mềm nhúng và các dự án yêu cầu kiểm thử đơn vị nghiêm ngặt.

4. **Làm thế nào để tối ưu thời gian biên dịch và thực thi dữ liệu kiểm thử?**  
Sử dụng bộ thực thi dữ liệu kiểm thử tổng quát cho mọi loại giá trị đầu vào, giảm số lần biên dịch từ n lần xuống còn 1 lần, giúp tăng tốc độ kiểm thử tổng thể.

5. **Độ phủ kiểm thử nào được ưu tiên trong nghiên cứu này?**  
Độ phủ nhánh và câu lệnh được ưu tiên do đảm bảo chất lượng phần mềm tốt với chi phí hợp lý, trong khi độ phủ điều kiện con (MC/DC) có chi phí cao hơn và ít được áp dụng trong thực tế.

## Kết luận

- Đề xuất phương pháp sinh dữ liệu kiểm thử đầu tiên dựa trên phân tích mã nguồn giúp nâng cao hiệu quả kiểm thử và giảm lỗi do dữ liệu không hợp lệ.  
- Thuật toán LDFS giảm đáng kể số lượng bộ dữ liệu kiểm thử cần thiết trong khi vẫn đảm bảo độ phủ tối đa.  
- Công cụ CFT4Cpp chứng minh tính thực tiễn và hiệu quả vượt trội so với các công cụ kiểm thử tự động hiện có.  
- Kỹ thuật tối ưu hóa biên dịch và thực thi dữ liệu kiểm thử giúp tiết kiệm thời gian và chi phí kiểm thử.  
- Hướng phát triển tiếp theo là mở rộng hỗ trợ cho các ngôn ngữ lập trình khác và tích hợp sâu hơn với quy trình phát triển phần mềm hiện đại.

**Khuyến nghị:** Các tổ chức phát triển phần mềm nên áp dụng phương pháp và công cụ này để nâng cao chất lượng sản phẩm và tối ưu chi phí kiểm thử. Để biết thêm chi tiết và triển khai, liên hệ nhóm nghiên cứu hoặc truy cập tài liệu hướng dẫn sử dụng công cụ CFT4Cpp.