Tổng quan nghiên cứu

Trong bối cảnh chuyển đổi số giáo dục và triển khai chương trình giáo dục phổ thông mới, môn Tin học tại các trường trung học cơ sở và trung học phổ thông đang chuyển dịch mạnh mẽ từ ngôn ngữ Pascal sang các ngôn ngữ hiện đại như Java và C/C++. Tuy nhiên, theo khảo sát thực tế tại nhiều cơ sở giáo dục, hơn 85% giáo viên vẫn phải chấm bài lập trình của học sinh bằng phương pháp thủ công. Công việc này chiếm từ 10 đến 15 giờ mỗi tuần của mỗi giáo viên, đồng thời tiềm ẩn nhiều sai sót do áp lực thời gian khiến các lỗi giải thuật phức tạp dễ bị bỏ sót, dẫn đến đánh giá thiếu chính xác và chưa đảm bảo tính công bằng.

Vấn đề cốt lõi của việc chấm bài lập trình không chỉ dừng lại ở kiểm tra lỗi cú pháp vốn đã được trình biên dịch xử lý, mà nằm ở việc đánh giá tính đúng đắn của mã nguồn so với đặc tả yêu cầu của bài toán. Luận văn thạc sĩ chuyên ngành Kỹ thuật Phần mềm thực hiện năm 2019 tại Trường Đại học Công nghệ, Đại học Quốc gia Hà Nội đã tập trung giải quyết bài toán cấp thiết này.

Mục tiêu chính của đề tài là nghiên cứu phương pháp tự động sinh dữ liệu kiểm thử từ mã nguồn chuẩn viết bằng ngôn ngữ Java và ứng dụng vào việc xây dựng mô hình hệ thống chấm bài lập trình tự động. Phạm vi nghiên cứu tập trung vào các cấu trúc điều khiển cơ bản trong chương trình giảng dạy phổ thông, thử nghiệm thực tế trên các bài tập của học sinh khối 11 tại Trường Trung học phổ thông Ngô Gia Tự, thị xã Từ Sơn, tỉnh Bắc Ninh. Nghiên cứu mang lại ý nghĩa thực tiễn to lớn khi giúp giảm thiểu hơn 75% thời gian chấm bài của giáo viên, đồng thời nâng cao độ chính xác trong phát hiện lỗi logic lên mức tuyệt đối thông qua việc đạt 100% độ bao phủ các đường thực thi của mã nguồn mẫu.

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

Khung lý thuyết áp dụng

Nghiên cứu được xây dựng dựa trên nền tảng vững chắc của lý thuyết kiểm thử phần mềm hộp trắng, kết hợp với các kỹ thuật phân tích tĩnh và giải hệ ràng buộc tự động. Hai lý thuyết cốt lõi được áp dụng bao gồm lý thuyết kiểm thử dòng điều khiển và lý thuyết đồ thị ứng dụng trong cấu trúc chương trình.

Trong khung lý thuyết này, luận văn làm rõ 4 khái niệm chuyên ngành nền tảng:

  • Đồ thị dòng điều khiển: Mô hình toán học biểu diễn toàn bộ các luồng thực thi có thể có của mã nguồn thông qua tập các đỉnh biểu diễn câu lệnh và các cạnh có hướng biểu diễn luồng điều khiển giữa các lệnh.
  • Cây cú pháp trừu tượng: Cấu trúc dữ liệu cây thể hiện cấu trúc ngữ pháp trừu tượng của mã nguồn Java, được trích xuất thông qua bộ công cụ phát triển phần mềm Eclipse Java Development Tooling.
  • Độ phủ kiểm thử: Thước đo định lượng mức độ kiểm tra mã nguồn, bao gồm 3 cấp độ tiêu chí: phủ câu lệnh, phủ nhánh và phủ điều kiện con.
  • Bộ giải thỏa mãn lý thuyết modulo: Công cụ toán học hỗ trợ tìm nghiệm thỏa mãn hệ các điều kiện logic và số học trên từng đường thực thi.

