Chuyển đổi biểu đồ tuần tự UML thành CFG

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 55 - 71)

3.3 Phương pháp sinh dữ liệu kiểm thử cho biến kiểu dữ liệu số và

3.3.2 Chuyển đổi biểu đồ tuần tự UML thành CFG

Có ba loại mơ hình trung gian có thể chọn để sinh ra các kịch bản kiểm thử từ biểu đồ tuần tự UML là: mơ hình hoạt động, mơ hình Petri và các loại đồ thị [89]. Luận án chọn CFG là đồ thị trung gian để sinh ra các dữ liệu kiểm thử. Kế thừa từ phương pháp trong [72] đã áp dụng cho năm loại toán tử: alt, opt, break, loop và parallel; thuật toán sinh CFG cải tiến áp dụng cho tất cả mười hai loại toán tử và trong các trường hợp lồng nhau của biểu đồ tuần tự UML 2.0. Các thông tin trong CFG được chuyển từ biểu đồ tuần tự UML 2.0 và các ràng buộc trong các lớp tương ứng của biểu đồ lớp.

Điểm mới của phương pháp chuyển đổi CFG đưa ra so với [72] là: phát triển thêm cho các toán tử weak sequencing, strict, critical, ignore, consider, assert và negative và cải tiến đối với toán tử parallel. Việc chuyển đổi sang CFG của toán tử parallel trong nghiên cứu [72] là chuyển từng toán hạng tương ứng với các nút của đồ thị, trong khi đó ở phương pháp đề xuất thì chuyển đổi từng thơng điệp tương ứng với từng nút để thuật toán sinh các đường dẫn kiểm thử có thể thực hiện đan xen nhau (trong Chương 4). Việc sinh CFG từ biểu đồ tuần tự được sử dụng thuật toán đệ quy, và các ràng buộc của các biến được thêm vào từ biểu đồ lớp để sinh dữ liệu kiểm thử.

Ý tưởng phương pháp sinh CFG: Đầu tiên, việc sinh cấu trúc dữ liệu của biểu đồ tuần tự tạo nên hàng đợi bao gồm: thơng điệp (message), tốn tử (fragment) và toán hạng (operand). Hàm lặp gọi là processElement* với mục đích sinh ra các loại nút khác nhau từ hàng đợi. Mỗi bước lặp, nó phân tích mỗi

phần tử của hàng đợi để tạo nút ra tương ứng, cạnh tạo ra được nối từ nút hiện tại với nút ra tương ứng đó, sau đó nút ra đó lại được xem như nút hiện tại. Bởi vì các tham số của một thông điệp trong biểu đồ tuần tự thiếu các thông tin về ràng buộc và kiểu dữ liệu của chúng, do đó các ràng buộc này sẽ được lấy từ biểu đồ lớp và cập nhật vào từng thông điệp. Thuật toán 3.1 được kế thừa dựa vào phương pháp trong [72, 70]. Thuật tốn phân tích các phần tử của biểu đồ tuần tự trong trường hợp các toán tử lồng nhau, áp dụng cho tất cả các toán tử của biểu đồ UML 2.0. Thuật toán đưa ra bắt buộc chuyển biểu đồ tuần tự thành dạng file xmi, sử dụng phân tích biểu đồ tuần tự xmi để tạo ra hàng đợi tương ứng [70]. Cấu trúc dữ liệu của biểu đồ tuần tự là một mảng các phần tử gồm có các thơng điệp, các tốn tử và toán hạng. Tất cả các phần tử được sắp xếp theo đúng trình tự của biểu đồ tuần tự đưa vào.

Đầu vào của Thuật toán 3.1 là file xmi của biểu đồ tuần tự, các quy tắc để viết file xmi được mô tả như sau:

ˆ <sequence> và <\sequence> là cặp thẻ bắt đầu và kết thúc của file xmi. ˆ Cặp thẻ <fragment> và <\fragment> là bắt đầu và kết thúc một toán tử.

Trong fragment gồm trường id, type và operator lần lượt là mã xác định, loại và tốn hạng của tốn tử đó.

ˆ Cặp thẻ <operand> và <\operand> là bắt đầu và kết thúc của các toán hạng bên trong toán tử, bắt buộc phải nằm giữa hoặc ngay sau cặp thẻ khai báo toán tử; bao gồm id và loại toán hạng type.

