1. 4 Cấu trúc khóa luận
5.1.2. Sinh mã Aspect từ biểu đồ tuần tự UML
Chúng ta tiến hành kiểm thử aspect để giải quyết bài toán với đầu vào là biểu đồ tuần tự UML dưới dạng file XMI. Máy trạng thái đã đọc được nội dung từ file XMI và lấy ra được một số thông tin. Nhưng để sinh ra mã nguồn kiểm thử tôi phải định nghĩa thêm một số phương thức quan trọng tương tác với các trạng thái của FSM là getBeforeState,
getCondition, getPreCon, getPos. getBeforeState lấy ra các trạng thái có thể tiến tới trạng thái cho trước,getPreCon lấy ra điều kiện trước, getPoss: lấy ra điều kiện sau,
getCondition lấy ra điều kiện cụ thể là gì. Ngoài ra cần định nghĩa hàm chuanhoa để sửa
lại hiển thị của các trạng thái và các phương thức cho đúng. Đặc biệt do trong biểu đồ tuần từ không cho phép đặc tả tiền điều kiện và hậu điều kiện một cách tường minh, vì vậy để giải quyết vấn đề này tôi sử dụng một thành phần khác trong biểu đồ tuần từ là Comment, nội dung trong thành phần này là để tôi định nghĩa các ràng buộc về tiền điều kiện và hậu điều kiện, lấy ra và sử lý các tiền điều kiện và hậu điều kiện là từ nội dung của thành phần comment này.
File kiểm chứng Aspect ta sẽ dùng :
- Before advice : Kiểm tra xem giá trị của biến state hiện thời có bằng giá trị của các trạng thái trước nó có thể chuyển trạng thái khi gọi phương thức hiện thời hay không. Mặt khác, kiểm tra các ràng buộc tiền điều kiện của phương thức. Nếu vi phạm thì sẽ báo lỗi.
- After advice: Đặt lại giá trị mới cho biến state sau khi thay đổi trạng thái được gọi. Thực hiện các phép kiểm tra hậu điều kiện, kiểm tra tính đúng đắn của giao thức.
5.1.3. Thuật toán sinh mã aspect được cài đặt như sau :
- Duyệt lần lượt tất cả các event (phương thức) trong FSM. Thiết lập trạng thái cho lần lượt mỗi khi một phương thức được gọi:
+ Sau khi gọi một phương thức, đổi trạng thái cho nó trong after advice.
+ Dùng before advice kiểm tra state trước nó có phải là các trạng thái có thể chuyển đến trạng thái hiện thời không. Bằng cách lấy tất cả các trạng thái có thể gọi đến phương thức hiện tại và so sánh với state hiện tại. Nếu sai thì báo lỗi.
-Lấy ra các precondition và pos-condition để kiểm chứng. Nếu sai với điều kiện trong precondition và pos-condition thì báo lỗi. Trước tiên ta phải lấy ra ràng buộc trong tài liệu XMI, và được lấy từ thành phần Comment. Commnent được biểu diễn trong tài liệu XMI là tag< ownedComment> mà có các thuộc tính là xmi:type = “uml:Comment” và thuộc tính body = “” chính là nội dung chúng ta cần quan tâm. Nội dung trong thuộc tính body chúng ta cần định nghĩa chính xác theo khuân mẫu : body = “pre/pos: condition:Message”.
Trong đó :
- pre/ pos : xác định kiểu của điều kiện là tiền điều kiện hay là hậu điều kiện. - Conditon : biểu diễn ràng buộc cụ thể là gì.
- Message: biểu diễn tên của thông điệp liên quan.
Như trong hình trên, thuộc tính body của ownComment là :pre:x=0:message2 có nghĩa: kiểu của điều kiện là tiền điều kiện(pre),điều kiện ràng buộc là x =0 và là tiền điều kiện trước khi gọi Message2.
Pos:x>0:message2 có nghĩa: kiểu của điều kiện là hậu điều kiện(pos), điều kiện ràng buộc là x>0 và là hậu điều kiện sau khi gọi message2.
- Vòng lặp (Loop) biểu diễn các giao thức cơ bản, ta cần sử lý vòng lặp nếu có. Các phương thức được đặt trong vòng lặp để thể hiện chúng được lặp bao nhiều lần. Đây là CombindedFragment chủ yếu để tạo ra các giao thức phức tạp. Việc kiểm chứng này ở mức đơn giản nhất là kiểm chứng tính đúng đắn ở một vòng lặp. Tức là kiểm tra xem trong vòng lặp đó số lần lặp, các phương thức lặp với tuần tự đó là phải chính xác.