Tính điểm chia split phụ thuộc các miền giá trị của biến trong [75]

Một phần của tài liệu (LUẬN án TIẾN sĩ) các kỹ thuật sinh tự động dữ liệu kiểm thử dựa trên các biểu đồ UML luận án TS máy tính 624801 (Trang 116 - 122)

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ử dụng như một biểu thức, và sau đó được sử dụng cho từng phần tử khác nhau của mảng, thực thi giảm miền động theo cách tương tự cho các biến khác.

Hầu hết các kỹ thuật hiện tại xử lý các vịng lặp bằng cách tìm tất cả các đường dẫn khả thi từ nút bắt đầu cho tới các nút đích. Nếu cấu trúc vòng lặp trong CFG, các vòng lặp được thực thi và số lượng đường dẫn giữa hai nút là vơ hạn. Do đó, các ràng buộc trong các nút quyết định và các biến điều khiển của cấu trúc vòng lặp cần phải được kiểm tra và cập nhật để quyết định đường dẫn được đưa ra. Các phương thức này đưa ra tất cả các đường dẫn có thể tìm thấy, có nhiều đường dẫn khơng thỏa mãn ràng buộc vịng lặp vẫn đưa ra. Vì vậy, rõ ràng cách tiếp cận đó không hiệu quả và tốn thời gian thực thi.

Trong thủ tục được cải tiến, vòng lặp được xử lý tự động. Thay thế vào việc tìm tất cả các đường dẫn có thể, thủ tục tìm tất cả các đường dẫn có chứa ít nhất một cấu trúc vịng lặp. Sau đó đánh dấu những nút quyết định đó ảnh hưởng đến lần lặp tiếp theo của vòng lặp được thực hiện. Khi những đường dẫn được duyệt qua, nút quyết định được đếm, các ràng buộc điều kiện của vòng lặp và biến điều khiển được tự động kiểm tra để quyết định liệu có tiếp tục sang lần lặp tiếp theo hoặc thốt khỏi vịng lặp. Nếu biến điều khiển thỏa mãn ràng buộc, lần lặp tiếp theo được thực hiện và biến điều khiển vịng lặp được cập nhật, nếu khơng thỏa mãn thì thốt khỏi vịng lặp và tiếp tục duyệt nút tiếp theo sau vòng lặp của đường dẫn đang duyệt. Điều này giúp loại bỏ sự cần thiết không lặp lại vịng lặp, cho phép các chương trình được xử lý thực tế hơn. Như vậy, phương pháp đề xuất sinh các kịch bản kiểm thử bao 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 với mi lần lặp.

Độ phức tạp của Thuật toán: Thời gian thực thi của thủ tục phụ thuộc vào số lượng các nút quyết định (D), số lượng đường dẫn (T), và các hằng số k (số điểm chia). Hơn nữa, nếu thủ tục đi qua k điểm chia tại mỗi nút quyết định, nếu có k điểm chia tại nút đầu tiên, sau đó k điểm chia ở nút quyết định thứ hai, v.v. Do đó, trường hợp xấu nhất là tổng có kD điểm chia. Vì vậy, độ phức tạp là

T ∗kD. Mặc dù, trường hợp xấu nhất là hàm mũ, nhưng trường hợp này có thể khá hiếm xảy ra trong thực tế. Vì các ràng buộc trong các biểu đồ UML thực tế không thể lúc nào tại tất cả các nút quyết định trên T cũng có k điểm chia. Tính dừng của thuật tốn: vì trong CFG số nút quyết định D, số đường dẫn T

và số điểm chia k đều xác định, do đó thuật tốn sẽ dừng sau một số hữu hạn các bước. Di chuyển qua các CFG động cho phép các ràng buộc trên các đường

dẫn được giải ngay, nó sẽ hiệu quả hơn về mặt không gian lưu trữ và thời gian thực hiện, và thường thành công hơn so với kiểm thử dựa trên các ràng buộc. Đặc trưng động của thủ tục này cũng cho phép cải tiến được áp dụng cho mảng, vòng lặp. Phương pháp này kết hợp các cách tiếp cận của kiểm thử dựa trên ràng buộc, thủ tục giảm miền, thực thi tượng trưng và cách tiếp cận sinh dữ liệu kiểm thử động. Phương pháp tích hợp giải quyết thỏa mãn các ràng buộc, thực thi tượng trưng và tiến trình tìm kiếm vào trong một tiến trình động.

Như vậy, điểm mới của phương pháp sinh dữ liệu kiểm thử khi so sánh với nghiên cứu trong [72, 75] là phương pháp cải tiến việc sinh dữ liệu kiểm thử theo các độ bao phủ lặp khác nhau, phụ thuộc vào đặc điểm các tham số khác nhau trong toán tử loop của biểu đồ tuần tự để sinh dữ liệu kiểm thử tương ứng.