ˆ Thẻ <lifeline> bắt đầu trục thời gian; bao gồm id, trường type và tên (name) của đường sống (lifeline).

ˆ Cặp thẻ <message> và <\message> là bắt đầu và kết thúc của một thông điệp; Trong message gồm các trường id, type, name (tên thông điệp), sendEvent là id của lifetime của đầu thông điệp, receivedEvent là id của lifetime của cuối thông điệp.

ˆ Thẻ <constraint> gồm các ràng buộc trong các fragment và operand, bao gồm trường id, type, condition (điều kiện). Trong toán tử ignore được dùng để khai báo các thơng điệp bị loại bỏ, trong tốn tử consider là các thơng điệp cần giữ lại.

Ă͗ Ă͗ ď͗ ůŽŽƉ Đ͗ Đ͗ Ăůƚ ΀Ă΁ ΀ď΁ ŵϭ;Ϳ ŵϮ;Ϳ ŵϯ;Ϳ ŵϰ;Ϳ ŵϱ;Ϳ

Hình 3.3: Ví dụ biểu đồ tuần tự UML.

<sequence>

<lifetime type=”Lifetime” id=”001” name=”a:A”> <lifetime type=”Lifetime” id=”002” name=”b:B”> <lifetime type=”Lifetime” id=”003” name=”c:C”>

<fragment type=”CombinedFragment” id=”004” operator=”loop”> <operand type=”Operand” id=”005”>

<fragment type=”CombinedFragment” id=”006” operator=”alt”> <operand type=”Operand” id=”007”>

<constraint type=”Constraint” id=”008” condition=a>

<message type=”Message” id=”009” name=”m1” sendEvent=”001”

receivedEvent=”002”/>

<message type=”Message” id=”010” name=”m2” sendEvent=”002”

receivedEvent=”003”/> </operand>

<operand type=”Operand” id=”011”>

<constraint type=”Constraint” id=”012” condition=b>

<message type=”Message” id=”013” name=”m3” sendEvent=”001”

receivedEvent=”003”/>

<message type=”Message” id=”014” name=”m4” sendEvent=”003”

receivedEvent=”002”/>

<message type=”Message” id=”015” name=”m5” sendEvent=”002”

receivedEvent=”001”/> </operand> </fragment> </operand> </fragment> </sequence>

Thuật tốn 3.1 Sinh đồ thị dịng điều khiển (CFG), phát triển từ [72]

Input: D: Biểu đồ tuần tự; CD: Biểu đồ lớp.

Output: Đồ thị G: (A, E, in, F) ở đó A là một tập các nút (gồm BN, DN, MN, FN

và JN); in là nút khởi tạo và F là tập hợp các nút kết thúc của đồ thị; E là tập các cạnh của đồ thị G.

1: create initial node in, node x;

2: create empty queue;

3: create curP os point at start element of sequence diagram inxmi;

4: repeat

5: curP os read each element of sequence diagram to add to queue //used in [70]

6: curP os move to next Element;

7: until curP os meets end element of xmi file

8: x = processElement(queue,CD,in);

9: if x6=f inalN odethen

10: create final Node f n∈F;

11: Connect edge fromx to f n;

12: end if

13: return G;

Đầu vào của Thuật toán 3.1 là biểu đồ tuần tự và biểu đồ lớp tương ứng. Khởi tạo nút bắt đầu in, nút x và hàng đợi queue rỗng (dòng 1, 2). Con trỏ

curP os trỏ đến phần tử đầu tiên của biểu đồ tuần tự trong file xmi (dòng 3).

Vòng lặp từ dòng 4đến7là con trỏcurP os lần lượt trỏ đến các phần tử và thêm vào hàng đợi queue. Kết thúc của vòng lặp (dòng7) là cấu trúc dữ liệu hàng đợi

tương ứng với file đầu vào xmi. Hàm processElement trả về nút ra tương ứng x

(dòng 8). CFG được sinh ra từ nút bắt đầu in kết nối theo thứ tự các nút ra được trả về từ hàm processElement, cạnh cuối cùng được tạo ra từ nút ra x nối với nút kết thúc fn (dòng11). Đầu ra của thuật toán là đồ thị G.

