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:
"+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();
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.