4.3.3.2 Bài toán minh họa

Minh họa phương pháp trên bằng bài toán về giao dịch ngân hàng với chức năng chuyển tiền. Đối tượng bank là đối tượng chính của ứng dụng tạo ra hai luồng thread1 và thread2. Hai luồng này xử lý việc chuyển tiền giữa hai tài khoản là tài khoản tiết kiệm (accSaving) và tài khoản hiện tại (accCurrent). Các thao tác (phương thức) chuyển tiền được sử dụng tốn tử song song (par), nó biểu diễn việc thực thi đồng thời của các thơng điệp trong tốn tử này. Giả sử rằng với tài khoản hiện tại người sử dụng có thể rút năm lần trong một ngày. Chức năng minh họa tương đối nhỏ nhưng có tất cả các đặc trưng của phương pháp cải tiến (có các luồng đồng thời trong toán tử song song và vịng lặp trong các tốn hạng). Hình 4.5 biểu diễn biểu đồ tuần tự UML 2.0 của chức năng chuyển tiền qua tài khoản, để ngắn gọn chỉ biểu diễn biểu đồ lớp (Hình 4.6) của các lớp liên quan được bao gồm trong chức năng đưa ra.

Sinh CFG: theo thuật toán đưa ra, việc sinh ra CFG từ biểu đồ tuần tự UML 2.0 và biểu đồ lớp được đọc từ file XMI, Hình 4.7 biểu diễn CFG sinh ra của bài toán áp dụng. Để sinh ra các kịch bản kiểm thử, duyệt CFG theo thuật toán đưa ra trong phần 4.3.2. Cho các hệ thống có các luồng song song và có sự chia sẻ dữ liệu, bằng việc sử dụng theo tiêu chuẩn bao phủ tương tranh mạnh thì các tuần tự kiểm thử được sinh ra và có sự đan xen giữa các thơng điệp trong các luồng song song; có bốn kịch bản kiểm thử được sinh ra gồm:

m8:deposit(y) m7:withdraw(y) m6: transfer(accSaving,y) m5:newTransfer() m4:deposit(x) m3:withdraw(x) m1:newTransfer()

bank thread1 thread2 accSaving accCurrent

par Transfer

loop y < balance m2:transfer(accCurrent,x)

Hình 4.5: Biểu đồ tuần tự của chức năng chuyển tiền trong hệ thống ngân hàng.

(Start−F N1−M1−M5−M2−M3−M4−M6−D1−M8−J N1−End)

(Start−F N1−M5−M6−M1−M2−D1−M7−D1−M8−M3−M4−J N1−End)

(Start−F N1−M5−M6−M1−M2−D1−M8−M3−M4−J N1−End)

Thuật toán sinh các dữ liệu kiểm thử: xem xét kịch bản T3 = (Start−

F N1−M5−M6−M1−M2−D1−M7−D1−M8−M3−M4−J N1−End),

việc sinh dữ liệu kiểm thử cho kịch bản T3 được minh họa như sau: vị từ được chỉ ra gắn với cạnh, các ràng buộc và loại dữ liệu của biến được gắn kèm trong các BN. Các biến số lượng tiền được rút từ hai tài khoản tiết kiệm và tài khoản hiện tại là x, y và số dư là balance. Tất cả các biến này từ biểu đồ lớp có kiểu

dữ liệu nguyên. Các miền khởi tạo của các biến đầu vào x,y, balance có miền giới hạn là: x, y : [50,50000]và balance: [100,65535] (vìbalance≥100 và balance là biến nguyên). Giả sử T3 với hai vịng lặp, thuật tốn đánh dấu và đếm loại nút

DN (nhãn D1) được duyệt qua. Nếu qua D1 hai lần thì đường dẫn kiểm thử là:

start−M5−M6−M1−M2−D1−M7−D1−M7−D1−M8−M3−M4−end. Đường

dẫn con là M5−M6−M1−M2 đưa ra khơng có vị từ đi kèm nên khơng làm thay đổi giá trị của biến. Để lấy nhánh từ nút D1 đến M7, vị từ y ≤balance và

* 1

* OCL attribute constraints

1. context Account inv: self.balance ≥100 2. context Account inv:

self.number ≤ 50000 3. context Account inv:

self.number ≥ 50 * * 1 Bank + code +manager() Customer +pin Account +balance +deposit(num) +maintain() + address +numberAcc +withdraw(num) +transfer(num) +num +verifyPassword() +name +cardNumber +addressCus

Một phần của tài liệu (LUẬN án TIẾN sĩ) các kỹ thuật sinh tự động dữ liệu kiểm thử dựa trên các biểu đồ UML luận án TS máy tính 624801 (Trang 116 - 122)