Thuật toán 3.2 phân tích từng phần tử của hàng đợi và trả về các nút khác nhau. Nút bắt đầu in được coi như nút hiện tại curN ode, mỗi phần tử của hàng

đợi được lấy ra từ hàm queue.pop(). Phụ thuộc vào các phần tử được bao gồm

trong hàng đợi này, hàm đưa ra được gọi đệ quy tương ứng. Do đó, có năm loại nút tương ứng trong đồ thị đó là BN, DN, M N, F N và J N. Ngoài ra, mỗi phần tử của biểu đồ tuần tự phân biệt hai loại nút: nút vào và nút ra. Nút vào là nút hiện tại nơi được kết nối từ ngồi bởi cạnh vào và do đó có các tham số đầu vào cho hàm. Nút ra là nút được kết nối bởi các cạnh đi ra, do đó có giá trị trả về của hàm đó. Khi phần tử được đưa ra từ biểu đồ tuần tự là một thơng điệp m

Thuật tốn 3.2 Phân tích hàng đợi tạo các nút tương ứng trong CFG, phát triển [72]

Input: Biểu đồ lớp: CD, Hàng đợi: queue, Nút hiện tại: curN ode∈A

Output: exitN ode∈A

1: function processElement(queue, CD: classdiagram, curNode:A): A;

2: while (queue!= empty) do

3: x = queue.pop();

4: if (x==message) then

5: BN = CreateBlockNode(); //create BN is message or a set of message

6: for each message m ∈B do

7: get receiver class in r.className;

8: msg = returnMsgStructure(CD,r.className,m);

9: attr =returnAttributeStructure(CD,r.className);

10: for (all variables in m) do

11: attachAttributeInfor(attr,m);//attach constraint c[i] to m

12: end for

13: ConnectEdge(curNode,BN); curN ode=BN

14: exitNode =BN;

15: end for

16: else if (x is ‘alt’ or ‘opt’ fragment) then

17: exitNode= processAltOpt(x,curNode);

18: else if (x is ‘loop’ or ‘break’ fragment) then

19: exitNode= processLoopBreak(x,curNode);

20: else if (x is ‘parallel’ or ‘sequencing’ fragment) then

21: exitNode= processParSequence(x,curNode);

22: else if (x is ‘strict’ or ‘critical’ fragment) then

23: processStrictCritical(x,curNode);

24: else if (x is ‘consider’ fragment)then

25: processConsider(x,curNode);

26: else if (x is ‘assert’ fragment) then

27: processAssert(x,curNode);

28: else if (x is ‘negative’ fragment)then

29: processNegative(x,curNode);

30: else if (x is ‘ignore’ fragment) then

31: processIgnore(x,curNode);

32: end if

33: return exitNode;

34: end while

thì lớp nhận của thơng điệp m được xem xét. Phương thức tương ứng là phương thức gọi được sử dụng hàm returnM sgStructure. Cho các ràng buộc

được cập nhật vào thông điệp mi và hàm returnAttributeStructure() là hàm trả về các thuộc tính của lớp tương ứng với thơng điệp mi đang xét. Hàm để thực hiện lấy các ràng buộc là attachAttributeInf o(). Sau khi tạo nút tương ứng, nút

hiện tại sẽ được nối với nút vừa tạo và sau đó nút này lại được xem xét như nút hiện tại. Theo thuật toán này, CFG được sinh ra từ biểu đồ tuần tự có thể bao gồm các loại tốn tử lồng nhau ở nhiều mức.

Khi phân tích file xmi, hàng đợi queue được tạo ra tương ứng theo đúng trình tự của biểu đồ tuần tự đưa vào. Lần lượt lấy các phần tử của hàng đợi (dòng3) cho đến khi hàng đợi queuerỗng (vòng lặp từ dòng2đến34). Nếu phần

tử lấy ra từ hàng đợi là thơng điệp (dịng 4) thì tạo BN và thơng tin của BN

chính là thơng điệp hoặc tuần tự các thơng điệp. Với mỗi thơng điệp m (dịng

6) thì lấy thơng tin về lớp nhận và tham số của phương thức (về kiểu dữ liệu

và các ràng buộc tương ứng trong biểu đồ lớp) được gắn vào từng thơng điệp m

