Giao thức của các ứng dụng Applet

Một phần của tài liệu KIỂM CHỨNG ĐẶT TẢ UML CHO TÁC TỬ PHẦN MỀM (Trang 64 - 68)

Java Applet là một chương trình viết bằng ngôn ngữ Java và được kích hoạt nhờ

các trình duyệt web. Hình vẽdưới đây mô tả giao thức của các ứng dụng applet:

Hình 6.2: Biểu đồ trạng thái mô tả giao thức applet

Một applet thường có bốn phương thức chính: init, start, stop và destroy.

- Init: Để khởi tạo applet mỗi khi applet được nạp hay được nạp lại. - Start: Kích hoạt applet bắt đầu hoạt động.

- Stop: Cho phép tạm ngưng thực hiện các hoạt động của applet, nhưng có

thể không hoàn trả tài nguyên hệ thống.

57

Các client đầu tiên sẽ gọi phương thức init, sau đó là cặp phương thức start – stop được gọi lặp đi lặp lại tùy mục đích sử dụng. Cuối cùng phương thức destroy

được gọi khi client muốn hủy applet. Giao thức applet có thểđược mô tả bởi biểu thức chính quy: init (start | stop) + destroy.

6.2.1.2 Kiểm chứng Applet protocol

Với giao thức applet mô tả như phần trước, tôi sử dụng công cụ StarUML ẽ một biểu đồ trạng thái để mô tả lại giao thức

applet dưới dạng biểu đồ trạng thái UML (Hình 6.2) sau đó xu ất ra dạng tài liệu XMI

làm đầu vào cho công cụPVG của tôi.

Lập trình viên mô tả lớp Applet gồm bốn phương thức: void init(), void start(), void stop() và void destroy():

public class Applet {

public void init(){//do something} public void start(){//do something} public void stop(){//do something} public void destroy(){//do something} }

Mã aspect sinh ra từ công cụPVG:

public aspect ProtocolChecker{

public final static int STATE_START = 0;

public final static int STATE_destroy = STATE_START;

public final static int STATE_stop = 2;

public final static int STATE_start = 3;

public final static int STATE_init = 4;

private int state = STATE_START;

/*

public ProtocolChecker(){

System.out.println("Aspect instance is created: "+this); }

*/

pointcut pc_stop(): call (void stop()); before(): pc_stop() {

if (!(state==STATE_start)){ System.out.print("Wrong at: (adsbygoogle = window.adsbygoogle || []).push({});

"+thisJoinPointStaticPart.getSignature()); System.out.print(" In file:

"+thisJoinPointStaticPart.getSourceLocation().getFileName()); System.out.println(" At line:

"+thisJoinPointStaticPart.getSourceLocation().getLine()); }}

after(): pc_stop() { state = STATE_stop; }

pointcut pc_destroy(): call (void destroy()); before(): pc_destroy() {

58

if (!(state==STATE_stop)){ System.out.print("Wrong at:

"+thisJoinPointStaticPart.getSignature()); System.out.print(" In file:

"+thisJoinPointStaticPart.getSourceLocation().getFileName()); System.out.println(" At line:

"+thisJoinPointStaticPart.getSourceLocation().getLine()); }}

after(): pc_destroy() { state = STATE_destroy; }

pointcut pc_init(): call (void init()); before(): pc_init() {

if (!(state==STATE_START)){ System.out.print("Wrong at:

"+thisJoinPointStaticPart.getSignature()); System.out.print(" In file:

"+thisJoinPointStaticPart.getSourceLocation().getFileName()); System.out.println(" At line:

"+thisJoinPointStaticPart.getSourceLocation().getLine()); }}

after(): pc_init() { state = STATE_init; }

pointcut pc_start(): call (void start()); before(): pc_start() {

if (!(state==STATE_stop || state==STATE_init)){ System.out.print("Wrong at:

"+thisJoinPointStaticPart.getSignature()); System.out.print(" In file:

"+thisJoinPointStaticPart.getSourceLocation().getFileName()); System.out.println(" At line:

"+thisJoinPointStaticPart.getSourceLocation().getLine()); }} after(): pc_start() { state = STATE_start; } }

Sau khi sinh aspect kiểm chứng bằng công cụ PVG, tích hợp vào mã nguồn

chương trình, tôi được kết quả kiểm thử với một sốđầu vào khác nhau như sau:

- CorrectTest1:

o Chuỗi gọi: init(); start(); stop(); destroy(); o Kết quả:

59

o Nhận xét: chuỗi gọi đúng với đặc tả giao thức, chương trình không báo lỗi.

- CorrectTest2:

o Chuỗi gọi: init(); start(); stop(); [start(); stop()]2 destroy(); (adsbygoogle = window.adsbygoogle || []).push({});

o Kết quả:

Hình 6.4: Applet – CorrectTest2

o Nhận xét: chuỗi gọi đúng với đặc tả giao thức, chương trình không báo lỗi.

- WrongTest1:

o Chuỗi gọi: init(); stop(); start(); destroy(); o Kết quả:

Hình 6.5: Applet – WrongTest1

o Nhận xét: chuỗi gọi sai đặc tả, phương thức stop() được gọi trước

phương thức start(),chương trình báo lỗi và chỉ ra dòng mã nguồn bị lỗi.

- WrongTest2:

o Chuỗi gọi: init(); destroy(); start(); init(); o Kết quả:

60

Hình 6.6: Applet – WrongTest2

o Nhận xét: chuỗi gọi sai đặc tả tại lời gọi ba phương thức destroy(); start(); init();chương trình bắt được tất cả các lỗi.

Như vậy, chỉ mới thực hiện bốn ca kiểm thử, ta có thể thấy rất rõ aspect do công cụ PVG tạo ra đáp ứng được yêu cầu kiểm chứng giao thức applet. Để chính xác hơn,

ta hoàn toàn có thể định nghĩa các ca kiểm thử khác để kiểm chứng sự làm việc của

aspect này.

Một phần của tài liệu KIỂM CHỨNG ĐẶT TẢ UML CHO TÁC TỬ PHẦN MỀM (Trang 64 - 68)