Xem mẫu

  1. Báo cáo môn học các vấn đề hiện đại công nghệ phần mềm
  2. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. LỜI CẢM ƠN Để hoàn thành báo cáo môn học các vấn đ ề hiện đại công nghệ phần mềm một cách hoàn chỉnh, chúng em xin bày tỏ lòng cảm ơn chân thành đến các thầy cô đ ã hướng dẫn chúng em tại trường Đại Học Công Nghệ. Đặ c biệt là thầyĐặng Đức Hạnh và cô Vũ Diệu Hương, thầ y cô đã trực tiếp hướng dẫ n tận tình, sửa ch ữa và đóng góp nhiều ý kiến quý báu giúp chúng em hoàn thành tốt báo cáo môn học của mình. Lời cảm ơn chân thành và sâu sắc, chúng em xin gửi đ ến gia đình, đ ã luôn sát cánh và động viên chúng em trong những giai đoạn khó khăn nhấ t. Chân thành cảm ơn đến các bạn trong lớp đã hỗ trợ để chúng em có thể hoàn thành tốt công việc được giao. Chúng em xin chân thành biết ơn sự tậ n tình dạy dỗ của tất cả các quý thầy cô Khoa Công nghệ Thông tin – Trường Đại học Công Nghệ Thông Tin – Đại học Quốc gia Hà Nội. Chúng cũng xin chân thành gửi lời cảm ơn đến tất cả các thầy cô đã giảng dạy chúng em thời gian qua, đã truyền đạt và trang bị cho chúng em những kinh nghiệm, kiến thức chuyên môn, giúp chúng em mở rộng tầm nh ìn khi thâm nhập vào thực tế. chúng em xin hứa sẽ không ngừng phấn đấu nỗ lực vươn lên trong học tập và công tác sau này. 2
  3. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Ph l c LỜI CẢM ƠN ......................................................................................................... 1 CHƯƠNG 1 GIỚI THIỆU ...................................... Error! Bookmark not defined. 1.1Đặt vấn đề ...................................................... Error! Bookmark not defined. 1.2Nộ i dung báo cáo môn học ............................. Error! Bookmark not defined. 1.3Cấu trúc báo cáo môn học .............................. Error! Bookmark not defined. CHƯƠNG 2 TRÌNH BÀY KHÁI NIỆM MÔ HÌNH PROMELA.............................5 Khái niệm cơ bản ngôn ngữ Promela......................................................6 2.1 2.2 Biến và Kiểu ...........................................................................................6 2.3 Định danh, Hằng số và Biểu thức...........................................................7 2.4 Tiến trình.................................................................................................8 2.5 Lệnh và cấu trúc lệnh Promela............................................................... 9 2.6 Sự khác biệt khi sử dụng 2 từ khóa Atomic, D-step trong bài toán cụ thể....................................................................................................................10 CHƯƠNG 3 TRÌNH BÀY CÔNG CỤ SPIN, THAM SỐ, CÚ PHÁP LỆNH.....17 Sơ lược về công c ụ spin...................................................................17 3.1 Lịch sử p hát triển công cụ SPIN..........................................................17 3.2 Một số yếu tố thành công của SPIN......................................................17 3.3 Kiến trúc SPIN – Cấp độ tổ chức Spin.................................................18 3.4 Công cụ dòng lệnh................................................................................18 3.4 CHƯƠNG 4 GIỚ I THIỆU CÔNG CỤ SOẠN TH ẢO EMACS.....................21 4.1 Khái niệm và chức năng của GNU Emacs............................................21 Các lo ại trình soạn thảo Emacs.............................................................22 4.2 Bộ gõ.................................................................................................. ...23 4.4 Giao diện trình so ạn thảo Emacs...........................................................23 4.4 Cấu trúc lệnh Emac...............................................................................24 4.6 Các phím đơn..................................................................................... .24 4.5 3
  4. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. 4.6 Các phím tiền tố và tổ hợp................................................................... 25 CHƯƠNG 5 KẾT LUẬN ....................................... Error! Bookmark not defined. TÀI LIỆU THAM KHẢO....................................... Error! Bookmark not defined. 4
  5. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. CHƯƠNG 1 GIỚ I THIỆU 1.1 Đặt vấn đề Trong các công ty phát triển phần mềm hầu hết công việc kiểm thử của kiểm thử viên được thực hiện thủ công bằng tay. Trong khi đó số lượng tình huố ng kiểm tra quá nhiều mà các kiểm thử viên không thể hoàn tất bằng tay trong thời gian cụ thể nào đó. Hoặc khi nhóm lập trình đưa ra nhiều phiên bản phần mềm liên tiếp để kiểm tra. Thực tế cho thấy việc đưa ra các phiên bản phần mềm có thể là hàng ngày, mỗi phiên bản bao gồm những tính năng mới, hoặc tính năng cũ được sửa lỗi hay nâng cấp. Việc bổ sung hoặc sửa lỗi code cho những tính năng ở phiên bản mới có thể làm cho những tính năng khác đã kiểm tra tốt chạy sai m ặc dù phần code của nó không hề chỉnh sửa. Để khắc phục điều này, đối với từng phiên b ản, kiểm thử viên không chỉ kiểm tra chức năng mới hoặc được sửa, mà phải kiểm tra lại tất cả những tính năng đã kiểm tra tốt trước đó. Điều này khó khả thi về m ặt thời gian nếu kiểm tra thông thường. Để giải quyết vấn đề này chúng ta áp dụng kỹ thuật kiểm thử dựa trên mô hình cho quá trình sinh các ca kiểm thử tự động. Nhưng làm sao đ ể thực hiện được quá trình sinh các ca kiểm thử tự động chúng ta phải áp dụng khá nhiều các công nghệ sẵn có và thông dụng nhất. Ở đây chúng em xin giới thiệu mã nhúng C vào mô tả Promela và trình bày công cụ Spin đ ể sinh ra các ca kiểm thử tự động từ đó áp dụng vào một bài toán cụ thể. Trong báo cáo này chúng em tập trung trình bày về việc nghiên cứu kiểm thử dựa trên mô hình và ứng dụng công cụ Spin vào việc tự động sinh các ca kiểm thử: Xây dựng mô hình hệ thốngvà thực nghiệm. Bên cạnh đó chúng em cũng giới thiệu qua về trình so ạn thảo Emac, một công cụ lập trình khá hay và ra đời từ rất sớm, chạy được trên nhiều hệ điều hành thông dụng. 1.2 Nội dung báo cáo môn họ c 5
  6. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Bài báo cáo trình bày ngôn ngữ Promela vào thiết kế Promela và áp dụng kĩ thuật sử d ụng công cụ Spin là hai nộ i dung quan trong nhất của quá trình sinh ca kiểm thử tự động. Đề xuất bài toán cụ thể để thực hiện công việc Demo m ột chương trình nhỏ . Từ đó đem áp d ụng vào phục vụ cho việc kiểm chứng phần mềm. Xây dựng tài liệu hướng dẫn về ngôn ngữ Promela, công cụ Spin, trình so ạn thảo Emac phục vụ cho việc nghiên cứu, giảng dậy và ứng d ụng thực tiễn. 1.3 Cấu trúc báo cáo môn học Các phần còn lại của khóa luận có cấu trúc như sau: Chương 2: Trình bày các khái niệm về ngôn ngữ mô hình promela, b ao gồm các đ ịnh nghĩa c ơ b ản về khai báo biến và kiểu, đ ịnh danh, hằng số , biểu thức, tiế n trình. Chương 3: Giới thiệu công cụ Spin, cấu trúc cú pháp lệnh, tham số lệnh và chức năng của nó. Chương 4: Giới thiệu công cụ soạn thảo Emacs. Chương 5: Tóm tắt các kết quả đã đạt được, kết luận, những hạn chế và hướng nghiên cứu phát triển trong tương lai. 6
  7. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. CHƯƠNG 2 TRÌNH BÀY KHÁI NIỆ M MÔ HÌNH PROMELA Chương này sẽ lần lượt trình bày những khái niệm cơ b ản về mô hình Promela. Khái niệm cụ thể về cấu trúc cú pháp lệnh, thủ tục hàm, cách khai báo biến trong Promela. Khái niệm cơ bản ngôn ngữ Promela 2.1 Xây dựng mô hình hệ thống bằng ngôn ngữ Promela là một công đoạn quan trọng trong kiểm thử d ựa trên mô hình, để từ đó có thể dùng công cụ Spin sinh ra các ca kiểm thử. Ngôn ngữ mô hình Promela có nhiều nét tương đồng với ngôn ngữ C.  Định nghĩa Promela (Process meta language ) Promela là ngôn ngữ mô hình dùng đ ể mô tả hệ thống đồ ng thời [The Spin Model Checker: Primer and Reference Manual]. Ví dụ: Giao thức mạng, hệ thống điện thoại, các chương trình giao tiếp đa luồng,…  Cấu trúc chương trình Promela Một chương trình Promela cơ b ản gồm:  K hai báo kiểu.  K hai báo biến.  K hai báo tiến trình.  [init process]. // Các khai báo kiểu và biến mtype = {MSG, ACK}; chan toS = ... chan toR = ... bool flag; // Mộ t tiến trình proctype Sender() { // Thân mộ t tiến trình ... } 7
  8. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. proctype Receiver() { ... } // Tiến trình init init { // Tạo một tiến trình ... } Biến và Kiểu 2.2 Giố ng như nhiều ngôn ngữ lập trình khác, Promela yêu cầu các biến phải được khai báo trước khi chúng có thể được sử dụng. Khai báo biến theo phong cách của ngôn ngữ lập trình C. Theo mặc đ ịnh tất cả các biến của các loại biến cơ bản được bắt đầu từ 0. Cũng như trong C thì 0 được coi như sai và khác 0 được coi là đúng. Một biến có thể là biến toàn cục hoặc là biến địa phương của mỗi tiến trình. Kiểu dữ liệu Kiều Miền giá trị bit or bool { 0, 1} byte 0…255 -2 15 … 215 - 1 short -2 31 … 231 – 1 int • Kiểu khai báo int ii; bit bb; bb = 1; ii = 2; • Kiểu cấu trúc Records (structs): Có th ể tìm ra xung đột khi ch ạy Typedef record{ short f1; b yte f2; } 8
  9. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Truy cập như C Record rr; rr.f1 = … • Kiểu mảng Một mảng có cấu trúc như sau: int table[max] Lưu ý rằng điều này tạo ra một m ảng max-1 số nguyên: table[0], table[1], ... table[max-1] • Kiểu liệt kê Một bộ các h ằng số tượng trưng được khai báo như sau : mtype = {LINE_CLEAR, TRAIN_ON_LINE, LINE_BLOCKED} • Kênh (Chanel): Được sử d ụng để trao đổi dữ liệu giữa các tiến trình. Cú pháp: chan = [] of ,, ; Cú pháp gửi tin nhắn trong mộ t kênh (!) chan-name ! , ..... ; Cú pháp nhận tin nhắn trong một kênh (?) chan-name ? , .....; Định danh, H ằng số và Biểu thức 2.3 • Định danh Định danh có thể là một chữ cái, một ký tự. • Hằng số Hằng số là một chuỗ i ký tự đại diện cho một số nguyên thập phân. Hằng số tượng trưng có thể được định nghĩa như sau: #define MAX 999 • Biểu thức 9
  10. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Một biểu thức được xây dựng từ các biến, hằng số và sử dụng các toán tử sau đây: +, -, *, /, %, --, ++, >, >=, ,
  11. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Tất cả các chương trình promela đều cần một tiến trình init nó giống như hàm main() trong ngôn ngữ C. Việc thực thi một chương trình promela được bắt đầu từ tiến trình init. Một tiến trình init có dạng: init { /* Các khai báo địa phương và các biểu thức. */ } Đơn giản nhất có thể là chương trình promela có dạng: init { skip } Skip có nghĩa là không có biểu thức nào trong tiến trình init; Mỗi tiến trình được định nghĩa bởi một proctype, nó được thực thi đồng thời với tất cả các tiến trình khác, nó giao tiếp với các tiến trình khác thông qua việc sử dụng các biến công cộng hoặc các kênh. Tiến trình thực thi sau khi thực hiện hàm run. Một số ví d ụ đơn giản về tiến trình proctype hello(){ printf("Hello") } proctype world(){ printf("World\n") } init { run hello(); run world () } Lệnh và cấu trúc lệnh Promela 2.5  Mỗi lệnh được ngăn cách với nhau mộ t dấu chấm phẩy (;). Một số lệnh và cấu trúc tiêu biểu • Skip: không thực hiện, chỉ thay đổi khi tiến trình gọi tới • Printf: In ra màn hình. • Assert(Exp) : Sử dụng kiểm tra nếu Exp là biểu thức hợp lệ (Nếu giá trị Exp = 0 thì thực thi sẽ bị lỗ i).  Cấu trúc lặp (do) Cú pháp: if 11
  12. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. :: choice1 -> stat1.1; stat1.2; :: choice2 -> stat2.1; stat2.2; :: .......................................... :: choicen -> statn.1; statn.2; fi; Lựa chọn một trong các điều kiện thực thi  Cấu trúc so sánh (if) do :: choice1 -> stat1.1; stat1.2; :: choice2 -> stat2.1; stat2.2; :: ........................................... :: choicen -> statn.1; statn.2; od; Lựa chọn được lặp đi lặp lại nhiều lần và có thể dừng nếu gặp break.  Cú pháp Active Từ khóa Active có thể là tiền tố cho mọi thủ tục được khai báo trong hàm. Hiệu quả của từ khóa active là tạo ra liên kết Prototype trong hệ thống ban đầu Nhiều trường hợp của cùng một khai báo Prototype có thể được tạo ra bằng cách sử dụng một m ảng các hậu tố tùy chọn. Ví dụ : active [4] proctype hello(){ printf("Hello") } active [7] proctype world(){ printf("World\n") } Lưu ý : trường hợp này sẽ tạo ra 4 trường hợp của “Hello” và 7 trường hợp của “World” 12
  13. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.  Cú pháp Atomic Có thể sử dụng tới một nhóm lệnh trong một thông báo atomic. Các lệnh được thực hiện đơn lẻ và không xen kẽ với các lệnh trong tiến trình khác. Tự động phá vỡ nếu lệnh bị khóa khi đó các lệnh trong tiến trình khác có thể x en kẽ vào giữa. Cú pháp: atomic { statement1; ...; statementn } Statement1 chạy đầu tiên, statementn chạy cuối cùng.  Cú pháp D -STEP Nhiều phiên bản Atomic : Không chứa trạng thái trung gian được tạo ra và lưu trữ. Chỉ có thể chứa những bước xác đ ịnh. Thời gian chạy sẽ bị lỗ i nếu Stat-I(I>1) bị chặn, khóa. D-STEP cực kì hữu ích để thực hiện việc tính toán trong quá trình chuyển đổi duy nhất. Cú pháp: d-step { statement1; ... ;statementn }  Cú pháp TIME-OUT Lệnh sẽ được thực thi nếu không có một lệnh khác trong các tiến trình khác đang thực thi. Giố ng như thời gian chờ của Hệ thống Spin sử d ụng để giải quyết bế tắc xung đột. Nó không phải là một tính năng thời gian thực và có thể không được sử dụng trong mô hình times-outs tham gia vàothiết kế hệ thống. Sự khác biệt khi sử dụng 2 từ khóa Atomic, D-step trong bài toán cụ 2.6 thể  Mô hình o K hi không sử dụng từ khóa trong chương trình 13
  14. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Hình 1: Khi không sử dụng từ khóa Các trạng thái sinh ra khi không sử d ụng từ khóa sẽ được tăng lên theo công bội. Trong trường hợp này tất cả các trạng thái có thể tạo được từ chương trình đ ều có thể sinh ra. Do đó những trạng thái không cần thiết mà vẫn được lưu trữ trong bộ nhớ sẽ làm lãng phí mộ t phần bộ nhớ và số lượng trạng nhiều như vậy sẽ làm cho người thiết kế khó có thể kiểm soát được. o K hi sử dụng từ khóa Atomic 14
  15. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Hình 2: khi sử dụng từ khóa Atomic Mặc dù câu lệnh Atomic sẽ không được chạy xen kẽ nhau nhưng các trạng thái trung gian vẫn sẽ được khởi tạo và lưu trữ trong stack. Do đó khi có một trạng thái trung gian (trạng thái A) bị khóa , ngắt thì lời gọi Atomic sẽ bị m ất và các trạng thái trung gian sẽ được đến thăm. o K hi sử dụng từ khóa D-STEP 15
  16. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Hình 3: khi sử dụng từ khóa D-Step Khác với từ khóa Atomic, từ khóa D-Step thực thi mộ t mã lênh nếu một bước hay giao dịch nào bị khóa thì chương trình sẽ bị lỗi. Các trạng thái trung gian sẽ không được khởi tạo.  Một chương trình đ ơn giản để kiểm tra chức năng khi sử dụng các từ khóa o Mã lệnh: Khi không sử dụng từ khóa nào. 16
  17. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. int x=0 int y=0;int z=0 proctype A(){ printf("gia tri x1= %d \n", 1); printf("gia tri y1= %d \n", 1); printf("gia tri z1= %d\n", 1); } proctype B(){ printf("gia tri x2= %d \n", 2); printf("gia tri y2= %d \n", 2); printf("gia tri z2= %d\n", 2); } init { run A(); run B(); } Hình 4: Chương trình không sử dụng lệnh Atomic, D-step Khi không sử dụng từ khóa nào thì số các trạng thái sinh ra trong ví dụ trên sẽ là 9 trường hợp. Do các câu lệnh trong hai tiến trình sẽ chạy xen kẽ với nhau. o Mã lệnh: Khi sử dụng từ khóa atomic hoặc D -step Do chức năng của mã lệnh atomic và D-step là tương đối giống nhau chỉ khác nhau đôi chút về trạng thái trung gian được khởi tạo. Atomic : Khởi tạo trạng thái trung gian nhưng chỉ lưu vào stack. Cho đến khi nào có mộ t trạng thái bên trong mã lệnh atomic bị khóa, ngắt thì mới thực hiện các trạng thái trong Stack. D -step: Không khởi tạo trạng thái trung gian nên khi có một trạng thái nào bên trong mã lệnh D-step bị khóa thì chương trình thực thi sẽ bị lỗi. 17
  18. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. int x=0 int y=0; int z=0 proctype A(){ atomic{ printf("gia tri x1= %d \n", 1); printf("gia tri y1= %d \n", 1); printf("gia tri z1= %d\n", 1); } } proctype B(){ printf("gia tri x2= %d \n", 2); printf("gia tri y2= %d \n", 2); printf("gia tri z2= %d\n", 2); } init { run A(); run B(); } Hình 5: Khi sử dụ ng từ khóa Atomic, D-step Trong trường hợp này thì số các trạng thái sinh ra sẽ giảm đi bởi vì khi bắt đầu đ ến trạng thái x1 thì chương trình phải chạy hết đến trạng thái x3 rồi mới xen kẽ tới các trạng thái khác được. Dựa vào đặc điểm này mà người kiểm thử có thể loại bớt đi được khá nhiều các trạng thái không cần thiết. 18
  19. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. CHƯƠNG 3 TRÌNH BÀY CÔNG CỤ SPIN, THAM SỐ , CÚ PHÁP LỆNH Sơ lược về công c ụ spin 3.1 SPIN là công cụ mã nguồ n mở, phổ biến và được sử dụng bởi hàng ngàn người trên toàn cầu. SPIN được sử dụng cho việc xác minh thẩm định của các hệ thống phân phối phần mềm. Nó cung cấp một giả lập cho phép các nhà thiết kế đ ạt được kết quả phản hồ i từ hệ thống mô hình của họ. Những kết quả p hản hồi đó đóng vai trò quan trọng trong sự hiểu biết của các nhà thiết kế về hệ thố ng trước khi họ đầu tư vào phân tích chính thức. Lịch sử p hát triển công cụ SPIN 3.2 Từ năm 1980 Spin được phát triển tại Bell Labs của nhóm Unix Phần mềm này phát triển rộng rãi từ năm 1991. Tháng 4 năm 2002 Spin được trao giải thưởng phần mềm uy tín cho năm 2001 của ACM. Các version chính: năm 1991 là 1.0 (initial version) tới năm 2002 đ ã có SPIN version 4.0 (automata extration from C code). 1.0 Jan 1991 Initial version (Holzmann 1991 2.0 Jan 1995 Partial order reduction 3.0 Apr 1997 Minimised automaton representation 4.0 Late 2002 Ax: automata extraction from C code 5.0 Oct 2007 Multi-core & swarm support 6.0 Dec 2010 Inline LTL formula parallel bfs Một số yếu tố thành công của SPIN 3.3 Cú pháp thực hiện (bằng cách sử dụng tựa ngôn ngữ C). Giao diện người dùng đồ họa đẹp Xspin. 19
  20. Bộ môn : Các vấn đề hiện đại công nghệ phần mềm. Không chỉ là một công cụ nghiên cứu, mà còn là công cụ hỗ trợ. Chứa nhiều hơn so với nhiều thập kỷ nghiên cứu kéo xác minh máy tính tiên tiến AIDEC (nhiều thuật toán tối ưu hóa). Kiến trúc SPIN – Cấp độ tổ chức Spin 3.4 Hình 6: Cấp độ tổ chức SPIN Công cụ dòng lệnh. 3.4 3.4.1 Cú pháp Spin Một số câu lênh trong SPIN. Spin –a [-m] [-Pcpp] file spin [-bglmprsv] [-J] [-qN] [-nN] [-Pcpp] file spin -c [-t] [-Pcpp] file spin -d [-Pcpp ] file spin -f LTL spin -F file spin -i [-bglmprsv] [-J] [-qN] [-Pcpp] file 20
nguon tai.lieu . vn