Kiểm chứng biểu đồ tổng quát

Một phần của tài liệu LUẬN VĂN: KIỂM CHỨNG CÀI ĐẶT BIỂU ĐỒ TƯƠNG TÁC VỚI UML 2.0 pdf (Trang 43 - 56)

1. 4 Cấu trúc khóa luận

4.2.3.Kiểm chứng biểu đồ tổng quát

37

Hình 4.2.3.1: Biểu đồ trình tự sử dụng nhiều đoạn gộp

Giao thức trên chứa các đoạn gộp alt, opt, loop, break.

4.2.3.2. Kiểm chứng giao thức

Aspect được sinh ra :

public aspect All{

int loop2 = 0 ;

private boolean isError = false ;

private int numError = 0;

private ArrayList<String> Id = new ArrayList<String>();

38

pointcut AllChecked() :call(@Implement * m9())||call(@Implement *

m8())||call(@Implement * m6())||call(@Implement * m7())||call(@Implement * m5())||call(@Implement * m4())||call(@Implement * m3())||call(@Implement * m2())||call(@Implement * m1||call(@Implement * m0());

before() : AllChecked(){

String nameThisAspect = this.getClass().toString();

nameThisAspect=nameThisAspect.substring( nameThisAspect.lastIndexOf(".") + 1, nameThisAspect.length());

String CallMethod = getNameMethod(thisJoin-pointStaticPart);

String AnnotationOfMethod= getAnnotationOfMethod(thisJoin-pointStaticPart); if(isPart(nameThisAspect,AnnotationOfMethod) == false) return; if(Id.isEmpty()) Id.add("0"); if(listEnd.isEmpty()){ listEnd.add("6"); listEnd.add("10"); } isError = true;

ArrayList<String> l = new ArrayList<String>(); ArrayList<String> target = new ArrayList<String>(); if( CallMethod.equals("* m9()")){ l.add("9"); target.add("10"); } else if( CallMethod.equals("* m8()")){ l.add("8"); target.add("9"); } else if( CallMethod.equals("* m6()")){ l.add("6"); target.add("9"); l.add("5"); target.add("7"); } else if( CallMethod.equals("* m7()")){ l.add("6"); target.add("8");

39 } else if( CallMethod.equals("* m5()")){ l.add("5"); target.add("6"); } else if( CallMethod.equals("* m4()")){ l.add("4"); target.add("5"); l.add("3"); target.add("5"); } else if( CallMethod.equals("* m3()")){ l.add("3"); target.add("4"); } else if( CallMethod.equals("* m2()")){ l.add("2"); target.add("3"); l.add("1"); target.add("3"); } else if( CallMethod.equals("* m1()")){ l.add("2"); target.add("2"); l.add("1"); target.add("2"); } else if( CallMethod.equals("* m0()")){ l.add("0"); target.add("1"); } setIdIfTrue(l,target); if(isError == true){ numError ++;

System.out.println("goi sai o dong phuong thuc "+ CallMethod +" o dong thu "+thisJoin-pointStaticPart.getSourceLocation().getLine());

40 Id.clear(); Id = target ; } } after():AllChecked(){ if(Id.lastIndexOf("2")>=0) loop2++;

/*neu trang thai hien tai la trang thai opt thi thong bao*/

if(Id.lastIndexOf("4")>=0)

System.out.println("khoi opt thu 1 bat dau bang * m3() duoc su dung "+" o dong thu : "+thisJoin-pointStaticPart.getSourceLocation().getLine());

/*Neu trang thai hien tai la trang thai break thi thong bao*/

if(Id.lastIndexOf("6")>=0)

System.out.println("khoi break thu 1 bat dau bang * m5() duoc su dung "+" o dong thu : "+thisJoin-pointStaticPart.getSourceLocation().getLine());

/*thong bao viec khoi alt duoc kich hoat neu trang thai hien tai la trang thai alt*/

if(Id.lastIndexOf("6")>=0){

System.out.println("khoi alt thu 1 bat dau bang * m5() duoc su dung "+" o dong thu : "+thisJoin-pointStaticPart.getSourceLocation().getLine()); (adsbygoogle = window.adsbygoogle || []).push({});

}

for(int i = 0; i < listEnd.size(); i ++) if(Id.lastIndexOf(listEnd.get(i)) >=0){

System.out.println("vong loop thu 1bat dau bang phuong thuc* m1() duong goi "+loop2+ "lan");

if(numError > 0) System.out.println("so loi hien tai : " + numError); }

} }

Tiếp theo đây, tôi sẽ xây dựng một số bài kiểm tra để minh chứng sự hoạt động của aspect sinh ra.

- Test1

o Chuỗi gọi hàm

m1() -> m2() -> m3() -> m4 -> m5() o Kết quả

41

Hình 4.2.3.2a: Kết quả test1 o Nhận xét

Chuỗi gọi hàm kết thúc do gọi đoạn gộp break.Khối loop được kích hoạt một lần, khối opt được kích hoạt. Chuỗi thứ tự các thông điệp đúng đặc tả. Kết quả mô tả chính xác. - Test2 o Chuỗi gọi hàm m1() -> m2() -> m3() -> m4 -> m6() -> m7() -> m8() o Kết quả Hình 4.2.3.2b: Kết quả test2 o Nhận xét

Chuỗi gọi hàm kết thúc ở khối alt, với lựa chọn thứ nhất. Trong ví dụ này, các đoạn gộp loop, alt, opt được sử dụng. Đoạn gộp break không được sử dụng. Chuỗi gọi hàm đúng với đặc tả. Kết quả là đúng.

- Test3

42

m1() -> m2() -> m3() -> m4 -> m6() -> m9() -> m10() -> m11() o Kết quả

Hình 4.2.3.2c: Kết quả test3 o Nhận xét

Tương tự như ví dụ trên, nhưng khối alt đi theo nhánh thứ hai. Kết quả mô tả đúng. - Test4 o Chuỗi gọi hàm m2()-> m4() -> m5() o Kết quả Hình 4.2.3.2d: Kết quả test4 o Nhận xét

Đoạn gộp loop, alt, opt không được sử dụng. Chuỗi gọi hàm đúng với đặc tả. Như vậy, kết quả mô tả là đúng.

- Test5

o Chuỗi gọi hàm

43 o Kết quả

Hình 4.2.3.2e: Kết quả test5 o Nhận xét

Chuỗi gọi hàm gọi thiếu hàm m6() so với đặc tả. Kết quả thông báo đúng. - Test6 o Chuỗi gọi hàm m1() -> m2() -> m3 -> m10() -> m4() -> m6()-> m7() -> m8() o Kết quả Hình 4.2.3.2f: Kết quả test6 o Nhận xét

Chuỗi gọi hàm sai ở 2 điểm :

 Thứ nhất: gọi sai hàm m10(). Sau hàm m3() lẽ ra phải gọi hàm m4().

44

 Thứ hai: Sau hàm m10() lẽ ra phải gọi hàm m11() nhưng lại gọi hàm m4()

Như vậy, kết quả mô tả là đúng.

4.3. Kết luận (adsbygoogle = window.adsbygoogle || []).push({});

Trong chương nay, tôi đã trình bày cách cài đặt công cụ của tôi dựa vào phương pháp “Kiểm chứng đặc tả UML”. Mã Aspect được sinh ra từ công cụ sẽ được đan xen vào chương trình trong thời gian chạy. Bước đầu tiên tôi đã kiểm chứng một số giao thức, để cho thấy công cụ của tôi sinh ra được Aspect phù hợp cho việc kiểm chứng.

45

Chương 5. Kết luận

Trong quá trình thực hiện khóa luận này, tôi đã tìm hiểu những kiến thức cơ bản về kiểm chứng phần mềm. Từ đó tôi đã phát triển phương pháp kiểm chứng dựa trên AOP và xây dựng công cụ tự động sinh Aspect.

Với sự phát triển từ công cụ PVG(Protocol Verification Generator), với mục tiêu kiểm chứng đặc tả cho UML. Tôi đã thay đổi để có thể kiểm chứng các đặc tả dùng cho UML 2, và khả năng tự động sinh ra Aspect có thể nói đã hoàn thiện, Ở công cụ PVG mới chỉ giải quyết được các giao thức đơn giản. Ở khóa luận này của tôi, tôi đã giải quyết được các trường hợp đa giạng, với các biểu đồ được thiết kế bằng UML 2 chứ không phải bằng Agent UML như ở công cụ PVG nữa.

Trong phương pháp này, Aspect được sinh ra se cắt ngang hệ thống để kiểm tra trong quá trình hoạt động. Từ biểu đồ trình tự UML được xuất ra dưới dạng tài liệu XMI. Tiếp đó, tiến hành phân tích tài liệu XMI để xây dựng máy trạng thái (FSM),. FSM sinh ra sẽ được xử lý để tạo lên Aspect cuối cùng phục vụ cho việc kiểm chứng. Áp dụng phương pháp này, tôi xây dựng công cụ có khả năng kiểm chứng cho các đoạn gộp cơ bàn của biểu đồ trình tự là đoạn gộp alt, opt, loop, break.

Tuy nhiên, tôi cũng vấp phải một số khó khăn trong quá trình thực hiện khóa luận như:

- Đối với các đoạn gộp trọng biểu đồ trình tự có thể có các điều kiện được kích hoạt khác nhau. Để có thể xử lý được thì cần phải biết được các thành phần trong điều kiện lấy ở đâu, do phương thức nào trả lại. Với các đặc tả trong UML2 và sự hạn chế của tài liệu XMI chưa thể giúp tôi giải quyết được vấn đề này.

- Hơn nữa, khi một hệ thống càng nhiều thành phần thì tài liệu XMI càng phức tạp, với các đoạn gộp không đan nhau thì công cụ của tôi có thể kiểm chứng được. Nhưng khi, trong thành phần chứa nhiều đoạn gộp lồng nhau như đoạn gộp loop lồng đoạn gộp alt thì tôi chưa giải quyết được.

46

Từ những vấn đề tồn tại trong khóa luận này, trong tương lai tôi sẽ tiếp tục hướng nghiên cứu này nhằm xây dựng hoàn thiện công cụ để đáp ứng mọi yêu cầu. Hướng phát triển gần nhất là phát triển công cụ của tôi để giải quyết vấn đề ràng buộc các đoạn gộp lồng nhau trong biểu đồ UML 2. Bên cạnh đó, tôi sẽ nghiên cứu và tìm phương pháp sinh mã Aspect không chỉ phụ thuộc vào tài liệu XMI mà còn phụ thuộc vào các ràng buộc điều kiện được mô tả bằng các dạng dữ liệu khác nhằm tăng tính ứng dụng của công cụ của tôi đối với công cụ sản xuất phần mềm hiện nay.

47

Phụ lục

Phụ lục A : Tài liệu XMI mô tả biểu đồ trình tự

<?xml version="1.0" encoding="UTF-8"?>

<xmi:XMI xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"

xmlns:uml="http://schema.omg.org/spec/UML/2.0" xmi:version="2.1">

<xmi:Documentation contact="www.altova.com" exporter="Altova UModel2010" exporterVersion="5"/> <xmi:Extension extender="UModel"> <OpenDiagrams activeDiagram="99713c9e-7097-4599-bc9d-3dc0f6bcf849"> <OpenDiagramEntry>99713c9e-7097-4599-bc9d-3dc0f6bcf849 </OpenDiagramEntry> </OpenDiagrams> <Diagrams> <uml:RootElement xmi:id="U00000002-7510-11d9-86f2-000476a22f44">

<guiRootGuiDiagram xmi:type="uml:SequenceDiagram" xmi:id="U99713c9e- 7097-4599-bc9d-3dc0f6bcf849"

name="SequenceDiagram1"guiDiagramLinkedOwner="U4e4e5952-d3e2-469d-8b90- 408ffb2bccb7">

<style heading="0" showgrid="0"/>

<guiDiagramGuiLink xmi:type="uml:NodeLink" xmi:id="U12bedce8-a4be- 4ab7-acbb-3bea544984e3" guiLink_Element="U062b2bd1-d560-4363-ba8c- 7d663ac2eccb">

<nodeRect Left="90" Top="117" Right="148" Bottom="291"/> <guiNodeLinkGuiNodeLink xmi:type="uml:NodeLink"

xmi:id="U944e3ffd-7bc9-4155-9e4f-bfb9fbe2e2ac"

guiLink_Element="Ud06ef543-4f3e-464c-986d-69a4172bec02"> <nodeRect Left="114" Top="196" Right="124" Bottom="216"/> </guiNodeLinkGuiNodeLink>

</guiDiagramGuiLink>

<guiDiagramGuiLink xmi:type="uml:NodeLink" xmi:id="U49706895-da20- 4d8a-aefd-9a219880c2c3" guiLink_Element="Ufa06c7e2-69f2-4d42-b402- 08ec7bcb49ae">

<nodeRect Left="405" Top="112" Right="463" Bottom="291"/> <guiNodeLinkGuiNodeLink xmi:type="uml:NodeLink"

xmi:id="Ud144707e-c922-462e-811d-f74d15d4bfad"

guiLink_Element="U36024712-db68-4a7f-9864-51d4a01852eb"> <nodeRect Left="429" Top="196" Right="439" Bottom="216"/> </guiNodeLinkGuiNodeLink> (adsbygoogle = window.adsbygoogle || []).push({});

</guiDiagramGuiLink>

<guiDiagramGuiLink xmi:type="uml:LineLink" xmi:id="U98a20301-218d- 40de-b85f-8e8138cabc2a" guiLink_Element="U569d4f18-efdc-4de9-8e58- 9b2824665662" guiLineLink_LineBegin="U12bedce8-a4be-4ab7-acbb- 3bea544984e3" guiLineLink_LineEnd="U49706895-da20-4d8a-aefd- 9a219880c2c3"> <guiLineLink_LineMiddleWaypoint xmi:type="uml:MiddleWaypoint" xmi:id="U56d45a9a-f195-4e15-874d-3857bd8ddac7"> <pos X="276" Y="196"/> <guiTextLabelWaypoint_TextLabel xmi:type="uml:TextLabel" xmi:id="U828871ef-a481-441e-b045-5e53a6655406" textLabel="15" guiTextLabel_Element="U569d4f18-efdc-4de9- 8e58-9b2824665662"> <pos X="-25" Y="-20"/> </guiTextLabelWaypoint_TextLabel> </guiLineLink_LineMiddleWaypoint> <guiLineLinkWaypoint xmi:type="uml:EndWaypoint" xmi:id="Uc64a4a22-4711-43e0-a617-f304b7374ee1" alignment="5"> <pos X="124" Y="196"/> </guiLineLinkWaypoint> <guiLineLinkWaypoint xmi:type="uml:EndWaypoint" xmi:id="Uc7b2c8f7-decc-45e8-be37-411d3f280ef3" alignment="5"> <pos X="429" Y="196"/> </guiLineLinkWaypoint> </guiDiagramGuiLink>

48

<guiDiagramGuiLink xmi:type="uml:SeparatedNodeLink" xmi:id="Ucfaa5dcb-51c4-40ff-b322-f15724033938"

guiLink_Element="U6ef60b4d-669a-46cd-993f-5a92a0d937be"> <style autosize="0"/>

<nodeRect Left="97" Top="171" Right="510" Bottom="240"/> </guiDiagramGuiLink>

<guiDiagramLayer xmi:type="uml:DiagramLayer" xmi:id="Ua35f9d4f-a660- 4baa-b976-30b29055f242" name="Default"/>

</guiRootGuiDiagram> </uml:RootElement>

</Diagrams> </xmi:Extension>

<uml:Package xmi:id="U00000001-7510-11d9-86f2-000476a22f44" name="Root"> <ownedMember xmi:type="uml:Package" xmi:id="U00000003-7510-11d9-86f2- 000476a22f44" name="Component View" visibility="public">

<ownedMember xmi:type="uml:Interaction" xmi:id="U4e4e5952-d3e2-469d-8b90- 408ffb2bccb7" name="Interaction1" visibility="public">

<lifeline xmi:type="uml:Lifeline" xmi:id="U062b2bd1-d560-4363-ba8c- 7d663ac2eccb" name="Lifeline1">

<coveredBy xmi:idref="Ub8c7ae83-5f57-4c23-8df2-0da971de488d"/> <coveredBy xmi:idref="U6ef60b4d-669a-46cd-993f-5a92a0d937be"/> </lifeline>

<lifeline xmi:type="uml:Lifeline" xmi:id="Ufa06c7e2-69f2-4d42-b402- 08ec7bcb49ae" name="Lifeline2"> <coveredBy xmi:idref="U7ce141d1-4250-4095-bcbb-d4ce6c1b2ec7"/> <coveredBy xmi:idref="U6ef60b4d-669a-46cd-993f-5a92a0d937be"/> </lifeline> <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="U7ce141d1-4250-4095-bcbb-d4ce6c1b2ec7" event="Uf6dbf869-1620-4fbe-87cf-c631187ab9ae"> <message xmi:idref="U569d4f18-efdc-4de9-8e58-9b2824665662"/> <covered xmi:idref="Ufa06c7e2-69f2-4d42-b402-08ec7bcb49ae"/> </fragment> <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="Ub8c7ae83-5f57-4c23-8df2-0da971de488d" event="Uf6dbf869-1620-4fbe-87cf-c631187ab9ae"> <message xmi:idref="U569d4f18-efdc-4de9-8e58-9b2824665662"/> <covered xmi:idref="U062b2bd1-d560-4363-ba8c-7d663ac2eccb"/> </fragment> <fragment xmi:type="uml:BehaviorExecutionSpecification" xmi:id="Ud06ef543-4f3e-464c-986d-69a4172bec02" start="Ub8c7ae83- 5f57-4c23-8df2-0da971de488d"/> <fragment xmi:type="uml:BehaviorExecutionSpecification" xmi:id="U36024712-db68-4a7f-9864-51d4a01852eb" start="U7ce141d1- 4250-4095-bcbb-d4ce6c1b2ec7"/>

<fragment xmi:type="uml:CombinedFragment" xmi:id="U6ef60b4d-669a- 46cd-993f-5a92a0d937be" name="CombinedFragment1"

interactionOperator="opt">

<covered xmi:idref="U062b2bd1-d560-4363-ba8c-7d663ac2eccb"/> <covered xmi:idref="Ufa06c7e2-69f2-4d42-b402-08ec7bcb49ae"/> </fragment>

<message xmi:type="uml:Message" xmi:id="U569d4f18-efdc-4de9-8e58- 9b2824665662" name="Message1" sendEvent="Ub8c7ae83-5f57-4c23-8df2- 0da971de488d" receiveEvent="U7ce141d1-4250-4095-bcbb-d4ce6c1b2ec7"/> </ownedMember>

<ownedMember xmi:type="uml:CallEvent" xmi:id="Uf6dbf869-1620-4fbe-87cf- c631187ab9ae" visibility="public"/>

</ownedMember> </uml:Package> </xmi:XMI>

49

Các tài liệu tham khảo

[1] Nguyễn Văn Ba. Phát triển hệ thống hướng đối tượng với UML 2.0 và C++.2008,tr.33.

[2]Vũ Sỹ Vương. KIỂM CHỨNG ĐẶC TẢ UML CHO TÁC TỬ PHẦN MỀM. Khóa luận tốt nghiệp.Hà Nội,2009

[3] Anh-Hoang Truong, Thanh-Binh Trinh, Dang Van Hung, Viet-Ha Nguyen Nguyen Thi Thu Trang, and Pham Dinh Hung. “Checking Interface Interaction Protocols Using Aspect-Oriented Programming”. SEFM' 08, Cape Town, South Africa, November 10-14, 2008.

[4] R. Laddad. AspectJ in Action Practical Aspect-Oriented Programming. Manning Publications Co., 2003.

[5] R. S. Pressman. Software Engineering, A Practitioner’s Approach, 5th edition. Thomas Casson, 2001.

Một phần của tài liệu LUẬN VĂN: KIỂM CHỨNG CÀI ĐẶT BIỂU ĐỒ TƯƠNG TÁC VỚI UML 2.0 pdf (Trang 43 - 56)