(dịng 7 đến dịng 12). Sau đó, nối nút hiện tại curN ode với BN được tạo ra và

BN được coi như nút hiện tại (dòng 13); dòng 14 chỉ ra việc thực hiện gán BN

cho exitN ode (là nút để trả về cho Thuật toán 3.1).

Nếu phần tử lấy ra từ hàng đợi là toán tử alt hoặc opt thì thực hiện gọi hàm

processAltOptđể xử lý tốn tửalthayopttương ứng (dòng16và dòng17). Tương

tự việc xử lý với mười tốn tử cịn lại thì gọi các hàm xử lý tương ứng (từ dòng

18 đến dòng 31). Đối với một số toán tử alt, opt, loop, break, par và seq có nút

ra của các tốn tử (là loại nút M N, J N trong CFG được chuyển đổi) nên các hàm có giá trị trả về là các nút đó. Sau mỗi lần tạo ra nút đầu ra thì đều trả nút exitN ode đó cho Thuật tốn 3.1 (dịng 33).

Độ phức tạp của thuật toán: Trong Thuật toán 3.1, giả sử hàng đợiqueuecó

n phần tử khi đó độ phức tạp của thuật tốn là: max{O(n), O(processElement)}.

Do đó, chúng ta quan tâm đến O(processElement). Trong Thuật toán 3.2 tất cả

các hàm gọi xử lý cho từng tốn tử đều có nhiều nhất một vịng lặp m phần tử, do đó độ phức tạp của các hàm con lớn nhất là O(m)độ phức tạp tuyến tính. Vì vậy, độ phức tạp của Thuật tốn 3.2 chính là độ phức tạp của đoạn dịng lệnh từ6 đến15. Độ phức tạp của đoạn dịng lệnh đó được tính gồm ba vịng lặp lồng

nhau: vòng lặp trong cùng tối đa x biến của một thơng điệp, vịng lặp thứ hai duyệt tối đa số lượng thơng điệp m và vịng lặp ngoài cùng duyệt tối đa n phần tử của hàng đợi queue. Vì vậy, độ phức tạp của thuật tốn là O(n∗m∗x). Như

vậy, tính dừng của Thuật tốn 3.2 như sau: trong trường hợp lặp nhiều nhất là

(n∗m∗x) lần, tuy nhiên với các biểu đồ tuần tự luôn xác định được số biến tối đa của một thông điệp, số thông điệp m và số toán hạng và các toán tử của biểu đồ. Do vậy, (n∗m∗x) luôn xác định, nghĩa là sau một số hữu hạn các bước thì thuật tốn sẽ kết thúc.

Sau đây là các hàm xử lý và minh họa cho việc chuyển sang đồ thị dòng điều khiển của mười hai toán tử của biểu đồ tuần tự UML 2.0.

Thuật toán xử lý toán tử alt và opt: Kế thừa từ phương pháp trong [72], Thuật toán 3.3 xử lý với từng loại phần tử tương ứng của toán tửalt hoặcoptđược lấy từ hàng đợi, với từng loại phần tử tạo các loại nút tương ứng. Nếu x lấy ra là toán tử alt hoặc opt (dịng 1) thì tạo DN tương ứng (dịng 2), sau đó nối DN với nút hiện tại curN ode(dòng 3). Trong trường hợp phần tử

lấy ra là tốn hạng và có điều kiện guard (dịng4) thì gán điều kiện vào cạnh ra

từ DN (dòng 5 và dòng 6). Nếu x là phần tử kết thúc của toán tử alt hoặc opt

(dịng7) thì M N được tạo ra (dòng9) và nối nút curN odevà MN vừa tạo (dòng

10), coi MN đó chính là điểm ra của phần đồ thị vừa tạo. Hình 3.5 minh họa

việc chuyển từ biểu đồ tuần tự UML với toán tử opt và alt sang CFG. Với tốn tử opt chỉ ra rằng: thơng điệp m1 tương ứng với loại nút BN lấy nhãn là B1, toán tử opt chuyển đổi tương ứng DN lấy nhãn là D1 và điều kiện [c] được gắn với cạnh ra, thông điệp m2 chuyển thành nút B2 tương ứng và kết thúc toán tử

