Xây dựng mô hình có vai trò hết sức quan trọng, nếu việc xây dựng mô hình không chính xác thì các công đoạn về sau trong hệ thống kiểm thử dựa trên mô hình không thể chính xác được.. Do
Trang 1Đoàn Trung Kiên
KIỂM THỬ DỰA TRÊN MÔ HÌNH
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin
HÀ NỘI - 2010
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đoàn Trung Kiên
KIỂM THỬ DỰA TRÊN MÔ HÌNH
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Trang 3Tôi xin cảm ơn sự quan tâm, giúp đỡ và ủng hộ của anh chị, bạn bè, đặc biệt
là các bạn sinh viên lớp K51CB trường Đại học Công nghệ trong quá trình thực hiện khóa luận
Mặc dù đã cố gắng hoàn thành khóa luận trong phạm vi và khả năng cho phép nhưng chắc chắn sẽ không tránh khỏi những thiếu sót Em rất mong nhận được
sự thông cảm, góp ý và tận tình chỉ bảo của quý Thầy Cô và các bạn
Hà Nội, ngày 05 tháng 05 năm 2008
Đoàn Trung Kiên
Trang 4TÓM TẮT
Quá trình sinh các ca kiểm thử tự động dựa trên mô hình gồm các công đoạn chính: Xây dựng mô hình, nhúng mã C, áp dụng công cụ Spin để sinh các ca kiểm thử Trong đó xây dựng mô hình là công đoạn đầu tiên, nhiệm vụ chính ở đây là từ
mô tả các yêu cầu của hệ thống và chức năng xác định cùng với dữ liệu đầu vào và
ra phải xây dựng được mô hình của hệ thống Xây dựng mô hình có vai trò hết sức quan trọng, nếu việc xây dựng mô hình không chính xác thì các công đoạn về sau trong hệ thống kiểm thử dựa trên mô hình không thể chính xác được Do tầm quan trọng đó của việc xây dựng mô hình, khóa luận này đề cập tới các lý thuyết cơ bản
về xây dựng mô hình của hệ thống bằng ngôn ngữ mô hình promela
Trong khóa luận này tôi trình bày phương pháp nhúng mã nguồn C vào trong
mô tả promela để lọc các trạng thái và sinh các ca kiểm thử một cách tự động bằng công cụ hỗ trợ kiểm thử Spin Từ đó áp dụng các kỹ thuật trên vào bài toán cụ thể kitchen timer
Trang 5MỤC LỤC
CHƯƠNG 1 GIỚI THIỆU 1
1.1 Đặt vấn đề 1
1.2 Nội dung nghiên cứu của khóa luận 1
1.3 Cấu trúc khóa luận 1
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT CHO KIỂM THỬ MÔ HÌNH 3
2.1 Khái niệm kiểm thử dựa trên mô hình 3
2.2 Các bước thực hiện 3
2.3 Thuận lợi và khó khăn của kiểm thử dựa trên mô hình 4
2.4 Máy hữu hạn trạng thái ( Finite State Machines ) 5
2.5 Bài toán Kitchen Timer 6
2.5.1 Miêu tả bài toán 6
2.5.2 Xây dựng mô hình 6
CHƯƠNG 3 GIỚI THIỆU PROMELA VÀ SPIN 8
3.1 Ngôn ngữ Promela 8
3.1.1 Khái niệm cơ bản 8
3.1.2 Biến và Kiểu 9
3.1.3 Định danh, Hằng số và Biểu thức 10
3.1.4 Tiến trình 11
3.2 Công cụ Spin 12
3.2.1 Sơ lược về Spin 12
3.2.2 Công cụ XSpin 12
CHƯƠNG 4 SINH CA KIỂM THỬ TỰ ĐỘNG VÀ THỰC NGHIỆM 21
4.1 Phương pháp sinh các ca kiểm thử tự động 21
4.2 Ví dụ áp dụng 22
4.2.1 Mô tả bài toán 23
4.2.2 Máy hữu hạn trạng thái của Kitchen Timer 23
4.2.3 Đặc tả kitchen timer bằng promela có nhúng mã C 24
4.2.4 Kết quả 30
CHƯƠNG 5 KẾT LUẬN 32
Phụ lục A: Đặc tả của kitchen timer bằng promela có nhúng mã C 33
Phụ lục B: Một số ca kiểm thử 42
TÀI LIỆU THAM KHẢO 44
Trang 6DANH MỤC HÌNH VẼ
Hình 1: Các bước thực hiện kiểm thử mô hình .4
Hình 2: Mô hình chuyển đổi trạng thái của kitchen timer .7
Hình 3: Màn hình cửa sổ chính của XSpin .13
Hình 4: Cửa sổ chức năng Run Slicing algorithm 14
Hình 5: Cửa sổ chính chức năng Set Simulation Parameters .15
Hình 6: Cửa sổ khi chạy chức năng Run Simulation .16
Hình 7: Cửa sổ chính chức năng Set Verification Parameters 17
Hình 8: Cửa sổ khi chạy chức năng Run Verification 18
Hình 9: Cửa sổ khi chạy chức năng LTL Property Manager 19
Hình 10: Cửa sổ khi chạy chức năng View Spin Automaton .20
Hình 11: Kiến trúc hệ thống kitchen timer .23
Hình 12: Mô hình máy hữu hạn trạng thái kitchen timer .24
Trang 7CHƯƠ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
Do đó, khoá luận này 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ống và thực nghiệm
1.2 Nội dung nghiên cứu của khóa luận
Bài toán thực hiện trong khóa luận này là bài toán kiểm thử dựa trên mô hình
để sinh ra các ca kiểm thử một cách tự động Thiết kế hệ thống bằng ngôn ngữ Promela và nhúng mã C vào thiết kế Promela là hai nội dung quan trong nhất của quá trình sinh ca kiểm thử tự động Tôi nghiên cứu phương pháp được sử dụng để thực hiện các nội dung đó, và áp dụng nó vào bài toán sinh ca kiểm thử tự động của
hệ thống máy hẹn giờ kitchen timer
Quá trình thực nghiệm sẽ bao gồm các thực nghiệm về thiết kế hệ thống kitchen timer bằng Promela, nhúng mã nguồn C vào thiết kế Promela của hệ thống
và sử dụng Spin sinh các ca kiểm thử một cách tự động
1.3 Cấu trúc khóa luận
Các phần còn lại của khóa luận có cấu trúc như sau:
Trang 8Chương 2 trình bày cơ sở lý thuyết của kiểm thử mô hình, bao gồm các khái niệm cơ bản, các bước thực hiện, lợi ích của kiểm thử mô hình và cách thức xây dựng mô hình (máy hữu hạn trạng thái)
Chương 3 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 4 trình bày về các kết quả thực nghiệm của quá trình mô tả máy hẹn giờ kitchen timer, thiết kế mô hình hệ thống kitchen timer bằng Promela, và quá trình sinh ca kiểm thử tự động
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 9CHƯƠNG 2
CƠ SỞ LÝ THUYẾT CHO KIỂM THỬ MÔ HÌNH
Quá trình thiết kế mô hình của hệ thống bằng ngôn ngữ mô hình Promela làm việc dựa trên các khái niệm về kiểm thử mô hình Chương này sẽ lần lượt trình bày những khái niệm cơ bản về kiểm thử mô hình
2.1 Khái niệm kiểm thử dựa trên mô hình
Theo Colin Campbell, kiểm thử dựa trên mô hình là một kỹ thuật kiểm thử
mà các hoạt động của hệ thống được chạy thử trong một thời gian sẽ được dự đoán trước, nó được thực hiện bởi một đặc tả hình thức hoặc một mô hình của hệ thống
Các mẫu thiết kế hay mô hình là mô tả đơn giản của hệ thống dựa trên yêu cầu hệ thống và chức năng xác định, giúp chúng ta có thể hiểu và dự đoán được hành vi của hệ thống
2.2 Các bước thực hiện
Quá trình kiểm thử dựa trên mô hình được bắt đầu bằng việc xác định yêu cầu của hệ thống từ đó xây dựng mô hình dựa vào các yêu cầu và chức năng của hệ thống Việc xây dựng mô hình còn phải dựa trên các yếu tố dữ liệu đầu vào và đầu
ra Mô hình này được sử dụng để sinh ra các ca kiểm thử Chúng ta có thể biết kết quả đầu ra mong đợi từ mô hình hoặc từ quy định chuẩn ( oracle ) Khi chạy kịch bản và kết quả thu được sẽ được so sánh với kết quả mong đợi Từ đó quyết định hành động tiếp theo như sửa đổi mô hình hoặc dừng kiểm thử,…
Các bước để thực hiện kiểm thử dựa trên mô hình:
Xây dựng mô hình dựa trên các yêu cầu và chức năng của hệ thống
Tạo đầu ra dự kiến từ mô tả bài toán
Chạy kịch bản kiểm thử
So sánh kết quả đầu ra thực tế với kết quả đầu ra dự kiến
Quyết định hành động tiếp theo (Sửa đổi mô hình, tạo thêm ca kiểm thử, dừng kiểm thử, đánh giá chất lượng của phần mềm )
Các bước thực hiện kiểm thử dựa trên mô hình được minh họa bằng sơ
đồ sau:
Trang 10Hình 1: Các bước thực hiện kiểm thử mô hình
2.3 Thuận lợi và khó khăn của kiểm thử dựa trên mô hình
Thuận lợi
Trong phát triển phần mềm các kiểm thử viên thường thực hiện công việc của mình bằng phương pháp truyền thống nên thường thiếu thời gian để
thực hiện kiểm thử, hoặc giá thành sản phẩm khi hoàn thành thường cao…
Và kiểm thử dựa trên mô hình sẽ khắc phục được một số nhược điểm đó:
Do quá trình sinh ca kiểm thử là tự động vì vậy mà rút ngắn thời làm phần mềm, và chất lượng phần mềm tốt hơn
Đặc biệt tuy chi phí lớn cho việc xây dựng mô hình nhưng điều này sẽ được khấu trừ do chi phí bảo dưỡng thấp hơn nhiều khi hệ thống được hoạt động
Quá trình sinh ra các ca kiểm thử được thực hiện một cách tự động nên sinh ra nhiều ca kiểm thử và phát hiện nhiều lỗi
Người kiểm thử phần mềm cần thường xuyên trao đổi với người phát triển phần mềm trong khi xây dựng mô hình hệ thống vì vậy mà
Trang 11tăng khả năng giao tiếp trao đổi giữa người phát triển phần mềm, và người kiểm thử
Người kiểm thử sẽ không bị nhàm chán khi phải thực hiện lặp lại nhiều lần một công việc, điều đó làm cho người kiểm thử hài lòng với công việc của mình
Sớm phát hiện lỗi và sự không rõ ràng trong đặc điểm kỹ thuật và thiết kế vì vậy sẽ tăng thời gian giải quyết vấn đề trong kiểm thử
Tự động tạo và kiểm tra chánh các ca kiểm thử trùng nhau hoặc không hữu hiệu
Khi một yêu cầu của hệ thống thay đổi việc thay đổi các ca kiểm thử là rất phức tạp nhưng nó được giải quyết khi mà kiểm thử dựa trên
mô hình Việc thay đổi các ca kiểm thử chỉ việc thay đổi mô hình của
Giống như các phương pháp kiểm thử khác, việc kiểm thử dựa trên
mô hình chỉ phát hiện được lỗi của hệ thống mà không thể phát hiện được hệ thống còn lỗi hay không
2.4 Máy hữu hạn trạng thái ( Finite State Machines )
Trong kiểm thử phần mềm có nhiều kiểu mô hình được sử dụng như : Finite State Machines, UML, Grammars, Trong nghiên cứu này trình bày về mô hình máy hữu hạn trạng thái: Finite State Machines
Một máy trạng thái mô tả cho hệ thống phần mềm được định nghĩa dựa vào ( I, S, T, F, L), trong do:
Trang 12I : Tập hợp các yếu tố đầu vào của hệ thống
S : Tập các trạng thái của hệ thống
T : Tập hợp hàm chuyển đổi trạng thái khi đầu vào là một trạng thái cụ thể
F : Tập hợp các trạng thái kết thúc
L : Trạng thái ban đầu của hệ thống
2.5 Bài toán Kitchen Timer
Chúng ta sẽ dựa vào các khái niệm của máy hữu hạn trạng thái để xây dựng
mô hình hệ thống kitchen timer
2.5.1 Miêu tả bài toán
Kitchen timer là một thiết bị hẹn giờ đơn giản dùng trong nhà bếp Chúng ta
ấn nút SW1 để thiết lập thời gian cho hệ thống, ấn nút SW2 để bắt đầu đếm ngược thời gian Thời gian có thể thiết lập được là 1 phút đến 3 phút (đơn vị thời gian thiết lập là phút) Thời gian thiết lập được hiển thị bằng 2 đèn LED Khi đếm ngược thời gian, 2 đèn LED sẽ nhấp nháy Nếu đang trong lúc đang đếm ngược, ấn nút SW1 thì đếm ngược sẽ bị dừng (trở về trạng thái thiết lập), ấn nút SW2 thì đếm ngược sẽ tạm thời dừng Nếu đếm ngược kết thúc (thời gian trở về 0) thì 2 đèn LED sẽ cùng sáng trong vòng 3 giây để thông báo cho người dùng biết
2.5.2 Xây dựng mô hình
Biểu diễn:
“Kitchen Timer” = (I, S, T, F, L) trong đó:
I = {<Thiết lập>, <Đếm ngược>, <Tạm dừng>, <Tiếp tục>,<Đếm ngược kết thúc>}
S = {[Chờ], [Thiết lập thời gian], [Đếm ngược], [Tạm dừng]}
T:
<Thiết lập> Thay đổi từ [Chờ] sang [Thiết lập thời gian]
<Đếm ngược> Thay đổi từ [Thiết lập thời gian] sang [Đếm ngược]
<Tạm dừng> Thay đổi từ [Đếm ngược] sang [Tạm dừng]
<Tiếp tục> Thay đổi từ [Tạm dừng] sang [Đếm ngược]
<Đếm ngược kết thúc> Thay đổi từ [Đếm ngược] sang [Chờ]
Trang 13F = [Chờ]
L = [Chờ]
Mô hình chuyển đổi trạng thái
Hình 2: Mô hình chuyển đổi trạng thái của kitchen timer
Thiết lập
Đếm ngược
dừng
Đếm ngược kết thúc
Trang 14CHƯƠNG 3 GIỚI THIỆU PROMELA VÀ SPIN
Chương này chúng ta sẽ biết cách sinh các ca kiểm thử một cách tự động bằng công cụ Spin Để có thể làm việc được với Spin chúng ta phải xây dựng mô hình của hệ thống bằng ngôn ngữ Promela Chương này sẽ lần lượt trình bày những khái niệm cơ bản về ngôn ngữ mô hình Promela, công cụ Spin, và giao diện người dùng XSpin
3.1 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ạ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
3.1.1 Khái niệm cơ bản
Đị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 15proctype Sender() {
// Thân một tiến trình
} proctype Receiver() {
Trang 16byte f2;
} Truy cập như C
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}
Trang 17 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:
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;
Trang 18Mỗ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
3.2 Công cụ Spin
3.2.1 Sơ lược về Spin
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 Nó đượ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
Từ năm 1980 Spin được phát triển tại Bell Labs của nhóm Unix thuộc trung tâm nghiên cứu Khoa học máy tính 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
Spin 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.2 Công cụ XSpin
Có giao diện thân thiện người dùng cửa sổ soạn thảo chính với khả năng chỉnh sửa và tìm kiếm là đơn giản XSpin là công cụ thuận tiện để tiếp cận với Spin
Trang 19Hình 3: Màn hình cửa sổ chính của XSpin
Run Syntax Check
Kiểm tra cú pháp ngôn ngữ Promela
Luôn luôn là bước đầu tiên sau khi thay đổi chương trình Promela
Trang 20Hình 4: Cửa sổ chức năng Run Slicing algorithm
Run Slicing Algorithm
Xác định những thành phần không liên quan của mô hình
Biểu diễn sự phân tích lưu lượng dữ liệu
Set Simulation Parameters (Hỗ trợ gỡ lỗi quan trọng nhất)
Thiết lập thông số hiển thị:
Message Sequence Chart (MSC) Panel: Cung cấp quá trình giao tiếp theo thời gian Kiểm soát cách trình bay các liên kết giữa MSC và Promela bên trong của sổ văn bản chính được hỗ trợ thông qua bảng điều khiển này
Time Sequence Panel: Cung cấp quá trình giao tiếp theo thời gian
Data Values Panel: Trình bay dữ liệu theo thời gian Tùy chọn gồm các kênh đệm các biến địa phương và biến toàn cục
Trang 21 Random : Yêu cầu người sử dụng cung cấp một giá trị seed
Hình 5: Cửa sổ chính chức năng Set Simulation Parameters
Run Simulation
Việc thiết lập các thông số hiển thị phải được thực hiện ít nhất một lần trước khi thực hiện chạy Simulation
Việc thiết lập mặc định thông số hiển thị sẽ sinh ra 3 của sổ sau:
Simulation Output: Cung cấp 2 phương thức : Chạy từng bước (Single Step) hoặc chạy liên tục (Run)
Data Values
Sequence Chart
Trang 22Hình 6: Cửa sổ khi chạy chức năng Run Simulation
Thiết lập thông số Verification
Kiểm tra mô hình
Đảm bảo thực hiện an toàn và xác minh tính chất
Correctness Properties: Safety, Liveness
Trang 23Hình 7: Cửa sổ chính chức năng Set Verification Parameters
Run Verification
Set verification parameters
(Re)run verification
Trang 24Hình 8: Cửa sổ khi chạy chức năng Run Verification
LTL Temporal Logic Formulae
LTL = Mệnh đề Logic + toán tử điều khiển thời gian
Giúp chỉnh sửa và bảo trì các công thức logic
Theo thời gian trong Spin
Bước 1: Chạy “LTL Property Manager”
Bước 2: Nhập vào đặc tính thời gian mà bạn muốn thẩm định Chú
ý phải là biểu thức bất biến và tên bằng chữ thường
Bước 3: Chỉ ra là có hay không đặc tính thời gian cần giữ:
all executions (desired behaviour) hoặc
no executions (error behaviour)
Bước 4: Nhập vào một định nghĩa vi mô đối với mỗi hằng số mệnh
đề trong của sổ phụ “Symbol Definitions”
Trang 25 Bước 5: Ấn vào nút “Run Verification” và tiếp tục ấn vào nút
“Run” trong của sổ “LTL Verification”
Chú ý là những thông số của LTL có thể lưu lại để sử dụng trong tương lai bằng nút “Save As” và “Load”
Hình 9: Của sổ khi chạy chức năng LTL Property Manager
View Spin Automaton (FSM View)