Mô hình nghiên cứu kết hợp việc phân tích mã nguồn chuẩn không có lỗi do giáo viên cung cấp thành cây cú pháp trừu tượng, từ đó tự động chuyển đổi sang đồ thị dòng điều khiển. Trên đồ thị này, thuật toán duyệt đồ thị độc lập của tác giả Thomas McCabe được triển khai để tìm tập đường đi ngắn nhất bao phủ 100% các nhánh và điều kiện logic. Hệ điều kiện dọc theo mỗi đường đi được trích xuất thành hệ ràng buộc và giải tự động bằng công cụ Z3 SMT-Solver nhằm sinh ra các giá trị đầu vào hợp lệ. Giá trị đầu ra mong đợi được xác định tự động bằng cách thực thi trực tiếp mã nguồn chuẩn với dữ liệu đầu vào vừa tạo. Để khắc phục triệt để hạn chế của kiểm thử hộp trắng đối với các hành vi không được lập trình, mô hình tích hợp thêm kỹ thuật kiểm thử hộp đen gồm phân tích giá trị biên với 5 giá trị cơ bản cùng kỹ thuật kiểm thử chu trình lặp từ 0 đến n cộng 1 lần lặp.

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

Nghiên cứu sử dụng nguồn dữ liệu thực nghiệm gồm mã nguồn chuẩn của giáo viên và 6 bộ mã nguồn bài tập do học sinh khối 11 nộp trong các giờ thực hành Tin học. Các bài toán được lựa chọn đại diện cho các cấu trúc giải thuật điển hình trong chương trình giáo dục phổ thông, bao gồm bài toán kiểm tra năm nhuận, bài toán tính số ngày trong tháng và bài toán tìm ước số chung lớn nhất.

Phương pháp chọn mẫu là phương pháp chọn mẫu có chủ đích với cỡ mẫu gồm 3 dạng bài toán bao quát toàn bộ các cấu trúc điều khiển cơ bản: rẽ nhánh lồng nhau if-else, rẽ nhánh đa trường hợp switch-case và cấu trúc lặp while/for. Lý do lựa chọn phương pháp chọn mẫu này là nhằm đánh giá toàn diện khả năng phân tích cây cú pháp trừu tượng và hiệu quả giải hệ ràng buộc của công cụ trên mọi loại hình luồng điều khiển phổ biến trong lập trình hướng cấu trúc.

Phương pháp phân tích được tiến hành theo quy trình định lượng và đối sánh thực nghiệm. Mã nguồn của học sinh được đưa vào hệ thống để chạy kiểm thử với 2 bộ dữ liệu: bộ ca kiểm thử sinh tự động từ đồ thị dòng điều khiển và bộ ca kiểm thử giá trị biên mở rộng. Toàn bộ quá trình nghiên cứu, xây dựng thuật toán, phát triển công cụ phần mềm và thu thập dữ liệu thực nghiệm được hoàn thành trọn vẹn trong năm 2019.

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

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

Quá trình thực nghiệm công cụ trên các bài toán mẫu đã mang lại 4 phát hiện khoa học và kỹ thuật nổi bật:

Thứ nhất, công cụ sinh ca kiểm thử tự động đạt độ phủ tuyệt đối 100% đối với tiêu chí phủ điều kiện con trên mã nguồn Java chuẩn. Đối với bài toán kiểm tra năm nhuận, công cụ đã tự động xây dựng đồ thị dòng điều khiển gồm 4 đỉnh quyết định và sinh ra đúng 5 ca kiểm thử độc lập bao quát mọi nhánh đúng và sai của biểu thức điều kiện phức hợp.

Thứ hai, việc sử dụng bộ ca kiểm thử sinh từ đồ thị dòng điều khiển cho phép phát hiện chính xác các lỗi rẽ nhánh trên bài làm của học sinh. Khi kiểm thử bài làm của 2 học sinh với 5 ca kiểm thử phủ điều kiện con của hàm kiểm tra năm nhuận, hệ thống phát hiện 1 lỗi trên bài làm của học sinh thứ nhất tương ứng tỷ lệ sai sót 20% và phát hiện 2 lỗi trên bài làm của học sinh thứ hai tương ứng tỷ lệ sai sót 40%.

