Phương pháp đề xuất Phương pháp ngẫu nhiên ID Số lượng ca kiểm thử Mức Tổng số đột biến Tổng số đột biến bị diệt MS Tổng số đột biến bị diệt MS 1 Phương thức 351 261 74.3% 139 39.6% 5 Lớp 26 26 100% 23 88.4% Tổng số 377 287 76.2% 162 42.9% 2 Phương thức 351 266 75.7% 153 43.5% 10/20/30 Lớp 26 26 100% 26 100% Tổng số 377 292 77.5% 179 47.4% 3 Phương thức 425 336 79.1% 173 40.7% 15/25/35 Lớp 29 29 100% 28 96.5% Tổng số 454 365 80.3% 201 44.2%
được sinh ra của phương pháp đề xuất và phương pháp kiểm thử ngẫu nhiên. Bảng 4.2 biểu diễn so sánh độ đo MS của hai phương pháp trong ba ứng dụng, được miêu tả chi tiết như sau: cột ID là mã của chức năng trong ứng dụng; số lượng ca kiểm thử được chọn trong từng kịch bản kiểm thử; cột Mức chỉ mức độ đột biến của kiểm thử (mức phương thức hoặc mức lớp); tổng số đột biến trong chức năng của ứng dụng tương ứng; tổng số đột biến bị diệt đối với từng mức độ và từng chức năng tương ứng; MS là kết quả độ đo đột biến theo từng phương thức áp dụng. Từ Bảng 4.2 tác giả có một số nhận xét như sau:
Với cùng kích thước, các bộ kiểm thử được sinh ra bởi phương pháp đề xuất đạt độ phân tích đột biến MS cao hơn so với phương pháp kiểm thử ngẫu nhiên, với kết quả khá khác biệt khi số lượng ca kiểm thử nhỏ (số lượng ca kiểm thử 5: MS là 76.2% và 42.9% tương ứng).
Không phụ thuộc vào số các bộ kiểm thử, các bộ kiểm thử bằng phương pháp đưa ra có thể đạt được 100% mức độ lớp trong khi đó phương pháp kiểm thử ngẫu nhiên chỉ có thể đạt được 88.4%.
Bộ kiểm thử được sinh ra sử dụng phương pháp đề xuất có thể dị tìm được đến76% lỗi gieo với kích thước nhỏ của bộ kiểm thử (một ca kiểm thử trên một kịch bản). Hơn nữa, nhiều hơn 74% lỗi ở mức độ phương thức và100%
Như vậy, với tất cả những kết quả thực nghiệm trên, luận án có một số thảo luận như sau:
Những kết quả trên cho thấy sự hiệu quả và chất lượng tốt hơn của các ca kiểm thử được sinh ra so với một số phương pháp hiện tại. Quy trình giúp các cơng ty phần mềm thực hiện thiết kế kiểm thử ngay ở giai đoạn đầu của quá trình phát triển phần mềm. Tuy nhiên, trong phạm vi của nghiên cứu này, các hệ thống thực nghiệm còn đơn giản, chưa thể hiện được đầy đủ sự phức tạp của các thiết kế trong thực tế. Phương pháp đề xuất phù hợp với các hệ thống mà các biểu đồ tuần tự có các tốn tử song song trong đó có sự chia sẻ dữ liệu trong các tốn hạng, các ràng buộc với các biến là kiểu dữ liệu số.
Khả năng áp dụng cho các dự án thực tế: với các thuật tốn sinh kịch bản kiểm thử thì độ phức tạp lớn nhất là đa thức (phụ thuộc vào số đỉnh của đồ thị, và số thơng điệp trong tốn tử song song và tuần tự yếu), với thuật toán sinh dữ liệu kiểm thử là độ phức tạp mũ (phụ thuộc số nút quyết định, số đường dẫn của đồ thị G và số điểm chia trong ràng buộc). Tuy nhiên, số lượng các thơng điệp, các tốn tử, các điểm chia miền trong các ràng buộc và số nút quyết định và đường dẫn của đồ thị G tương ứng với một biểu đồ tuần tự thực tế hiếm khi lên tới hàng trăm. Do đó, với thuật tốn đề xuất hồn tồn khả thi cho các phần mềm trong thực tế.
4.5 Tổng kết
Chương 4 của luận án đã trình bày một phương pháp đề xuất sinh tự động dữ liệu kiểm thử từ biểu đồ tuần tự UML 2.0 và các ràng buộc của biểu đồ lớp trong kiểm thử vòng lặp và các ứng dụng tương tranh. Chìa khóa của phương pháp này là cải tiến thuật toán chọn các kịch bản kiểm thử khả thi trong trường hợp khai thác sự đan xen giữa các thơng điệp tuần tự trong các tốn hạng của toán tử song song và tuần tự yếu. Phương pháp này sinh ra các kịch bản kiểm thử có thể tránh được sự bùng nổ số lượng các kịch bản kiểm thử bởi việc lựa chọn các điểm hoán đổi. So với nghiên cứu [89], phương pháp đề xuất sinh các kịch bản kiểm thử theo các tiêu chuẩn bao phủ tương tranh khác nhau. Do đó, các lỗi tương tranh của hệ thống có thể được tìm thấy và kiểm thử tính tương
tranh trong các ứng dụng khá hiệu quả. Hơn nữa, điểm mới của phương pháp sinh dữ liệu kiểm thử so với nghiên cứu [75] là việc sinh dữ liệu kiểm thử theo các trường hợp của độ bao phủ lặp. Thực nghiệm minh chứng khả năng tìm lỗi của các kịch bản kiểm thử và dữ liệu kiểm thử được sinh ra tốt hơn so với một số phương pháp kiểm thử khác, chứng tỏ tính hiệu quả và độ tin cậy của phương pháp đưa ra về mặt thực nghiệm.
Các kết quả trên đã được tác giả công bố trong bài báo “A Method for Automated Test Data Generation from Sequence Diagrams and Object Con- straint Language” tại kỷ yếu của Hội thảo SoICT (2015) “The Sixth Interna- tional Symposium Information and Communication Technology”; và trong bài báo “A Method for Automated Test Cases Generation from Sequence Diagrams and Object Constraint Language for Concurrent Programs” tại VNU Journal of Science: Computer Science and Communication Engineering (2016).
Trong các nghiên cứu tiếp theo, tác giả sẽ tiếp tục phát triển theo hướng xác định các kịch bản kiểm thử khả thi hoặc không khả thi mà không cần dữ liệu kiểm thử là đầu vào để thực thi. Việc lựa chọn các tiêu chuẩn bao phủ tương tranh khác nhau để sinh các kịch bản kiểm thử sao cho phù hợp với từng loại ứng dụng cũng là vấn đề mà tác giả quan tâm. Hướng mở rộng phương pháp đưa ra cho các biểu đồ tuần tự khác như biểu đồ trạng thái, biểu đồ hoạt động, v.v. Hơn nữa, có thể phát triển các độ đo và độ đánh giá hiệu quả của các kịch bản kiểm thử về khả năng tìm lỗi và các tiêu chuẩn bao phủ khác.
Chương 5
SINH DỮ LIỆU KIỂM THỬ CHO KIỂU DỮ LIỆU CHUỖI
Chương này trình bày một phương pháp cải tiến sinh tự động dữ liệu kiểm thử từ các biểu đồ tuần tự UML 2.0 và biểu đồ lớp với giải các ràng buộc có biến là kiểu dữ liệu chuỗi. Phương pháp sinh các kịch bản kiểm thử để tránh bùng nổ số các đường dẫn kiểm thử trong trường hợp khơng có sự chia sẻ dữ liệu trong luồng song song của biểu đồ tuần tự. Hơn nữa, luận án cải tiến bộ giải Z3–str để sinh ra dữ liệu kiểm thử với các ràng buộc chuỗi. Phương pháp đề xuất các quy tắc giảm và thuật toán đệ quy cho các toán tử search, replaceAll và mở rộng các quy tắc tiền xử lý cho các toán tử charAt, lastindexOf, trim, startsWith và endsWith.
5.1 Giới thiệu
Trong hướng nghiên cứu sinh tự động kiểm thử dựa trên mơ hình có các bước chủ yếu: sinh các kịch bản kiểm thử từ các mơ hình hành vi, sinh dữ liệu kiểm thử và sinh các mã kiểm thử từ các trừu tượng kiểm thử [100]. Phương pháp sinh dữ liệu kiểm thử từ giải quyết các ràng buộc tập trung nhiều vào các loại biến có kiểu dữ liệu số. Tuy nhiên, có rất nhiều ứng dụng bị lỗi trong q trình xử lý chuỗi. Thêm vào đó, việc sinh các kịch bản kiểm thử sớm trong khi phát triển phần mềm từ các biểu đồ thiết kế UML cũng giúp phát hiện các lỗi sớm nếu các yêu cầu phần mềm có sự sai khác hoặc mâu thuẫn. Vì vậy, nghiên cứu và phát triển các phương pháp sinh các dữ liệu kiểm thử từ các biểu đồ UML 2.0 với giải các ràng buộc chuỗi là cần thiết, nhất là áp dụng trong các ứng dụng web có rất nhiều biến dữ liệu chuỗi được sử dụng.
Có nhiều cách tiếp cận đưa ra để giải quyết vấn đề trên. Nhiều phương pháp chưa giải quyết hết các đặc trưng của biểu đồ tuần tự UML và thường giải các ràng buộc với kiểu dữ liệu nguyên thủy [72, 65, 30]. Nhóm tác giả Shoichiro và các đồng sự trong [39] đưa ra hướng tiếp cận giải các ràng buộc chuỗi từ biểu đồ lớp UML, các ràng buộc chuỗi được chuyển đầu vào phù hợp với bộ giải SMT, sau đó sinh dữ liệu kiểm thử. Phương pháp này chuyển các chuỗi thành các mảng nguyên. Cách tiếp cận có hạn chế đối với các tốn tử chuỗi vì nhiều ràng buộc chuỗi khó biểu diễn tương ứng với các biểu diễn nguyên của chúng.
Trong các hướng tiếp cận của các bộ giải với các ràng buộc chuỗi, hiện tại có rất nhiều bộ giải để giải quyết các ràng buộc chuỗi như REX [104], DPRLE [53] và HAMPI [60] chỉ xử lý với các tốn tử chuỗi [114]. Tuy nhiên, trong thực tế có rất nhiều toán tử phi chuỗi và các toán tử chuỗi cùng tồn tại trong các ứng dụng. Hơn nữa, các toán tử chuỗi tương tác với các tốn tử phi chuỗi có thể gây ra lỗi. Nếu chỉ phân tích ràng buộc chuỗi sẽ thiếu các ràng buộc số. Có rất nhiều bộ giải chuyển đổi các ràng buộc chuỗi sang các ràng buộc trung gian như bit–vectơ (được biểu diễn dưới dạng các ràng buộc nguyên) [87, 11]. Tuy nhiên, khi giải các ràng buộc số chuyển đổi đó khơng đủ chính xác và độ dài của chuỗi cũng cần được biết trước khi chuyển đổi. Do đó, luận án sử dụng và cải tiến bộ giải Z3–str bởi vì Z3–str hỗ trợ cả các tốn tử ràng buộc chuỗi, các toán tử ràng buộc phi chuỗi và cũng không cần biết trước độ dài của chuỗi đó.
Như vậy, Chương 5 của luận án cải tiến một phương pháp để sinh các dữ liệu kiểm thử tự động từ các biểu đồ tuần tự UML 2.0 và biểu đồ lớp với giải các ràng buộc chuỗi. Thuật toán sinh các kịch bản kiểm thử để tránh bùng nổ các đường dẫn kiểm thử trong trường hợp khơng có điểm chia sẻ dữ liệu trong các luồng song song (mở rộng so với Chương 4). Việc giải với các ràng buộc chuỗi được sử dụng và cải tiến bộ giải Z3–str. Điểm mới của q trình sinh dữ liệu kiểm thử đó là đưa ra quy tắc giảm và phương pháp đệ quy cho các toán tử search và replaceAll; mở rộng các quy tắc tiền xử lý cho các toán tử khác như charAt, lastindexOf, trim, startsWith và endsWith. Luận án phát triển một công cụ để áp dụng phương pháp sinh các dữ liệu kiểm thử được cải tiến. Một vài thực nghiệm chứng minh khả năng tìm lỗi của các kịch bản kiểm thử được sinh ra và việc giải các toán tử chuỗi, hiệu năng tốt hơn khi so sánh với một số phương pháp tiếp cận hiện tại.
5.2 Những nghiên cứu liên quan
Phần này đề cập đến nghiên cứu của các tác giả khác, được luận án áp dụng để đưa ra phương pháp sinh dữ liệu kiểm thử tự động từ biểu đồ tuần tự UML và biểu đồ lớp với việc giải các ràng buộc chuỗi. Trong Chương 3 đã đưa ra thuật toán chuyển đổi từ biểu đồ tuần tự UML 2.0 và biểu đồ lớp chuyển sang CFG với các thông tin về ràng buộc và tất cả mười hai loại toán tử được giải quyết. Do đó, những nghiên cứu liên quan của chương này là nghiên cứu các phương pháp sinh các kịch bản kiểm thử và giải các ràng buộc chuỗi từ CFG để sinh ra dữ liệu kiểm thử thỏa mãn các ràng buộc của từng kịch bản kiểm thử.
Sinh các kịch bản kiểm thử từ biểu đồ tuần tự và biểu đồ lớp:
Có nhiều hướng tiếp cận hiện nay tập trung vào việc sinh các kịch bản kiểm thử từ các biểu đồ UML. Tác giả M.Sharma và các đồng sự trong cách tiếp cận [85] đưa ra việc sinh các kịch bản kiểm thử từ biểu đồ tuần tự UML. Trong phương pháp mà nhóm tác giả đưa ra là biểu đồ tuần tự được chuyển thành đồ thị tuần tự (Sequence Diagram Graph – SDG), sau đó duyệt đồ thị tuần tự để sinh các kịch bản kiểm thử. Phương pháp tiếp cận trong [86] thì tích hợp biểu đồ tuần tự và biểu đồ ca sử dụng cho việc sinh các tuần tự kiểm thử. Nhóm tác giả đã chuyển đổi cả biểu đồ tuần tự và biểu đồ ca sử dụng thành đồ thị kiểm thử tuần tự (Sequence Testing Graphs – STG). Sau đó, duyệt đồ thị kiểm thử tuần tự đó để sinh ra các kịch bản kiểm thử. Tuy nhiên, các hướng tiếp cận trên đều chưa chỉ ra vấn đề bùng nổ các kịch bản kiểm thử trong các luồng song song và việc chia sẻ dữ liệu trong các luồng đó.
Nhóm tác giả P.Samuel và các đồng sự trong [82] đã đưa ra phương pháp sinh các kịch bản kiểm thử từ biểu đồ tuần tự bởi việc chuyển đổi từ biểu đồ tuần tự sang định dạng trung gian (đồ thị phụ thuộc tuần tự – Sequence Dependency Graph). Sau đó, từ đồ thị phụ thuộc tuần tự được duyệt để sinh các kịch bản kiểm thử. Tuy nhiên, cách tiếp cận đưa ra việc chuyển đổi sang định dạng trung gian khá khó, phức tạp và tốn thời gian. Hơn nữa, hướng tiếp cận trong [72] chỉ tập trung xem xét việc sinh dữ liệu kiểm thử từ biểu đồ tuần tự UML mà khơng chú ý đến thuật tốn sinh các kịch bản kiểm thử từ CFG.
Chương 4 đã đưa ra thuật toán sinh các kịch bản kiểm thử để tránh bùng nổ số các kịch bản và giải quyết trong trường hợp các luồng song song có chia
sẻ dữ liệu trong các ứng dụng tương tranh. Tuy nhiên, nếu các luồng song song khơng có sự chia sẻ dữ liệu thì khơng thể đánh dấu được điểm hốn đổi. Chính vì vậy, thuật tốn sinh các kịch bản kiểm thử trong chương này được đưa ra để giải quyết vấn đề trên.
Các bộ giải với kiểu dữ liệu chuỗi:
Có rất nhiều bộ giải hiện tại giải quyết với các ràng buộc mà biến có kiểu dữ liệu chuỗi. Tuy nhiên, các bộ giải khác nhau có phương pháp giải, ưu và nhược điểm khác nhau. Các hướng tiếp cận của các bộ giải chuỗi [87, 11, 98, 81] đưa ra giải các ràng buộc, bao gồm cả ràng buộc chuỗi và ràng buộc phi chuỗi được đưa ra trong phân tích các ứng dụng. Chìa khóa của tất cả các cách tiếp cận này là chuyển tất cả các ràng buộc chuỗi và ràng buộc phi chuỗi sang một miền duy nhất. Trong bộ giải ràng buộc chuỗi [87, 11] chuyển các chuỗi thành các bit–vector, các vector này cũng được sử dụng để biểu diễn các ràng buộc nguyên. Kết quả các ràng buộc có thể được giải bằng cách sử dụng cách tiếp cận trong các bộ giải SMT hiện có. Tuy nhiên, để chuyển một ràng buộc chuỗi thành một bit–vector, độ dài của ràng buộc như một điều kiện tiên quyết trước khi mã hóa sang bit–vector. Do đó, các kỹ thuật hiện tại phải liệt kê độ dài của chuỗi ràng buộc và sau đó mã hóa các ràng buộc chuỗi dựa trên giá trị độ dài cụ thể. Các ràng buộc được mã hóa được chuyển là đầu vào cho bộ giải SMT. Nhược điểm của phương pháp là địi hỏi mã hóa lặp đi lặp lại và truy vấn giải quyết đến bộ giải SMT nhiều lần. Hơn nữa, với các chuỗi là đầu vào trong các ứng dụng thì rất khó xác định cố định và chính xác độ dài của các chuỗi đó.
STP [42] là bộ giải ràng buộc SMT. Hướng tiếp cận trong STP hỗ trợ các tốn tử ngun và logic nhưng khơng hỗ trợ chuỗi. Phần xử lý các vấn đề chuỗi tương đương được giải quyết bằng cách sử dụng các định danh số nguyên để biểu thị chuỗi khơng đổi. Tuy nhiên, các tốn tử chuỗi phức tạp hơn như concat() và
substr()khơng được hỗ trợ. Do đó, giải pháp đưa ra trong STP nếu có các tốn tử trên thì việc giải các ràng buộc chuỗi đó sẽ bị bỏ qua và khơng chính xác.
Hampi [60] là một trong các mã nguồn mở phổ biến để giải các ràng buộc chuỗi. Công cụ được thiết kế để phát hiện các lỗ hổng SQL Injection. Sau đó, nó được sử dụng rộng rãi trong phân tích ứng dụng web khác [10, 87, 96]. Các