Đến đây ta đã làm được các việc : đọc XML để lấy đặc tả ràng buộc trình tự gọi phương thức và ràng buộc thời gian, thiết kế template aspect cho việc kiểm tra ràng buộc. Từ các kết quả đó, chúng ta sẽ cài đặt chương trình tự động sinh mã aspect phục vụ cho kiểm tra.
Như đã trình bày các pointcut trong aspect này được chia ra làm ba loại : - pc_entry: pointcut dùng để bắt phương thức đầu tiên trong giao thức - pc_exit: pointcut dùng để bắt phương thức cuối cùng trong giao thức - pc: pointcut dùng để bắt các phương thức khác.
Và việc sinh mã aspect cũng sẽ làm với từng loại pointcut này.
Ngoài ra trong mã aspect sẽ còn các phương thức nhằm khởi tạo và lấy dữ liệu từ xml, phục vụ cho việc kiểm tra chương trình khi chạy.
Thuật toán của chương trình sẽ được cài đặt như sau :
- Duyệt lần lượt các hàm trong entrySigs tạo ra loại pointcut pc_entry và các advice.
- Duyệt lần lượt các hàm trong exitSigs tạo ra loại pointcut pc_exit và các advice. - Duyệt lần lượt các hàm trong key của fsm, tạo ra loại pointcut pc và các advice - Ba loại pointcut này đều được tạo ra bằng cách xử lý các xâu ký tự, tách chuỗi thành tên hàm, kiểu trả về, tên tham số truyền vào, kiểu tham số truyền vào…
- Kết hợp các pointcut và advice đã tạo ra ở trên thành aspect kiểm chứng hoàn chỉnh.
- Thêm nữa, để quản lý trạng thái của SharedState, ta cần phải có dữ liệu của FSM mô tả biểu đồ trình tự UML. Vì vậy, trong aspect này sẽ chứa thêm phần mã nguồn tạo ra FSM từ biểu đồ trình tự UML như trong chương 4 đã trình bày.
5.2 Ví dụ chạy thử nghiệm
Trên cơ sở hệ thống thực nghiệm các module được cài đặt và mô tả như ở phần 5.1, chúng tôi đã chạy thử nghiệm thành công trên hệ thống ATM
5.2.1 Biểu đồ tuần tự và ràng buộc thời gian
Chúng ta đã biết biểu đồ tuần tự thể hiện sự hoạt động của hệ thống thực trong cụ thể từng tình huống nào đó, mà ở đây là các giao dịch với máy ATM, bao gồm các phương thức, thông điệp trao đổi giữa các đối tượng trong quá trình hoạt động, được biểu diễn cụ thể trong một thứ tự về thời gian ( lifeline ). Trong bài chúng ta sẽ xét 1 giao dịch đó là rút tiền với biểu đồ tuần tự như sau :
Hinh 5.5. Biểu đồ tuần tự giao dịch rút tiền từ máy ATM
Sau khi đã đăng nhập, người dùng yêu cầu rút tiền với số lượng xác định, yêu cầu này được gửi đến đối tượng ATM, nó thực hiện đồng thời việc kiểm tra số tiền trong máy ATM ( CheckBalanceATM() ) với việc gửi yêu cầu tới đối tượng BANK yêu cầu kiểm tra số tiền trong tài khoản có đủ không qua phương thức CheckBalanceAccount(int Amount). Đến khi cả 2 thao tác trên : kiểm tra số tiền trên máy ATM và kiểm tra số dư tài khoản
thực hiện xong và trả về kết quả cho đối tượng ATM, nó sẽ giao tiếp với khách hàng, đưa ra thông báo số dư không đủ, hoặc ngược lại sẽ giao tiền cho khách hàng và trả lại thẻ.
Ràng buộc về thời gian thực hiện được đặt trong thuộc tính Constraint của mỗi Message, với thời gian thực hiện các giao dịch của máy ATM hiện nay, thường xảy ra trong vài giây đến vài chục giây.
Các thuộc tính gồm: tên phương thức, tham số đầu vào, kiểu giá trị trả về, Stereotype,… chúng ta chủ yếu dùng 3 thuộc tính đầu, và để cho tiện trong việc đọc dữ liệu từ file xml, tôi đã viết theo qui cách tên đầy đủ cho message vào thuộc tính message, như vậy khi đọc xml sẽ chỉ cần đọc tag message thì lấy được dữ liệu về message, và sẽ cần xử lý xâu đọc được để tách ra tên phương thức, đối số và kiểu trả về.
Hình 5.6. Các thuộc tính cho Message
Ở đây, chúng ta sẽ cần thực hiện theo một qui ước nhỏ về viết tên phương thức để thống nhất trong khi cài đặt và việc sinh mã Aspect, đó là : viết đầy đủ, nếu không có đối số thì sẽ viết (void).
5.2.2 chương trình sinh mã Aspect từ đặc tả UML
Dựa vào các phân tích ở trên , tôi đã cài đặt chương trình sinh tự động mã aspect cho kiểm tra ràng buộc thời gian.
Hình 5.7. Chương trình sinh mã Aspects
- Đầu vào : file xml sinh ra từ biểu đồ UML.
- Ra : mã Aspect , lưu vào file AspectChecker.aj , để sau đó đan vào chương trình mô phỏng máy rút tiền và kiểm tra.
Hình 5.8 Demo generate aspects.
5.2.3 Một số giao dịch cụ thể
- Mô phỏng giao diện máy ATM, mô phỏng 1 giao dịch rút tiền. Tên Project : ATMsimulation
Hình 5.9 Chương trình mô phỏng giao dịch để kiểm tra bằng mã aspect đã sinh.
Trong chương trình này ,có các lớp atm, user, bank. Trong các lớp này có các phương thức như đã mô tả trong UML. Ví dụ lớp user như sau:
public class user { public user(){}
public void Withdraw(int Amount){ try {
Thread.sleep(9);
} catch (InterruptedException ex) {
//Logger.getLogger(ATMJPanel.class.getName()).log(Level.SEVERE, null, ex); ex.printStackTrace();
} }
}
Trong mỗi phương thức gọi Thread.sleep(n) để tạo ra mô phỏng thời gian trễ , nhằm kiểm tra ràng buộc thời gian.
Trong chương trình tôi tạo 2 kịch bản : + Gọi đúng chuỗi trong biểu đồ tuần tự.
+ Gọi sai, lặp lại phương thức Return() chẳng hạn.
Trong cả 2 kịch bản , thời gian trễ của mỗi phương thức được đặt tùy ý , chỉ cần có phương thức đúng ràng buộc thời gian, có phương thức không tuân theo ràng buộc thời gian .
5.2.4 Kiểm tra
5.2.4.1 Gọi đúng chuỗi trong biểu đồ tuần tự.
private void jButton18ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:
System.out.println("start checking \n"); u.Withdraw(1); a.CheckBalanceAccount(); a.CheckBalanceATM(); b.Return(); a.GiveMoney(1); a.ReturnCard();
ShowDialogBox msg=new ShowDialogBox(); System.out.println("\nChecking complete"); }
Nhận xét:
Ta thấy trong kịch bản kiểm tra này , việc chuyển trạng thái diễn ra suôn sẻ , theo đúng trình tự gọi các phương thức đặc tả trong biểu đồ UML.
Hình 5.9 kịch bản 1 ( gọi đúng chuỗi tuần tự , đã tắt kiểm tra ràng buộc thời gian)
+ Kết quả khi kiểm tra đồng thời tính tuần tự và ràng buộc thời gian:
Nhận xét:
o Với kiểm tra ràng buộc thời gian trong hình trên , cho hiển thị ra : thời gian ràng buộc, thời gian thực thi thực tế, và thông báo vi phạm hoặc thông báo ok.
5.2.4.2 Chuỗi gọi không đúng tuần tự.
Private void jButton19ActionPerformed(java.awt.event.ActionEvent evt) { // sự kiện của button
// TODO add your handling code here: u.Withdraw(1); a.CheckBalanceAccount(); a.CheckBalanceATM(); b.Return(); b.Return(); a.GiveMoney(1); a.ReturnCard(); } 5.3 Kết luận
Trong chương này,chúng tôi đã trình bày cách cài đặt công cụ kiểm tra tính tuần tự và ràng buộc thời gian dựa vào phương pháp “kiểm tra ràng buộc thời gian sử dụng
AOP”. Mã aspejct được sinh ra từ máy trạng thái FSM sẽ được đan vào mã nguồn của chương trình chính thông qua trình biên dịch AspectJ để kiếm chứng giao thức đặc tả trong thời gian chạy. Bước đầu tiến hành kiểm chứng một số giao thức thực tế, tôi thấy mã aspect tạo ra đã đáp ứng được các yêu cầu kiểm chứng.
Kết luận
Kết luận về khóa luận
Trong quá trình thực hiện luận văn này, chúng tôi đã tìm hiểu những kiến thức cơ bản về kiểm chứng phần mềm – là một trong những công đoạn vô cùng quan trọng giúp phát hiện và sửa lỗi phần mềm nhằm đảm bảo chất lượng phần mềm. Khi đã biết về thiết kế (UML ) của hệ thống, với yêu cầu viết mã aspect để kiểm tra tính đúng đắn của cài đặt và tính tuân theo ràng buộc thời gian khi hoạt động, thì chúng ta có thể trực tiếp viết mã đó và đan ngay vào chương trình cần kiểm thử. Nhưng như vậy với mỗi chương trình thì ta sẽ phải viết mã aspect mới do đó sẽ tương đối mất thời gian. Mục đích của khóa luận là tạo một chương trình tự động hóa việc sinh mã aspect cho việc kiểm thử. Để làm được việc đó ta sẽ phải tạo ra 1 khuân mẫu aspect, tất nhiên sẽ chỉ dùng được cho những chương trình có tính tương đồng với nhau ở mức nhất định, và từ khuôn mẫu đó ta sẽ chỉnh sửa để nó trở thành mã cho những chương trình cụ thể. Việc tạo template này giống như ta viết mã aspect cho một ví dụ cụ thể, nhưng sau đó sẽ khái quát lên. Đồng thời chúng tôi đã xây dựng phương pháp kiểm chứng phần mềm dựa trên AOP từ đó xây dựng công cụ tự động sinh mô-đun kiểm chứng.
Trong phương pháp kiểm chứng cho ứng dụng, các mô-đun aspect chứa mã kiểm chứng sẽ là các mô-đun cắt ngang hệ thống và tách biệt so với chương trình ban đầu. Từ biểu đồ trạng thái hay biểu đồ trình tự UML, tôi xuất biểu đồ này ra 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 mô tả giao thức đã được định nghĩa. Từ máy trạng thái xây dựng được, tôi tiến hành duyệt các trạng thái của máy trạng thái và dùng các thuật toán thao tác với xâu ký tự để sinh ra mã aspect chứa nội dung kiểm chứng.. Để minh họa cho phương pháp “kiểm tra ràng buộc thời gian sử dụng AOP”, tôi đã thực nghiệm và xây dựng thành công khi cài đặt được công cụ tự động sinh mã aspect từ tài liệu XMI mô tả giao thức.
Tuy nhiên, tôi cũng vấp phải một số khó khăn trong quá trình xây dựng phương pháp sinh mã aspect. công cụ chỉ sinh ra aspect từ những thông tin trong tài liệu XMI. Chính vì vậy việc xây dựng các mô-đun kiểm chứng chỉ từ tài liệu XMI biểu diễn giao thức nhiều khi là không đủ để sinh ra các mô-đun aspect kiểm chứng hoàn chỉnh. . Một khó khăn nữa là các biểu đồ UML rất hạn chế trong việc đặc tả các biểu thức điều kiện,
chính vì vậy đôi khi ta chỉ kiểm chứng được một vài nhánh của chương trình mà không thể kiểm chứng được tất cả các nhánh.
Hướng phát triển trong tương lai
Từ những vấn đề tồn tại của 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 phương pháp kiểm tra ràng buộc thời gian để đáp ứng mọi yêu cầu.
TÀI LIỆU THAM KHẢO
[1] http://www.eclipse.org/aspectj/.
[2] http://netlib.bell-labs.com/netlib/spin/. [3] http://www.uppaal.com.
[4] http://nusmv.irst.itc.it.
[5] 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.
[6] A. D. Brucker and B. Wolff. Checking OCL Constraints in Distributed Component Based Systems. Technical report, Institut fur Informatik Albert Ludwigs University at Freibur, Germany, 2001.
[7] B. Brard, M. Bidoit, A. Finkel, F. Laroussinie, A. Petit, L. Petrucci,Ph.
Schnoebelen, and P. McKenzie. Systems and Software Verification Model
Checking Techniques and Tools. Springer, 2001.
[8] A. Cimatti, E. Clarke, F. Giunchiglia, and M. Roveri. NuSMV: A New
Symbolic Model Verifier. In 11th International Conference on Computer Aided,
Verification (CAV’99), Trento, Italy, July, 2003.
[9] E. M. Clarke, Jr. O. Grumberg, and D. A. Peled. Model Checking. The MIT
Press, 1999.
[10] A. Colyer, A. Clement, G. Harley, and M. Webster. Eclipse
AspectJ:AsAspectJ Development Tools. Addison Wesley Professional Publisher,
[11] G. Denaro and M. Monga. An Experience on Verification of Aspect
Properties. In Proceedings of the 4th International Workshop on Principles of
Software Evolution, 2001.
[12] O. Grumberg E. Clarke and D. Long. Verification tools for finitestate
concurrent systems. In A Decade of Concurrency, volume 803 of Lecture Notes
in Computer Science, page 124-175. Springer, June 1993.
[13] E. A. Emerson and J. Y. Halpern. Sometimes and Not Never revisited: On
branching versus linear time temporal logic. In Journal of the ACM, volume
33(1): 151-178, 1986.
[14] C. Flanagan, K. Rustan, M. Leino, and R. Stata. Extended Static Checking
for Java. In ACM SIGPLAN Notices, Proceedings of the ACM SIGPLAN 2002
Conference on Programming language design and implementation PLDI ’02,
volume 37. ACM Press, May 2002.
[15] M. Fowler. UML Distilled: A Brief Guide to the Standard Object Modeling
Language, 3rd Edition. Addison Wesley, 2003.
[16] J. D. Gradecki and N. Lesiecki. Mastering AspectJ Aspect-Oriented
Programming in Java. Wiley Publishing Inc, 2003.
[17] The Standish Group. CHAOS Report. The Standish Group, 2000.
[18] B. Hailpern and P. Santhanam. Software Debugging, Testing and
Verification. IBM Systems Journal, 2002.
[19] J. Jackson. Inside the UML. Object Management Group, 1999.pect-
Oriented Programming with AspectJ and the Eclipse
[20] M. Kersten. Aop tools comparison. Technical report, University of British Columbia, Feb 2005. http://www.ibm.com/developerworks.
[21] S. Krishnamurthi, K. Fisler, and M. Greenberg. Verifying Aspect Advice
symposium on Foundations of software engineering SIGSOFT ‟04/FSE-12, 2004.
[22] R. Laddad. AspectJ in Action Practical Aspect-Oriented Programming.
Manning Publications Co., 2003.
[23] F. Laroussinie and Ph. Schnoebelen. A hierarchy of temporal logics with
past. In Selected papers of the eleventh symposium on Theoretical aspects of
computer science, Caen, France, 1995.
[24] G. Lindstrom, P. Mehlitz, and W. Visser. Model Checking Real
Time Java using JavaPathFinder. In Proceedings of the Third International
Symposium on Automated Technology for Verification and Analysis (ATVA).
http://javapathfinder.sourceforge.net, October 2005.
[25] A. Cimatti M. Benedetti. Bounded Model Checking for Past LTL. In
Proceedings of the International Conference on Tools and Algorithms for the
Construction and Analysis of Systems, 2003.
[26] K. L. McMillan. Symbolic Model Checking. Wiley Publishing Inc., 2003.
[27] T. Tamai N. Ubayashi. Aspect-oriented programming with model checking.
In Proceedings of the 1st international conference onAspect-oriented software
development, Enschede, The Netherlands, April, 2002.
[28] OMG. Unified Modeling Language. OMG, Version 1.5 March 2003.
[29] A. Pnueli. The temporal logic of programs. In Proceedings of the 18th
IEEE Symp. Foundations of Computer Science (FOCS’77), volume pages 46-57,
USA, Oct-Nov, 1977.
[30] R. S. Pressman. Software Engineering, A Practitioner’s Approach, 5th
edtion. Thomas Casson, 2001.
[31] M. Richters. A precise Approach to Validating UML Models and OCL
[32] K. Rustan, M. Leino, G. Nelson, and James B. Saxe. ESC/Java User’s
Manual. Compaq Computer Corporation, 2000.
[33] RTI Health Social and Economics Research. The Economic Impacts of
Inadequate Infrastructure for Software Testing. Final Report. NIST - National
Institute of Standards and Technology, 2002.
[34] Ian Sommerville. Software Engineering, 7th edtion. Thomas Casson, 2004.
[35] H. T. Thanh, N. T. T. Trang, T. N. Thuan, and N. V. Ha. An approach for
verifying invariants of Java objects at runtime. In Proceedings of the Japan-
Vietnam Workshop on Software Engineering. IoIT, Ha Noi, 2007.
[36] N. T. T. Trang, H. T. Thanh, T. N. Thuan, N. V. Ha, and H. S. Dam. An
approach for verifying aspect advices using model checking. In The Third
National Symposium Fundamental and Applied Information Technology