Ở đây chúng em xin giớithiệ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
Trang 1Báo cáo môn học các vấn đề hiện đại công
nghệ phần mềm
Trang 2LỜ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.
Trang 3Ph l c ụ lục ụ 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
2.1 Khái niệm cơ bản ngôn ngữ Promela 6
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
3.1 Sơ lược về công cụ spin 17
3.2 Lịch sử phát triển công cụ SPIN 17
3.3 Một số yếu tố thành công của SPIN 17
3.4 Kiến trúc SPIN – Cấp độ tổ chức Spin 18
3.4 Công cụ dòng lệnh 18
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
4.2 Các loại trình soạn thảo Emacs 22
4.4 Bộ gõ 23
4.4 Giao diện trình soạn thảo Emacs 23
4.6 Cấu trúc lệnh Emac 24
4.5 Các phím đơn 24
Trang 44.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.
Trang 5CHƯƠ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ủakiểm thử viên được thực hiện thủ công bằng tay Trong khi đó số lượng tìnhhuống kiểm tra quá nhiều mà các kiểm thử viên không thể hoàn tất bằng taytrong thời gian cụ thể nào đó Hoặc khi nhóm lập trình đưa ra nhiều phiên bảnphầ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ảnphầ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 codecho 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ắcphụ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ứcnă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ểmtra tốt trước đó Điều này khó khả thi về mặt thời gian nếu kiểm tra thôngthườ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ựchiệ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ớithiệ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ứukiểm thử dựa trên mô hình và ứng dụng công cụ Spin vào việc tự động sinhcá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ìnhkhá 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
Trang 6Bài báo cáo trình bày ngôn ngữ Promela vào thiết kế Promela và ápdụ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ìnhnhỏ 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ìnhsoạn thảo Emac phục vụ cho việc nghiên cứu, giảng dậy và ứng dụng thựctiễ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,
bao 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
Trang 7CHƯƠ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ìnhPromela Khái niệm cụ thể về cấu trúc cú pháp lệnh, thủ tục hàm, cách khaibáo biến trong Promela
2.1 Khái niệm cơ bản ngôn ngữ Promela
Xây dựng mô hình hệ thống bằng ngôn ngữ Promela là một công đoạnquan 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:
Khai báo kiểu
Khai báo biến
Khai báo tiến trình
Trang 8và 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 địaphương của mỗi tiến trình.
Trang 9Lư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 <name> = [<dim>] of <type1>,<type2>, <typen>;
Cú pháp gửi tin nhắn trong một kênh (!)
chan-name ! <expr1>, <expr2> <exprn>;
Cú pháp nhận tin nhắn trong một kênh (?)
chan-name ? <expr1>, <expr2> <exprn>;
Trang 10 Cú pháp của một khai báo tiến trình
proctype name( /* formal parameter list */ )
{
/* các khai báo địa phương và các lệnh */
…}
/* và */ quy định giới hạn chú thích trong promela
Tiến trình init
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:
Trang 11init { /* 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 đồngthờ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 quaviệ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ựchiệ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 () }
2.5 Lệnh và cấu trúc lệnh Promela
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
:: choice1 -> stat1.1; stat1.2;
:: choice2 -> stat2.1; stat2.2;
::
:: choicen -> statn.1; statn.2;
fi;
Trang 12Lự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;
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”
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áclệ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ể xen kẽ vào giữa
Cú pháp:
Trang 13atomic { 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 đổiduy nhất
Trang 14Hình 1: Khi không sử dụng từ khóaCác trạng thái sinh ra khi không sử dụng từ khóa sẽ được tăng lên theo côngbội Trong trường hợp này tất cả các trạng thái có thể tạo được từ chươngtrình đều có thể sinh ra Do đó những trạng thái không cần thiết mà vẫn đượclưu trữ trong bộ nhớ sẽ làm lãng phí một phần bộ nhớ và số lượng trạng nhiềunhư vậy sẽ làm cho người thiết kế khó có thể kiểm soát được.
o Khi sử dụng từ khóa Atomic
Trang 15Hì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ạngthái trung gian vẫn sẽ được khởi tạo và lưu trữ trong stack Do đó khi có mộttrạ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 Khi sử dụng từ khóa D-STEP
Trang 16Hình 3: khi sử dụng từ khóa D-StepKhá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ướchay 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
Trang 17Hì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ạngthái nào bên trong mã lệnh D-step bị khóa thì chương trình thực thi
Trang 18Hình 5: Khi sử dụng từ khóa Atomic, D-stepTrong trường hợp này thì số các trạng thái sinh ra sẽ giảm đi bởi vì khibắ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ồimớ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ườikiể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.
Trang 19CHƯƠNG 3
TRÌNH BÀY CÔNG CỤ SPIN, THAM SỐ, CÚ PHÁP LỆNH
3.1 Sơ lược về công cụ spin
SPIN là công cụ mã nguồn mở, phổ biến và được sử dụng bởi hàngngà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ốngphâ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ả phả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
3.2 Lịch sử phát triển công cụ SPIN
Từ năm 1980 Spin được phát triển tại Bell Labs của nhóm Unix Phầnmề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 chonă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 19912.0 Jan 1995 Partial order reduction
3.0 Apr 1997 Minimised automaton
representation4.0 Late 2002 Ax: automata extraction from C
code5.0 Oct 2007 Multi-core & swarm support6.0 Dec 2010 Inline LTL formula parallel bfs3.3 Một số yếu tố thành công của SPIN
Cú pháp thực hiện (bằng cách sử dụng tựa ngôn ngữ C)
Trang 20Giao diện người dùng đồ họa đẹp Xspin.
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áytính tiên tiến AIDEC (nhiều thuật toán tối ưu hóa)
3.4 Kiến trúc SPIN – Cấp độ tổ chức Spin
Hình 6: Cấp độ tổ chức SPIN3.4 Công cụ dòng lệnh
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
Trang 213.4.2 Tùy chọn và chức năng của mỗi lệnh
Bắt đầu bằng việc viết một chương trình có vai trò như một mô hình hệthống cần được kiểm thử (được viết bằng ngôn ngữ Promela)
Ví dụ: trong bài trình bày của nhóm em, em sử dụng counter.plm làmfile đầu vào Nó đóng vai trò là mô hình hệ thống được kiểm thử
Gỡ lỗi chương trình
Chạy 2 câu lệnh sau:
$spin –c spec.pml
$spin –p spec.pml
Hai câu lệnh sẽ chạy mô phỏng mô hình Câu lệnh đầu tiên sẽ tính toán
và cho ta đầu ra của hệ thống từ những đầu vào được khai báotrong môhình Câu lệnh thứ hai cho ta quá trình mà hệ thống thay đổi theo khichạy mô hình
Thực hiện debugged bằng dòng lệnh:
$spin –a counter.pml # generate verifier
Đầu ra file pan.c mô tả hệ thống bằng ngôn ngữ C hoàn toàn tự động.
Biên dịch file pan.c Lúc này, quyết định quan trọng là chọn xác minhđầy đủ (Exhaustive verification) (CPU-time or memory) hoặc xác minhkhông đầy đủ (Supertrace verification)
Xác minh không đầy đủ (Exhaustive verification)
Sẽ là tối ưu nhất khi sử dụng tham số -o2 –o, thời gian chạy xác minh
có thể chỉ còn một nửa so với cách sử dụng các tham số khác
$ gcc -O2 -o pan pan.c # default compilation
Trang 22Nếu đã biết bao nhiêu phần của bộ nhớ vật lý được sử dụng thì có thể
sử dụng cú pháp sau: ví dụ có 256 Mb cho việc biên dịch, câu lệnhđược thực hiện sẽ là
$ gcc -O2 -DMEMLIM=256 -o pan pan.c # memory bound 256Mb
Nếu việc xác minh vẫn chạy ra khỏi bộ nhớ, có thể sử dụng nén thay vìtăng giới hạn bộ nhớ:
$ gcc -O2 -DMEMLIM=256 DCOLLAPSE -o pan pan.c # collapse compression
Nếu vẫn là vượt quá giới hạn bộ nhớ thì sẽ sử dụng lựa chọn thứ hai(Supertrace verification)
$ gcc -O2 -DMEMLIM=256 -DBITSTATE -o pan pan.c
# supertrace algorithm
Thực hiện việc xác minh tối ưu
o Một xác minh đầy đủ
$ /pan
o Một xác minh không đầy đủ
- Đối với chu kì acceptance cycles, sử dụng tham số -a:
- Đối với chu kì non-progress cycles:
$ gcc -O2 -DNP -o pan pan.c
Hoặc:
$ gcc -O2 -DNP -DBITSTATE -o pan pan.c
Tiếp theo là:
$ /pan -l
- Đối với chu kì non-progress cycles:
$ gcc -O2 -DSAFETY -o pan pan.c
Hoặc:
$ gcc -O2 -DSAFETY -DBITSTATE -o pan pan.c
o Có thể xác minh dựa độ xâu tìm kiếm
$ / Pan-m100000
Hoặc
Trang 23$ / Pan-m100000
Sau khi thực hiện một loạt các hoạt động xác minh trên, có thể vào file
‘spec.pml.trail ‘ với ‘spec.pml’ là tên đầu vào PROMELA để xem các lỗinhận được sau khi debug
o Để kiểm tra nguyên nhân gây ra lỗi sử dụng tham số -t
$ Spin-t-c spec.pml
$ Spin-t-M spec.pml
$ Spin-t-r-s-l-g spec.pml
Sinh test case
Mô hình SPIN và file thực thi pan sẽ cho ra một bộ test case một cách tựđộng SPIN gán số đầu vào cho tất cả các dòng lệnh Đầu ra của hệthống với số liệu đầu vào trước đó được liệt kê, giúp theo dõi những gìxảy ra của hệ thống Sử dụng tham số -d để xem thòi gian và quá trìnhchạy của hệ thống
$ pan -d -d # print full, unoptimized state machines
3.4.3 Một ví dụ đơn giản
Code và hướng dẫn thực thi được gửi kèm tài liệu báo cáo
3.4.4 SPIN và công cụ giao diện đồ họa khác
Hơn hai thập kỉ được nghiên cứu và phát triển, SPIN được phát triểnmạnh mẽ Các công cụ có giao diện đồ họa giúp tiếp cận với SPIN cũng rađời và phát triển không ngừng
Phải kể đến jSPIN, iSPIN, xSPIN Mỗi công cụ kể trên đều có nhữnglợi thế nhất định để các nhà kiểm thử hệ thống lựa chọn cho công việc chuyênmôn của mình
3.4.5 Hướng dẫn cài đặt SPIN
Tải về một phiên bản của SPIN từ trang chủhttp://spinroot.com/spin/Src/index.html Đổi tên file tải về thành spin.exe
Tải và cài đặt một trình biên dịch C Trong bài trình bày này, chúng em sử
dụng Cygwin Net Release Setup Program Có thể tải về từ địa chỉ sau: http://www.cygwin.com/
Copy spin.exe vào thư mục bin, nơi cài đặt Cygwin VD: C:\cygwin\