Hàm kiểm thử Số Test Số lỗi phát hiện
timuscln_1(int x, int y) 6 2
timuscln_2(int x, int y) 6 1
Kiểm thử vòng lặp while cho hàm timuscln
Các ca kiểm thử được sinh ra trong Hình 3.20 và giá trị biên ở Bảng 3.9 mới chỉ đảm bảo phủ toàn bộ các nhánh và biên trên mã nguồn. Tuy nhiên, đường kiểm thử đi qua vòng lặp while của hàm chỉ được thực hiện một lần, khó mà phát hiện được các lỗi khi vòng lặp while thực hiện một số lần lặp nhất định. Để giải quyết vấn đề này, chúng ta cần sinh thêm các ca kiểm thử cho vòng lặp while. Trong hàm timuscln, chúng ta không biết trước số lần lặp của vòng lặp while, do đó chúng ta sẽ thực hiện các ca TIEU LUAN MOI download : skknchat@gmail.com
kiểm thử để vòng lặp while thực hiện lặp 0 lần, một lần, hai lần, và một số k bất kỳ (k>2) lần lặp. Các ca kiểm thử ứng với số lần lặp 0 lần và 1 lần đã được công cụ sinh ra ở ca kiểm thử số 1 và số 2 trên Hình 3.20 . Nên ta chỉ cần thực hiện kiểm thử vòng lặp while với 2 trường hợp là 2 lần lặp và 4 lần lặp như trên Bảng 3.12.
Bảng 3.12. Các ca kiểm thử vòng lặp cho hàm timuscln
Áp dụng các ca kiểm thử vòng lặp while lên bài tập của hai học sinh, kết quả kiểm thử được ghi lại trong Bảng 3.13.
Bảng 3.13. Kết quả kiểm thử vòng lặp while cho hàm tìm uscln của hai học sinh
Hàm kiểm thử Số Test Số lỗi phát hiện
timuscln_1(int x, int y) 2 0
timuscln_2(int x, int y) 2 0
3.6 Ý nghĩa của thực nghiệm
Công cụ sinh ca kiểm thử tự động từ mã nguồn Java là một giải pháp tốt cho bài toán chấm bài lập lập trình của giáo viên. Khi kiểm thử với một mã nguồn chuẩn, công cụ đã sinh ra được các ca kiểm thử mẫu phủ toàn bộ các nhánh trên mã nguồn. Áp dụng các ca kiểm thử mẫu trên bài tập của học sinh bằng các công cụ hỗ trợ kiểm thử (JUnit) đều phát hiện được chính xác các ca kiểm thử lỗi.
Ý nghĩa chính của công cụ sinh ca kiểm thử tự động là thay vì giáo viên phải có kiến thức về kiểm thử mã nguồn và mất nhiều thời gian để thiết kế các ca kiểm thử theo chủ quan của mình, giáo viên chỉ cần cung cấp mã nguồn chuẩn, công cụ sẽ tự động sinh các ca kiểm thử mẫu. Các ca kiểm thử mẫu sẽ là tiêu chí để chấm điểm trên các bài tập của học sinh. Với các ví dụ áp dụng, công cụ đều sinh được các đồ thị và đường đi kiểm thử thỏa mãn các tiêu chí kiểm thử giúp hỗ trợ giáo viên trong việc thiết kế các bài giảng về giải thuật và dễ dàng trao đổi kiến thức một cách trực quan với đồng nghiệp trong các buổi sinh hoạt chuyên môn.
Kết hợp phương pháp sinh ca kiểm thử tự động với phương pháp kiểm thử giá trị biên và vòng lặp, áp dụng trên mã nguồn chuẩn, giáo viên đã có tương đối đầy đủ bộ ca kiểm thử có khả năng phát hiện tất cả các lỗi trên mã nguồn của học sinh. Khi
STT Lặp Input EO RO
1 2 lần (1, 4) 1
2 4 lần (1, 5) 1
chúng ta tự động hóa được quy trình sinh các ca kiểm thử, việc chấm bài tập lập trình cho học sinh sẽ là một công việc dễ thực hiện, nhánh chóng và đạt hiệu quả cao.
So với công cụ đã được nghiên cứu trong [2, 3], phương pháp nghiên cứu có ưu điểm vượt trội là có thể áp dụng vào thực tiễn để hỗ trợ giáo viên trong quá trình chấm bài. Trong khi đó, ở [2] chỉ nghiên cứu phương pháp sinh ca kiểm thử cho ngôn ngữ C và C++ mới ở mức bản mẫu, các ca kiểm thử chỉ sinh ra cho dòng điều khiển chứ chưa đề cập đến sinh ca kiểm thử cho vòng lặp và giá trị biên. Phương pháp nghiên cứu trong [3], đã sinh được ca kiểm thử cho mã nguồn Java, nhưng áp dụng cho các chương trình hướng đối tượng. Với các hàm Java hướng cấu trúc như trong đề tài nghiên cứu thì không thực hiện được. Trong [3] cũng chưa đề cập đến việc áp dụng công cụ để hỗ trợ một hệ thống thực tiễn nào.
Chƣơng 4: Kết luận
Luận văn đã tập trung nghiên cứu phương pháp và xây dựng công cụ hỗ trợ việc chấm bài tập lập trình tự động của các học sinh Trung học cơ sở/Trung học phổ thông nhằm giải quyết vấn đề khó khăn của các giáo viên tin học trong việc sinh các ca kiểm thử khi chấm các bài tập. Ý tưởng chính của phương pháp này là sử dụng mã nguồn mẫu (do giáo viên cung cấp) của bài toán để sinh các ca kiểm thử. Quá trình sinh các ca kiểm thử trải qua nhiều công đoạn như: phân tích mã nguồn để sinh đồ thị dòng điều khiển; sinh các đường đi kiểm thử; xác định hệ ràng buộc và tìm nghiệm để sinh dữ liệu kiểm thử tương ứng với mỗi đường đi; và cuối cùng là sinh giá trị đầu ra mong muốn cho từng dữ liệu kiểm thử từ đặc tả của bài toán. Tuy nhiên, các ca kiểm thử sinh ra bởi phương pháp này chưa đủ tốt để phát hiện tất cả các lỗi có thể có của chương trình. Vì vậy, luận văn nghiên cứu các phương pháp sinh các ca kiểm thử cho các vòng lặp (vì lỗi hay xảy ra tại các vòng lặp). Luận văn cũng áp dụng kỹ thuật phân tích giá trị biên để sinh thêm các ca kiểm thử cho giá trị biên và cận biên của các biến. Các ca kiểm thử này sẽ được ghép với các ca kiểm thử sinh ra bằng phương pháp phân tích mã nguồn nhằm kiểm tra tính đúng đắn của các chương trình của học sinh ứng với bài toán đề ra.
Để minh chứng cho kết quả nghiên cứu, luận văn đã tiến hành áp dụng phương pháp này với các chương trình Java. Luận văn cũng đã tiến hành cài đặt công cụ và thử nghiệm với một số chương trình Java đơn giản nhằm minh chứng cho tính đúng đắn và tính hiệu quả của phương pháp nghiên cứu. So với các nghiên cứu trước đây [2, 3] mới chỉ ở dạng bản mẫu, phương pháp đề xuất trong luận văn có tính thực tiễn cao, áp dụng cho hệ thống cho hệ thống chấm bài lập trình tự động, có khả năng ứng dụng trong thực tế. Phương pháp đề xuất trong luận văn có thể sinh được bộ ca kiểm thử tương đối đầy đủ để kiểm tra các lỗi xảy ra trên bài tập của học sinh nhờ việc sinh thêm các ca kiểm thử cho giá trị biên và vòng lặp.
Mặc dù đã có nhiều cố gắng nhưng kết quả của luận văn vẫn tồn tài nhiều hạn chế. Quá trình sinh các ca kiểm thử cho vòng lặp và sinh các ca kiểm thử dựa trên phân tích giá trị biên vẫn chưa tự động hóa được. Công cụ hiện tại mới hỗ trợ các tính năng tối thiểu và chưa được thực nghiệm cẩn thận. Trong thời gian tới, luận văn sẽ tập trung giải quyết các vấn đề nêu trên.
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Phạm Ngọc Hùng, Trương Anh Hoàng, Đặng Văn Hưng (2014), Giáo trình kiểm thử phần mềm, NXBĐại học Quốc gia Hà Nội.
[2] Nguyễn Đức Anh (2015), Xây dựng công cụ kiểm thử cho các chương trình C, Khóa luận tốt nghiệp Đại học, Trường Đại học Công nghệ, ĐHQGHN.
[3] Dương Tuấn Anh (2016), Xây dựng công cụ kiểm thử dòng điều khiển tự động cho các đơn vị chương trình Java, Khóa luận tốt nghiệp Đại học, Trường Đại học Công nghệ, ĐHQGHN.
Tiếng Anh
[4] Sangeeta Tanwer and Dharmender Kumar (2010), Automatic tesTcase Generation of C Program Using CFG, IJCSI International Journal of Computer Science Issues, Vol. 7, Issue 4, No 8.
[5] Jurgen Christ, Jochen Hoenicke and Alexander Nutz (2012), SMTInterpol: an Interpolating SMT Solver, Proceeding SPIN'12 Proceedings of the 19th international conference on Model Checking Software, pp.248-254.
[6] Paul C. Jorgensen (2013), Software testing: A craftman's approach, 4th ed., CRC Press, Inc., Boca Raton, FL, USA.
[7] T.J. McCabe (1976), A complexity measure, IEEE Transactions on Software Engineering 2, no. 4, 308-320.
[8] Duc-Anh Nguyen and Pham Ngoc Hung (2017). A Test Data Generation Method for C/C++ Projects. In Proceedings of the Eighth International Symposium on Information and Communication Technology (SoICT 2017). ACM, New York, NY, USA, pp. 431-438.
[9] D. A. Nguyen, P. N. Hung, and V. H. Nguyen (2016). A method for automated unit testing of C programs. In 2016 3rd National Foundation for Science and Technology Development Conference on Information and Computer Science (NICS), pp. 17-22.
[10] David M. Perry , Andrea Mattavelli , Xiangyu Zhang , Cristian Cadar (2017),
Accelerating array constraints in symbolic execution, Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis, pp.10-14.
[11] Ting Su , Geguang Pu , Bin Fang , Jifeng He , Jun Yan , Siyuan Jiang , Jianjun Zhao (2014). Automated Coverage-Driven Test Data Generation Using Dynamic Symbolic Execution, Proceedings of the 2014 Eighth International Conference on Software Security and Reliability, pp. 98-107.