Thứ ba, sự kết hợp giữa kiểm thử dòng điều khiển và kiểm thử giá trị biên giúp tăng vọt khả năng phát hiện lỗi tiềm ẩn lên hơn 100%. Trong bài toán kiểm tra năm nhuận, bộ 13 ca kiểm thử giá trị biên đã phát hiện thêm 2 lỗi trên bài làm của học sinh thứ nhất gồm lỗi không kiểm tra năm âm và vượt ngưỡng trên, đồng thời phát hiện tới 4 lỗi trên bài làm của học sinh thứ hai.

Thứ tư, phương pháp tự động bắt giá trị đầu ra mong đợi từ việc thực thi mã nguồn chuẩn đã rút ngắn thời gian thiết lập bộ kiểm thử mẫu từ trung bình 45 phút cho mỗi bài tập xuống còn dưới 3 giây, đạt độ chính xác 100% mà không đòi hỏi giáo viên phải tính toán thủ công.

Thảo luận kết quả

Nguyên nhân chính dẫn đến các lỗi trên bài làm của học sinh bắt nguồn từ 2 yếu tố: học sinh thường bỏ qua việc kiểm tra tính hợp lệ của miền giá trị đầu vào ở các giá trị biên như số âm hoặc giá trị vượt ngưỡng, và học sinh thường nhầm lẫn giữa các toán tử logic trong các biểu thức điều kiện phức hợp. Chẳng hạn, trong bài toán năm nhuận, học sinh thứ hai đã bỏ sót nhánh kiểm tra năm chia hết cho 400 khiến thuật toán cho kết quả sai tại các năm thế kỷ.

Dữ liệu kết quả kiểm thử có thể được trình bày trực quan và hiệu quả thông qua một bảng tổng hợp đối sánh hoặc biểu đồ cột biểu diễn số lượng lỗi phát hiện được. Cụ thể, biểu đồ cột so sánh giữa phương pháp kiểm thử dòng điều khiển đơn thuần và phương pháp kiểm thử kết hợp giá trị biên sẽ phản ánh rõ nét sự chênh lệch: từ 1 lỗi tăng lên 2 lỗi đối với học sinh thứ nhất và từ 2 lỗi tăng lên 4 lỗi đối với học sinh thứ hai.

So với các nghiên cứu trước đây vốn chỉ dừng lại ở việc sinh dữ liệu đầu vào cho ngôn ngữ C/C++ mà chưa thể sinh tự động đầu ra mong đợi, hoặc các nghiên cứu sinh test cho Java hướng đối tượng chưa tối ưu cho cấu trúc bài tập phổ thông, giải pháp trong luận văn này đã hoàn thiện chu trình khép kín: phân tích mã nguồn, sinh đồ thị, giải hệ ràng buộc bằng Z3, sinh đầu vào và tự động kết xuất đầu ra chuẩn xác. Điều này mang lại giá trị ứng dụng to lớn cho việc tự động hóa khâu đánh giá chất lượng bài tập.

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

Nhằm phát huy tối đa hiệu quả nghiên cứu và sớm đưa hệ thống vào ứng dụng rộng rãi tại các cơ sở giáo dục, luận văn đưa ra 4 khuyến nghị hành động cụ thể:

Thứ nhất, hoàn thiện tích hợp 3 phân hệ chức năng gồm phân hệ Quản lý bài tập, phân hệ Sinh ca kiểm thử tự động và phân hệ Chấm bài trực tuyến trên nền tảng web ứng dụng điện toán đám mây. Nhóm phát triển phần mềm giáo dục cần triển khai nhiệm vụ này trong thời gian 6 đến 12 tháng tới, hướng tới mục tiêu phục vụ đồng thời trên 10.000 lượt chấm bài mỗi ngày với độ trễ phản hồi dưới 2 giây.

Thứ hai, mở rộng bộ phân tích cú pháp để hỗ trợ đa ngôn ngữ lập trình. Các viện nghiên cứu công nghệ thông tin và trường đại học cần nâng cấp mô-đun trích xuất cây cú pháp trừu tượng để xử lý thêm ngôn ngữ Python và C++ trong lộ trình 18 tháng, đáp ứng đầy đủ định hướng chọn lựa ngôn ngữ của chương trình giáo dục phổ thông mới.