opt là MN lấy nhãn M1; với toán tửalt tương ứng chỉ ra: chuyển đổi toán tử alt

thành DN nhãn D1, gán tương ứng điều kiện [c] đúng và sai tương ứng với hai nhánh m1 tạo nút B1 và m2 tạo nút B2 và kết thúc toán tử alt là MN lấy nhãn M1. Độ phức tạp của Thuật tốn 3.3 chính là độ phức tạp hằng số O(1). Tính

dừng của thuật tốn: trong thuật tốn chỉ là các câu lệnh tuần tự xác định và khơng có vịng lặp, vì vậy sau một số hữu hạn các bước thì thuật tốn sẽ dừng.

Thuật tốn xử lý tốn tử break và loop: Kế thừa từ phương pháp trong [72], Thuật toán 3.4 xử lý với từng loại phần tử tương ứng của toán tử

break, loop được lấy từ hàng đợi, với từng loại phần tử tạo các loại nút tương ứng. Nếu x lấy ra là toán tử break hoặc loop (dịng 1) thì tạo DN tương ứng

(dịng 2), sau đó nối DN với nút hiện tại curN ode (dòng 3). Trong trường hợp

phần tử lấy ra là toán hạng và có điều kiệnguard (dịng4) thì gán điều kiện vào

Thuật tốn 3.3 Xử lý toán tử alt và opt: processAltOpt(x, curN ode) [72]

Input: Toán tử x là alt hoặc opt lấy từ hàng đợi; nút hiện tại curN ode

Output: Nút ra exitN ode (là điểm ra của một phần CFG vừa sinh ra)

1: if (x==fragment) && (x.type ==‘alt’ or ‘opt’) then

2: Create a DN ;

3: ConnectEdge(curNode,DN);

4: else if (x==operand)&& (x.guard !=null) then

5: attachGuardtoEdge();//attach guard to edge

6: curNode = DN;

7: else if (x==‘EOF’) && (x.type ==‘alt’ or ‘opt’) then

8: //termination condition of fragment alt or opt

9: Create merge node MN;

10: ConnectEdge(curNode,MN);

11: exitN ode = MN;

12: return exitN ode;

13: end if m1() m2() a:A b:Bb:B opt [c] m1() a:A b:Bb:B m2() alt [!c] [c] [c] B2 M1 D1 B1 [!c] B1 [c] M1 B2 D1

phần tử kết thúc của tốn tử break (dịng7) thì nút hiện tại curN odelà BN được tương ứng với toán hạng trong tốn tử break, sau đó kết thúc. Nếu x là điểm kết thúc của vịng lặp (dịng10) thì gắn số vịng lặp vào cạnh và nối nút hiện tại

curN ode với DN, sau đó lại coi nút hiện tại là DN (dòng12 đến dòng 14). Cuối

cùng, nút hiện tại là exitN ode. Hình 3.6 minh họa việc chuyển đổi từ biểu đồ

tuần tự sang CFG của toán tử break, loop. Với tốn tử break nếu điều kiện [c] là đúng thì thơng điệp m1được tạo tương ứng với B1, sau đó thốt và khơng thực hiện các thơng điệp tiếp theo ngồi tốn tử break; nếu điều kiện [c] sai thì bỏ

qua thông điệp m1 và thực hiện chuyển đổi thông điệp m2 thành nút B2 tương ứng. Với toán tử loop bắt đầu kiểm tra điều kiện [c], tạo loại nút DN tương ứng đặt nhãn là D1, nếu điều kiện [c] đúng thơng điệp m chuyển thành nút B1, gán số vịng lặp nhỏ nhất 0 và số vòng lặp lớn nhất n vào cạnh tương ứng; trong trường hợp điều kiện [c] sai thì thốt khỏi vịng lặp và thực hiện chuyển đổi các thơng điệp sau vịng lặp thành các nút tương ứng (nếu có). Độ phức tạp của Thuật tốn 3.4 là độ phức tạp hằng số O(1) (vì khơng phụ thuộc vào độ lớn của đầu vào và khơng có vịng lặp). Tính dừng của thuật toán: trong thuật toán là

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 55 - 71)

Tải bản đầy đủ (PDF)

(175 trang)