4.3 Phương pháp sinh dữ liệu kiểm thử theo các độ bao phủ tương
4.3.3 Sinh dữ liệu kiểm thử
Các kịch bản kiểm thử được sinh ra (từ Phần 4.3.2) chính là một tuần tự các thơng điệp thực hiện. Tuần tự này là tuần tự khả thi nếu tìm thấy dữ liệu kiểm thử để thỏa mãn tất cả các ràng buộc đi kèm với kịch bản đó. Có rất nhiều nghiên cứu giải quyết hệ các ràng buộc của các biến để tìm giá trị biến thỏa mãn. Tuy nhiên, nó khó khăn trong trường hợp các ràng buộc phi tuyến tính, các mảng và các vịng lặp khi sinh dữ liệu kiểm thử. Phương pháp đưa ra giải quyết vấn đề bằng việc tìm giá trị trong các kịch bản kiểm thử của CFG, sử dụng một vị từ tại một thời điểm và giảm miền của các biến từng bước một. Luận án phát triển phương pháp giảm miền động trong [72, 75] với cải tiến việc sinh dữ liệu kiểm thử theo các độ bao phủ lặp khác nhau.
4.3.3.1 Cải tiến phương pháp sinh dữ liệu kiểm thử
Sinh dữ liệu kiểm thử giảm miền động là cách tiếp cận sử dụng một phần của kiểm thử dựa trên những ràng buộc và thực thi tượng trưng. Cách tiếp cận này sử dụng phương pháp giảm miền trực tiếp cho các miền giá trị biến, tạo ra một tập các giá trị biểu diễn các điều kiện trên đường dẫn sẽ được thực thi. Phương pháp được cải tiến sinh các dữ liệu kiểm thử theo độ bao phủ trong kiểm thử vòng lặp (như Phần 2.4.2). Các ràng buộc là các biểu thức đại số liên quan bởi một trong các quan hệ {>, >=, <, <=,=,6=}. Biểu thức đại số được bao gồm
các biến, dấu ngoặc, các ràng buộc, các toán tử số học như {+,−,∗, /}. Mệnh đề
là một danh sách các ràng buộc được kết nối bởi toán tử logic. Một vị từ là một danh sách các mệnh đề được gắn với nút quyết định (DN). Các vị từ trong một kịch bản xuất hiện từ biểu thức điều kiện của toán tử như opt, loop, alt, break, .v.v, và xuất hiện các nhánh ghép từ các nút quyết định. Chú ý rằng một đường có thể được biểu diễn bởi danh sách các vị từ với một vị từ cho từng DN.
Theo độ bao phủ trong kiểm thử vịng lặp, tùy từng trường hợp tham số trong tốn tử loop có hoặc khơng bao gồm các tham số về số vòng lặp tối đa (max) và số vòng lặp tối thiểu (min) thì thuật tốn sẽ sinh ra các trường hợp kiểm thử tương ứng theo độ bao phủ lặp. Luận án đề xuất Thuật tốn 4.3 để sinh ra số vịng lặp tương ứng trong các trường hợp khác nhau của độ bao phủ trong kiểm thử vòng lặp. Tại dòng 1 trong Thuật toán 4.3 xét toán tử lặp bao
gồm cả tham số max và min thì số vịng lặp được xét là: 0, min, min+ 1, k, max−1 và max. Nếu tốn tử loop chỉ có tham số max(dịng 4) thì số vịng lặp
được xét là: 0, 1, 2, k, max−1, và max. Nếu tốn tử loop chỉ có tham số min
(dịng7) thì số vịng lặp được xét là: 0, min, min+ 1, k. Nếu tốn tử loop khơng
có tham số min và max (dịng 10) thì số vịng lặp được xét là: 0, 1, 2 và k.
Độ phức tạp của Thuật toán 4.3: thuật toán gồm các câu lệnh tuần tự xác định và khơng bao gồm vịng lặp, do đó độ phức tạp hằng số O(1). Tính dừng
thuật tốn: các tham số đầu vào là các tham số của toán tử loop trong biểu đồ tuần tự đều xác định, vì vậy sau một số hữu hạn các bước thì thuật tốn dừng.
Thuật toán 4.3 Sinh các trường hợp kiểm thử tương ứng theo độ bao phủ lặp
Input: t là một đường dẫn kiểm thử bao gồm DN của toán tử lặp và tập ràng buộc tương ứng
Output: Tập hợp m gồm số các vòng lặp trong các đường dẫn kiểm thử
1: if (fragment==’loop’ && guard ==true && parameters havemaxandmin)then
2: k :=random(max−1); //k is random number with 2< k < max−1;
3: m :={0;min;min+ 1;k;max−1;max};
4: else if (parameters only have max) then
5: m :=random(max−1); //k is random number with 2< k < max−1;
6: m :={0; 1; 2;k;max−1;max};
7: else if (parameters only have min)then
8: k is random number >2; 9: m :={0;min;min+ 1;k}; 10: else 11: k is random number >2; 12: m :={0; 1; 2;k}; 13: end if
Từ đồ thị dòng điều khiển G (ở trên), với từng kịch bản kiểm thử ti (trong một tập các kịch bản T) biểu diễn tuần tự các nút<Ni1, Ni2, . . . , Nig>, trong đó: Ni1 là nút bắt đầu và Nig là nút kết thúc. Việc tìm dữ liệu kiểm thử chính là các miền con của dữ liệu đầu vào thỏa mãn tất cả các ràng buộc đi kèm đường dẫn hiện tại ti và đường dẫn đó đi đến nút kết thúc Nig. Khi duyệt đường dẫn, các sự lựa chọn được tạo ra và quá trình tìm kiếm chia các miền biến để tìm một tập hợp các giá trị thỏa mãn các ràng buộc cũng như các vị từ đi qua. Hình 4.3 chi tiết luồng sinh dữ liệu kiểm thử từ việc cải tiến phương pháp giảm miền động. Trong sơ đồ, hình oval biểu diễn đầu vào và đầu ra; hình chữ nhật biểu diễn các bước tiến trình; và hình thoi biểu diễn các nhánh điều kiện thực thi.
Từ Hình 4.3 của thủ tục gồm có: các miền giá trị của các biến đầu vào, đồ thị dòng điều khiển G và điểm bắt đầuNi1 và các điểm kết thúc Nig là các đầu vào; các kịch bản kiểm thử là đầu ra của thủ tục.
không
Ràng buӝc cӫa các biӃn Ĉӗ thӏ dịng ÿiӅu khiӇn T có rӛng khơng? T: tұp ti tҩt cҧ các ÿѭӡng dүn, tӯ ÿiӇm N1 ÿӃn ÿiӇm Ng; k; mi trong tұp {m} Xét ÿѭӡng dүn ti tӯ T T = T - { ti}
kiӇm tra nút hiӋn tҥi là DN?
Ĉánh dҩu và ÿӃm DN(x). Ĉӑc vӏ
tӯ trên cҥnh nhánh
getSplit ÿӇ giҧm miӅn cӫa biӃn
kiӇm tra x là sӕ vòng lһp mi hay không? nhiӅu hѫn k ÿiӇm chia tҥi DN?
Chӑn giá trӏ cӫa biӃn tӯ miӅn giá trӏ ÿѭӧc giҧm
Dӳ liӋu kiӇm thӱ
Di chuyӇn sang nút tiӃp theo
Không thӇ sinh ra dӳ liӋu kiӇm thӱ duyӋt lҥi nút trѭӟc DN
trên ÿѭӡng dүn ti
Di chuyӇn ÿӃn nút DN gҫn
nhҩt trѭӟc ÿó kiӇm tra miӅn mӟi thӓa mãn ràng buӝc
có khơng có khơng có có
Thӵc hiӋn theo câu lӋnh (có thӇ thay ÿәi giá trӏ biӃn) khơng có khơng khơng
kiӇm tra nút hiӋn tҥi có là nút ÿích Ng?
có
khơng
Hình 4.3: Quá trình sinh dữ liệu kiểm thử: phát triển từ [75] cho vòng lặp.
Từ tập hợp các đường dẫn kiểm thử T sinh ra từ Phần 4.3.2, nút quyết định đầu tiên kiểm tra T có rỗng khơng. Nếu tất cả các đường trong T được
kiểm tra và dữ liệu khơng tìm thấy thì quá trình tìm kiếm thất bại, nghĩa là khơng có đường dẫn khả thi từ điểm N1 đến điểm kết thúc Ng. Trường hợp tập hợp T không rỗng, chọn một đườngtitrong tập T để duyệt và di chuyển nó khỏi T để khơng chọn lại nữa. Bước tiếp theo của thủ tục là duyệt đường dẫn ti lần lượt xét tuần tự các nút từ nút bắt đầu đến nút kết thúc của ti. Nếu nút hiện
tại là nút quyết định (kiểm tra nút hiện tại là DN?) thì giá trị biến của nhánh ra tương ứng được giảm miền của biến thích hợp với ràng buộc thỏa mãn.
Nếu nút hiện tại khơng là nút quyết định thì câu lệnh được thực thi và cũng có thể làm thay đổi giá trị của biến. Nếu nút hiện tại là nút quyết định, thủ tục sẽ đánh dấu, đếm DN và đọc vị từ trên cạnh nhánh. Các vị từ (trên các cạnh nhánh) từ nút quyết định DN được sử dụng để tạo ra các ràng buộc mới. Từ các ràng buộc của các biến và các vị từ theo từng đường dẫnti, GetSplit [75] để tạo ra điểm chia mới nhằm giảm miền giới hạn của các biến. Đường dẫn ti
được duyệt, một quá trình tìm kiếm được sử dụng để chia các miền của biến với mục đích nỗ lực để tìm một tập hợp các giá trị mà vẫn thỏa mãn các ràng buộc. GetSplit là thuật toán thay đổi miền các biến trong một ràng buộc thỏa mãn: các miền mới vẫn thỏa mãn các ràng buộc và kích thước của hai miền được chia là bằng nhau. Ví dụ, vị từ x > y với miền của x, y là (1..50), quá trình chia
đầu tiên sẽ tạo ra miền cho x là (26..50) và miền cho y là (1..25). Thuật toán
GetSplit được chỉ ra ở Hình 4.4, tìm kiếm heuristic là khóa chính của q trình tìm kiếm để chọn các giá trị của các biến thỏa mãn trong từng đường dẫn ti. Khi các biến hoặc một biểu thức có quan hệ với nhau, xác định bởi ràng buộc, có hai trường hợp, được xác định bởi quan hệ giữa hai miền của biến. Nếu hai miền của biến xác định khơng giao nhau thì các ràng buộc có sẵn là thỏa mãn hoặc khơng thỏa mãn. Nếu hai miền xác định một tập hợp các giá trị giao nhau thì có giá trị thỏa mãn, có giá trị khơng thỏa mãn. Khi đó sử dụng thuật tốn GetSplit để tìm các miền giá trị của biến để thỏa mãn các ràng buộc. GetSplit chấp nhận hai miền, chỉ số tìm kiếm để tìm các miền mới mà ràng buộc sẽ đúng cho tất cả các giá trị trong các miền mới. Ban đầu, một giá trị trong hai miền được chọn để làm điểm chia ra thành các miền con, điểm đó là split. Điểm chia này được lựa chọn trong trường hợp hai miền khơng giao nhau thì mỗi miền giảm đi bởi số lượng xấp xỉ bằng nhau. Nếu một điểm chia được lựa chọn là khơng hợp lệ thì kết quả các miền được chia khơng thích hợp với những ràng
buộc sau đó. Nếu điểm chia được chọn tạo ra các ràng buộc sau đó là khơng khả thi thì GetSplit được sử dụng để tìm kiếm một điểm chia tốt hơn. Trong suốt quá trình tìm kiếm, điểm chia được liên tục đánh giá lại sử dụng chia làm hai đoạn, điểm chia này được di chuyển một nửa theo một hướng, và phần còn lại di chuyển trong nửa kia, cứ làm như vậy cho đến khi:
Trѭӡng hӧp 1: Trѭӡng hӧp 2: Trѭӡng hӧp 3: Trѭӡng hӧp 4: Top Bottom Bottom Top Left Right Top Top Bottom Bottom Left Right Top Bottom Bottom Top Left Right Top Bottom Left Right Bottom Top
Hình 4.4: Tính điểm chiasplit phụ thuộc các miền giá trị của biến trong [75].
i. Việc lựa chọn thành công trong trường hợp ca kiểm thử được tìm thấy.
ii. Tất cả các lựa chọn đều khơng thể tiếp tục.
iii. Số lần lựa chọn k được xác định để thực hiện (để tránh tìm kiếm vơ hạn).
Các đầu vào của hàm thủ tục GetSplit là các miền cho hai biểu thức bên trái và bên phải (Left và Right) và số lần lặp của tìm kiếm được thực hiện(SrchIndex= 1,2,3, v.v.). Biểu thức bên trái có một miền giới hạn (Lef t.Bot..Lef t.T op) và miền giới hạn cho biểu thức bên phải là: (Right.Bot..Right.T op). Một điểm chia được tìm thấy dựa trên các miền đưa ra, và trả lại các miền của các biến đã được giảm. Thuật toán sử dụng bốn trường hợp phụ thuộc vào mối quan hệ giữa
Lef t và Right. Bốn trường hợp được biểu diễn thuật toán GetSplit trong Thuật
toán 4.4 và thể hiện rõ ràng hơn ở Hình 4.4 theo thứ tự xuất hiện trong thuật toán GetSplit. Trong trường hợp đầu tiên, các miền của biểu thức bên trái hoàn toàn được chứa trong các miền của biểu thức bên phải; và trong trường hợp thứ hai, các biểu hiện bên phải là hoàn toàn được chứa trong các miền bên trái. Trong hai trường hợp cuối cùng, các miền chồng chéo lên nhau, nhưng không
được chứa trong các miền khác. Nếu hai miền không giao nhau, GetSplit là khơng cần thiết.
Thuật tốn 4.4 GetSplit(Left, Right, SrchIndx) - Tìm điểm chia split [75]
Input: Left: miền giá trị vế trái của biểu thức; Right: miền giá trị vế phải của biểu thức; (SrchIndex= 1,2,3, ...).
Output: Điểm chia split và split ≥ (Lef t.Bot AND Right.Bot) and split ≤
(Lef t.T opAND Right.T op).
1: Begin
2: Chọn exp để: 2exp ≤SrchIndx≤2exp+ 1
3: srchP t= (2exp−(2∗(22expexp−1)−1))
4: if(Lef t.Bot≥Right.Bot && Lef t.T op≤Right.T op)
5: split = (Left.Top - Left.Bot)*srchPt + Left.Bot
6: else if (Lef t.Bot≤Right.Bot && Lef t.T op≥Right.T op)
7: split = (Right.Top - Right.Bot)*srchPt + Right.Top
8: else if (Lef t.Bot≥Right.Bot && Lef t.T op≥Right.T op)
9: split = (Right.Top - Left.Bot)*srchPt + Left.Bot
10: else
11: split = (Left.Top - Right.Bot)*srchPt + Right.Bot
12: end if
13: return split
14: End
Sau khi các miền được giảm xuống bởi các thuật toán giảm miền, trạng thái của các miền được đánh giá lại. Nếu các giá trị của các miền mới thỏa mãn các vị từ thì thủ tục hoặc đi tới nút tiếp theo hoặc nút hiện tại là nút đích, q trình tìm kiếm hồn thành. Nếu biến bên trái bất kỳ với miền giá trị bao gồm nhiều hơn một giá trị thì bất kỳ giá trị nào trong miền đó đều sẽ thỏa mãn các yêu cầu kiểm thử, và một giá trị có thể chọn tùy ý. Nếu các giá trị của miền mới khơng thỏa mãn ràng buộc, q trình tìm kiếm được thực hiện quay lại nút quyết định gần nhất trên ti và cố gắng thỏa mãn các vị từ lần nữa bằng cách sử dụng một điểm chia khác. Nếu có q nhiều lần thực hiện để tìm một điểm chia khả thi tại các nút quyết định gần nhất (nhiều hơn k điểm chia với GetSplit), thủ tục lại tiếp tục quay lại nút quyết định trước đó trong CFG (k là hằng số xác định trước). Nếu khơng có nút quyết định trước nào thì thủ tục bỏ qua đường dẫn ti và tiếp tục sang đường dẫn tiếp theo trong T.
Với các kịch bản kiểm thử được duyệt, các biến được kiểm tra tự động, đối với tốn tử vịng lặp khi DN được đánh dấu và đếm, số lần duyệt DN là số vịng lặp mi được tính theo Thuật tốn 4.3. Vì vậy, cũng tương đương việc xét
độ bao phủ trong kiểm thử vòng lặp với từng trường hợp. Nếu biến khơng thỏa mãn ràng buộc, thủ tục sẽ thốt khỏi vịng lặp và tiếp tục duyệt kịch bản tiếp theo đến nút sau vòng lặp. Miền được giảm ở cuối của thủ tục đưa ra các miền giá trị biến khả thi cho một kịch bản kiểm thử.
Trong thủ tục sinh dữ liệu kiểm thử, vòng lặp được thực hiện tự động. Thủ tục tìm tất cả các kịch bản bao gồm mi vịng lặp. Thuật tốn đánh dấu số lượng các DN được duyệt để sinh các dữ liệu kiểm thử trong các trường hợp của độ bao phủ lặp. Các kịch bản kiểm thử được duyệt khi DN được đếm, các ràng buộc trong từng bước lặp được giải quyết từng bước và các biến được kiểm tra tự động để quyết định liệu tiếp tục sang lần lặp khác hay không. So sánh với [75], nếu biến luôn thỏa mãn trong lần lặp tiếp theo, thủ tục thốt khỏi vịng lặp khi sinh dữ liệu kiểm thử khi DN được duyệt là mi vòng lặp. Trong [75, 65] cho toán tử lặp, tiêu chuẩn bao phủ thỏa mãn ít nhất một kịch bản trong vòng lặp nghĩa là thân của vòng lặp chỉ thực thi một lần. Phương thức đề xuất là kịch bản kiểm thử gồm dữ liệu kiểm thử được sinh ra nếu thỏa mãn các ràng buộc trên các đường dẫn trong các trường hợp tương ứng của độ bao phủ lặp.
Ưu điểm với xử lý mảng và vòng lặp
Mảng và vòng lặp là các đặc trưng ngơn ngữ khó để xử lý theo cách truyền thống trong các hệ thống sinh dữ liệu kiểm thử. Chúng có tính chất động, do đó khó để giải quyết nếu sử dụng phân tích hồn tồn tĩnh. Nhiều hệ thống kiểm thử (như Godzilla [26], Atac [54], và Asset [38, 37]) làm đơn giản hóa mảng, thường xử lý từng phần tử của mảng như một biến, tham chiếu đến bất kỳ các phần tử khác trong mảng tương tự.
Trong vòng lặp thường xử lý đơn giản hóa hoặc bỏ qua. Trong Godzilla xử lý các vòng lặp bằng việc xem xét các điều kiện đầu vào và đầu ra; số lần lặp của vòng lặp thường bị bỏ qua. Tuy nhiên, trong nhiều trường hợp bị gây ra lỗi đối với kiểm thử vòng lặp. Điểm mới của phương pháp sinh dữ liệu kiểm thử là thủ tục xử lý động đối với mảng và vòng lặp. Thủ tục giảm miền động cho phép tham chiếu đến trong quá trình thực thi. Mỗi phần tử trong mảng có thể được sử dụng như một biến riêng biệt. Để thực hiện việc này, chỉ số của mảng được sử