Thứ ba, chuẩn hóa quy trình biên soạn mã nguồn mẫu và tập huấn kỹ năng cho giáo viên. Sở Giáo dục và Đào tạo cùng tổ chuyên môn Tin học các trường trung học phổ thông cần tổ chức các khóa tập huấn ngắn hạn trong 3 tháng đầu năm học cho 100% giáo viên bộ môn, hướng dẫn cách viết mã nguồn chuẩn tối ưu và cách xác định miền giá trị biên nhằm tối đa hóa độ bao phủ của bộ dữ liệu kiểm thử.

Thứ tư, triển khai cơ chế phản hồi học tập tự động cho học sinh. Ban giám hiệu các nhà trường cần đưa tính năng xem lại chi tiết ca kiểm thử bị lỗi vào quy chế thực hành trực tuyến, giúp hơn 85% học sinh có thể tự đối chiếu, phân tích nguyên nhân sai sót giải thuật và tự sửa lỗi ngay sau mỗi buổi học.

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

Nội dung và kết quả nghiên cứu của luận văn mang lại giá trị học thuật và ứng dụng thiết thực cho 4 nhóm đối tượng chính:

  1. Giáo viên giảng dạy môn Tin học tại các trường trung học cơ sở và trung học phổ thông: Khai thác tài liệu để nắm vững quy trình tạo lập bộ ca kiểm thử chuẩn, ứng dụng công cụ tự động sinh dữ liệu kiểm tra giúp tiết kiệm hơn 75% thời gian chấm bài thực hành và nâng cao tính khách quan trong đánh giá học sinh.

  2. Sinh viên và học viên cao học chuyên ngành Kỹ thuật Phần mềm và Khoa học Máy tính: Sử dụng luận văn như tài liệu tham khảo chuyên sâu về kỹ thuật kiểm thử hộp trắng, phương pháp phân tích cây cú pháp trừu tượng bằng Eclipse JDT, thuật toán duyệt đồ thị dòng điều khiển và kỹ thuật ứng dụng SMT-Solver Z3 để giải hệ ràng buộc.

  3. Các nhà phát triển nền tảng giáo dục trực tuyến và hệ thống chấm thi tự động: Tham khảo kiến trúc tổng thể 3 phân hệ và thiết kế mô-đun sinh dữ liệu kiểm thử tự động để tích hợp vào các hệ thống quản lý học tập, nền tảng thi lập trình trực tuyến quy mô lớn.

  4. Kỹ sư kiểm thử và đảm bảo chất lượng phần mềm: Áp dụng phương pháp kết hợp giữa kiểm thử dòng điều khiển, kiểm thử giá trị biên và kiểm thử vòng lặp để nâng cao độ bao phủ kiểm thử đơn vị cho các dự án phát triển phần mềm thương mại.

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

Phương pháp sinh dữ liệu kiểm thử trong luận văn khác biệt như thế nào so với kỹ thuật sinh ngẫu nhiên truyền thống?

Kỹ thuật sinh ngẫu nhiên tạo dữ liệu ngẫu nhiên không định hướng nên tỷ lệ rơi vào các nhánh điều kiện phức tạp rất thấp, thường chỉ đạt dưới 40% độ bao phủ. Ngược lại, phương pháp trong luận văn phân tích cấu trúc mã nguồn để trích xuất hệ ràng buộc trên từng đường đi cụ thể, sau đó sử dụng công cụ Z3 SMT-Solver để giải chính xác nghiệm số, đảm bảo đạt 100% độ bao phủ nhánh và điều kiện con.

Tại sao kiểm thử dòng điều khiển đạt độ phủ 100% vẫn cần bổ sung kiểm thử giá trị biên?

Kiểm thử dòng điều khiển là phương pháp hộp trắng chỉ kiểm tra những cấu trúc đã được viết trong mã nguồn. Nếu học sinh quên không viết câu lệnh kiểm tra điều kiện đầu vào hợp lệ, ví dụ bỏ sót điều kiện năm phải lớn hơn 0, kiểm thử dòng điều khiển sẽ không thể phát hiện. Kiểm thử giá trị biên là kỹ thuật hộp đen giúp bổ sung các ca kiểm thử tại các điểm cực trị, đảm bảo phát hiện triệt để các lỗi thiếu sót này.

Hệ thống tự động xác định giá trị đầu ra mong đợi của ca kiểm thử bằng cách nào?

Thay vì yêu cầu giáo viên phải tính toán thủ công từng kết quả đầu ra, hệ thống tận dụng mã nguồn chuẩn không có lỗi do giáo viên cung cấp. Khi một giá trị đầu vào được bộ giải ràng buộc sinh ra, hệ thống tự động nạp giá trị này vào mã nguồn chuẩn và thực thi để ghi nhận kết quả trả về làm giá trị đầu ra mong đợi chuẩn xác 100%.

Công cụ Z3 SMT-Solver đóng vai trò gì trong mô hình nghiên cứu?

Z3 SMT-Solver là bộ công cụ toán học mạnh mẽ do Microsoft Research phát triển. Trong luận văn, Z3 đóng vai trò giải các biểu thức logic và phương trình số học thu thập được dọc theo từng đường đi của đồ thị dòng điều khiển. Nhờ đó, hệ thống tìm ra chính xác các giá trị biến đầu vào thỏa mãn đồng thời toàn bộ các điều kiện rẽ nhánh để kích hoạt đường thực thi tương ứng.

Hệ thống này có thể áp dụng ngay cho các ngôn ngữ lập trình khác ngoài Java hay không?

Về mặt lý thuyết, quy trình kiểm thử dòng điều khiển và giải hệ ràng buộc hoàn toàn có thể áp dụng cho mọi ngôn ngữ lập trình. Tuy nhiên, mô-đun phân tích cú pháp hiện tại được xây dựng dựa trên thư viện Eclipse JDT chuyên biệt cho Java. Để áp dụng cho các ngôn ngữ khác như Python hay C++, hệ thống cần được tích hợp thêm các bộ phân tích cây cú pháp trừu tượng tương ứng của từng ngôn ngữ đó.

Kết luận

  • Luận văn đã xây dựng thành công quy trình tự động hóa toàn diện từ phân tích mã nguồn Java, trích xuất cây cú pháp trừu tượng đến thiết lập đồ thị dòng điều khiển trực quan.
  • Ứng dụng xuất sắc công cụ Z3 SMT-Solver kết hợp kỹ thuật sinh ngẫu nhiên để giải hệ ràng buộc, giúp sinh tự động bộ dữ liệu kiểm thử đạt 100% độ bao phủ điều kiện con.
  • Đề xuất giải pháp đột phá trong việc tự động sinh giá trị đầu ra mong đợi từ mã nguồn chuẩn, loại bỏ hoàn toàn các thao tác tính toán thủ công phức tạp của giáo viên.
  • Kết hợp hoàn hảo kỹ thuật kiểm thử dòng điều khiển với kiểm thử giá trị biên và kiểm thử vòng lặp, nâng cao hiệu quả phát hiện lỗi logic giải thuật trong bài làm học sinh lên hơn 80%.
  • Thiết kế hoàn chỉnh kiến trúc hệ thống chấm bài lập trình 3 phân hệ, tạo tiền đề vững chắc cho việc phát triển các nền tảng giáo dục thông minh.

Đóng góp chính của luận văn không chỉ nằm ở giải pháp kỹ thuật sinh ca kiểm thử tự động cho ngôn ngữ Java mà còn mở ra hướng tiếp cận mới trong việc ứng dụng công nghệ phần mềm vào đổi mới phương pháp giảng dạy Tin học. Trong giai đoạn 6 đến 12 tháng tới, nhóm nghiên cứu dự kiến sẽ hoàn thiện giao diện người dùng web và mở rộng hỗ trợ ngôn ngữ Python. Các đơn vị giáo dục và quý thầy cô quan tâm có thể liên hệ hợp tác thử nghiệm hệ thống để nâng cao chất lượng giảng dạy và tối ưu hóa công tác chấm thi lập trình ngay hôm nay.