Trong thời đạicông nghệthông tin bùngnổ nhưhiệnnay, phần mềm đóngmột
vai tròcực kỳquan trọngtrong hầuhếtcáclĩnhvực của đờisống. Phầnmềm làmột sản
phẩmcần phải được đảm bảo vềchấtlượng. Đảm bảo chấtlượngphầnmềm(SQA-Software Quality Assuarance) làmộtnhiệmvụ đặc biệtquan trọngtrong pháttriển
phần mềm vàlàvấn đềsốngcòn đối vớitấtcảcáccông ty phầnmềm. Để đảm bảo chất
lượngphầnmềmthìtrong cácdự ánphầnmềmphảitiếnhành xácminh vàthẩm định.
Mộttrong cáchoạt độngxácminh vàthẩm địnhquan trọnglàtiếnhành kiểm thửphần
mềm. Kiểm thửcần được tiếnhành ởnhiềumứcvàphốihợpnhiềukỹthuậtkhácnhau.
Phần không thểthiếutrong kiểm thửlàviệc xây dựngcácca kiểm thử. Cácca kiểm thử
phải đủtốtmới cóthểpháthiệnra khiếmkhuyếtcủaphầnmềm. Một vấn đề đặtra ở
đây làlàmthếnào đểxác định được ca kiểm thử đólàtốt, nhữngtiêu chínào đánhgiá
chấtlượngcủachínhca kiểm thử? Vàcông việc tiếnhành kiểm tra khi nàothìdừnglại?
Nộidung củakhoáluậnsẽ đềcập đếnhai phương phápnhằmmục đíchxây dựng
cácca kiểm thửtốt đólàkỹthuậtphân tíchbao phủcode vàkỹthuật phân tíchgiátrị
điểmbiên. Phân tíchbao phủcode sẽphải tiếnhành xây dựngcácca kiểm thửtất cảcác
luồng đường đi cóthểqua chương trình, các luồng đường đi từinput tới output được
xác địnhdựatrên cácnhánhrẽcủachương trình. Thông thườngcáclỗivềlậptrình
thườnghay xảy ra tạigiátrịbiên do vậytạigiátrịbiên cầnphảithiếtkếca kiểm thử
kiểm tra nó. Trong phạmvi củakhoáluậnchúngtôi sẽtiếnhành cài đặtmột chương
trình nhằmtìmra cáccâu lệnh điềukhiển củafile nguồn java vàchỉra giátrịbiên trong
cácbiểu thứcso sánhnhằmmục đíchchỉra đểxuấtcácgiátrịbiên baseline vàrobust
cần được kiểm tra.
59 trang |
Chia sẻ: nhungnt | Lượt xem: 2466 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu về mức bao phủ của kiểm thử, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Vương Thị Quỳnh Dương
NGHIÊN CỨU VỀ MỨC BAO PHỦ CỦA KIỂM THỬ
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 - 2009
2
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Vương Thị Quỳnh Dương
NGHIÊN CỨU VỀ MỨC BAO PHỦ CỦA KIỂM THỬ
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn : TS. Trương Ninh Thuận
Cán bộ đồng hướng dẫn: ThS. Tô Văn Khánh
HÀ NỘI - 2009
3
LỜI CẢM ƠN
Bản thân em đạt được thành quả như ngày hôm nay là nhờ một phần không nhỏ
công lao dìu dắt của các thầy cô trong khoa Công Nghệ Thông Tin - Đại Học Công
Nghệ - Đại Học Quốc Gia Hà Nội. Em xin ghi nhận công lao của các thầy cô và em xin
gửi lời cảm ơn sâu sắc tới thầy cô.
Để hoàn thành được khoá luận này em xin gửi lời cảm ơn chân thành tới TS.
Trương Ninh Thuận và ThS. Tô Văn Khánh, hai thầy đã hướng dẫn, giúp đỡ, chỉ bảo rất
tận tình cho em.
Dù đã cố gắng rất nhiều trong quá trình làm khoá luận, nhưng cũng không thể
tránh khỏi những thiếu sót, em rất mong nhận được sự góp ý của các thầy, cô giáo để
em có thể hoàn thiện hơn.
Hà nội, ngày 23 tháng 5 năm 2009
Sinh viên: Vương Thị Quỳnh Dương
4
TÓM TẮT KHOÁ LUẬN
Trong thời đại công nghệ thông tin bùng nổ như hiện nay, phần mềm đóng một
vai trò cực kỳ quan trọng trong hầu hết các lĩnh vực của đời sống. Phần mềm là một sản
phẩm cần phải được đảm bảo về chất lượng. Đảm bảo chất lượng phần mềm (SQA-
Software Quality Assuarance) là một nhiệm vụ đặc biệt quan trọng trong phát triển
phần mềm và là vấn đề sống còn đối với tất cả các công ty phần mềm. Để đảm bảo chất
lượng phần mềm thì trong các dự án phần mềm phải tiến hành xác minh và thẩm định.
Một trong các hoạt động xác minh và thẩm định quan trọng là tiến hành kiểm thử phần
mềm. Kiểm thử cần được tiến hành ở nhiều mức và phối hợp nhiều kỹ thuật khác nhau.
Phần không thể thiếu trong kiểm thử là việc xây dựng các ca kiểm thử. Các ca kiểm thử
phải đủ tốt mới có thể phát hiện ra khiếm khuyết của phần mềm. Một vấn đề đặt ra ở
đây là làm thế nào để xác định được ca kiểm thử đó là tốt, những tiêu chí nào đánh giá
chất lượng của chính ca kiểm thử? Và công việc tiến hành kiểm tra khi nào thì dừng lại?
Nội dung của khoá luận sẽ đề cập đến hai phương pháp nhằm mục đích xây dựng
các ca kiểm thử tốt đó là kỹ thuật phân tích bao phủ code và kỹ thuật phân tích giá trị
điểm biên. Phân tích bao phủ code sẽ phải tiến hành xây dựng các ca kiểm thử tất cả các
luồng đường đi có thể qua chương trình, các luồng đường đi từ input tới output được
xác định dựa trên các nhánh rẽ của chương trình. Thông thường các lỗi về lập trình
thường hay xảy ra tại giá trị biên do vậy tại giá trị biên cần phải thiết kế ca kiểm thử
kiểm tra nó. Trong phạm vi của khoá luận chúng tôi sẽ tiến hành cài đặt một chương
trình nhằm tìm ra các câu lệnh điều khiển của file nguồn java và chỉ ra giá trị biên trong
các biểu thức so sánh nhằm mục đích chỉ ra để xuất các giá trị biên baseline và robust
cần được kiểm tra.
5
Mục lục
CHƯƠNG 1. MỞ ĐẦU...............................................................................................10
1.1 Bối cảnh nghiên cứu ..........................................................................................10
1.2 Nội dung bài toán ..............................................................................................11
1.3 Cấu trúc của khoá luận.......................................................................................12
CHƯƠNG 2. GIỚI THIỆU VỀ BAO PHỦ CODE ......................................................14
2.1 Bao phủ code là gì ?...........................................................................................14
2.2 Tại sao cần đo lượng code được bao phủ ?.........................................................14
2.3 Làm thế nào để xác định lượng code được bao phủ ? .........................................15
2.4. Trong tiến trình test thì bao phủ code hợp với kỹ thuật kiểm thử nào ? ............15
2.4.1 Kiểm thử hộp đen .......................................................................................15
2.4.2 Kiểm thử hộp trắng .....................................................................................15
2.4.3 Bao phủ code ..............................................................................................16
CHƯƠNG 3. GIỚI THIỆU MỘT SỐ PHƯƠNG PHÁP BAO PHỦ ............................17
3.1 Bao phủ câu lệnh (Statement coverage) .............................................................17
3.2 Bao phủ nhánh (Branch coverage) .....................................................................17
3.3 Bao phủ đường đi (path coverage) .....................................................................18
3.4 Bao phủ điều kiện (condition coverage) .............................................................18
3.5 Bao phủ nhiều điều kiện (multiple condition coverage) .....................................18
CHƯƠNG 4. PHÂN TÍCH, ĐÁNH GIÁ CÁC PHƯƠNG PHÁP BAO PHỦ ..............19
4.1 Phân tích phương pháp bao phủ câu lệnh (statement coverage) ..........................19
4.2 Phân tích phương pháp bao phủ nhánh (branch coverage)..................................23
4.3 Phân tích phương pháp bao phủ đường đi (path coverage) .................................28
CHƯƠNG 5. PHÂN TÍCH GIÁ TRỊ ĐIỂM BIÊN......................................................33
5.1 Giới thiệu...........................................................................................................33
5.2 Phân hoạch tương đương(equivalence partitioning) ...........................................33
5.3 Phân tích giá trị biên (boundary value analysis) .................................................34
5.3.1 Tổng quan về phân tích giá trị điểm biên.....................................................34
5.3.2 Lựa chọn các ca kiểm thử sử dụng phân tích giá trị điểm biên.....................34
5.3.3 Phân tích giá trị biên đơn biến (Single-Variable BVA)................................35
5.3.4 Phân tích giá trị biên đa biến (Multi – Variable BVA).................................36
5.3.5 Kết luận ......................................................................................................40
CHƯƠNG 6. THỰC NGHIỆM ...................................................................................41
6.1 Ví dụ một chương trình đơn giản .......................................................................41
6.1.1 Xây dựng các ca kiểm thử cho chương trình trên ........................................42
6.1.2 Kết luận ......................................................................................................46
6.2 Chương trình cài đặt tìm kiếm các câu lệnh rẽ nhánh trong mã nguồn java. .......46
6.2.1 Giới thiệu về chương trình ..........................................................................46
6.2.2 Mô tả các chức năng chính..........................................................................46
6.2.3 Biểu đồ trình tự ...........................................................................................47
6.2.4 Thuật toán đã sử dụng .................................................................................49
6.2.5 Các lớp cài đặt ............................................................................................51
6.2.5 Kết quả thao tác các chức năng giữa người dùng và chương trình như sau ..51
6.3 Kết luận .............................................................................................................56
6
CHƯƠNG 7: KẾT LUẬN KHOÁ LUẬN ...................................................................57
7.1 Kết luận về khoá luận ........................................................................................57
7.2 Hướng nghiên cứu phát triển trong tương lai......................................................57
TÀI LIỆU THAM KHẢO ...........................................................................................59
7
DANH SÁCH CÁC HÌNH VẼ
Hình 1 : Kết quả kiểm tra mã nguồn được thực thi ......................................................20
Hình 2 : Kết quả đo bao phủ dòng lệnh........................................................................23
Hình 3 : Kết quả thực hiện test case 1..........................................................................26
Hình 4 : Kết quả đo bao phủ nhánh khi thực hiện test case 1 .......................................26
Hình 5 : Kết quả khi thực hiện test case 2 ....................................................................27
Hình 6 : Kết quả đo bao phủ nhánh khi thực hiện test case 2 ......................................27
Hình 7: Kết quả thực hiện test case 3...........................................................................30
Hình 8 : Kết quả đo bao phủ khi thực hiện test case 3..................................................31
Hình 9 : Kết quả thực hiện test case 4..........................................................................32
Hình 10 : Kết quả đo bao phủ khi thực hiện test case 4................................................32
Hình 11 : Tập hợp các giá trị biên baseline cho đơn biến trên một khoảng đầu vào .....35
Hình 12 : Đường các giá trị baseline và robust cho đơn biến trên một khoảng đầu vào 36
Hình 13 : Tập hợp các giá trị baseline và rubust trường hợp đơn biến trên hai khoảng
đầu vào........................................................................................................................36
Hình 14 : Tập giá trị baseline và robust của biến N trong trường hợp hai biến đầu vào
....................................................................................................................................37
Hình 15 : Tập hợp giá trị baseline và rubust trên hai khoảng của biến M trong
trường hợp hai biến đầu vào 38
Hình 16 : Tổng hợp tất cả các giá trị của hai biến N và M trên hai khoảng đầu vào .....38
Hình 17 : Tổng hợp toán bộ giá trị baseline, robust trường hợp đa biến đầu vào trên hai
khoảng.........................................................................................................................39
Hình 18 : Ví dụ cấu trúc một chương trình đơn giản ....................................................41
Hình 19 : Các công việc cần thực hiện (tô đậm)..........................................................42
Hình 20 : Test case 1 kiểm tra công việc A..................................................................42
Hình 21 : Test case 2 kiểm tra công việc B ..................................................................42
Hình 22 : Test case 3 kiểm tra công việc C ..................................................................43
Hình 23 : Hai điều kiện một và hai là độc lập nhau......................................................43
Hình 24 : Kiểm tra đồng thời công việc A và công việc C trong cùng 1 test case.........44
Test case 2 kiểm tra công việc B và công việc C: ........................................................44
Hình 25 : Test case kiểm tra đồng thời công việc B và C.............................................44
Hình 26 : Nhánh không được bao phủ .........................................................................45
Hình 27. Biểu đồ trình tự.............................................................................................47
Hình 28: Biều đồ trình tự khi tương tác câu lệnh if ......................................................48
Hình 29: Biều đồ trình tự khi tương tác câu lệnh while................................................48
Hình 30: Biểu đồ trình tự khi tương tác câu lệnh for ....................................................49
Hình 31: Kiến trúc lớp cài đặt Get_File_Name ............................................................51
Hình 32: Kiến trúc lớp ReadContentFile......................................................................51
Hình 33: Giao diện yêu cầu nhập tên file cần đọc ........................................................52
Hình 34: Nhập tên file không đúng định dạng *.java ...................................................52
Hình 35: Nhập vào một tên file đúng để đọc................................................................52
Hình 36 : Nội dung của file TestFile.java ....................................................................52
Hình 37: Kết quả tìm kiếm câu lệnh điều khiển ...........................................................53
Hình 38 : Nội dung của file chứa câu lệnh điều khiển được tìm kiếm ..........................53
8
Hình 39 : Kết quả khi người dùng muốn thao tác với câu lệnh if .................................54
Hình 40 : Kết quả khi người dùng muốn thao tác với câu lệnh while ...........................55
Hình 41 : Kết quả khi người dùng muốn thao tác với câu lệnh for ...............................55
9
DANH MỤC CÁC THUẬT NGỮ
Thuật ngữ Khái niệm
Statement coverage Bao phủ câu lệnh
Branch coverage Bao phủ nhánh
Path coverage Bao phủ đường đi
Condition coverage Bao phủ điều kiện
Boundary value analysis(BVA) Phân tích giá trị biên
Single-variable BVA Phân tích giá trị biên đơn biến
Multi-variable BVA Phân tích giá trị biên đa biến
Equivalence partitioning Phân hoạch tương đương
Test case Ca kiểm thử
Valication Xác minh
Verification Thẩm định
Test entropy Kiểm tra độ bất định trong cấu trúc của
hệ thống
Cyclomatic complextity Số đường độc lập tuyến tính đi qua mã
nguồn
Baseline đường cơ sở
Robust mạnh mẽ
Module Mô đun
10
CHƯƠNG 1. MỞ ĐẦU
1.1 Bối cảnh nghiên cứu
Trong thời đại công nghệ thông tin bùng nổ như ngày nay, phần mềm đóng vai
trò vô cùng quan trọng ở hầu hết các lĩnh vực của cuộc sống. Đặc biệt trong khối ngành
doanh nghiệp, dịch vụ, quảng cáo, nó đã trợ giúp đắc lực nhằm làm tăng chất lượng
nghiệp vụ. Mỗi bộ phận đều phụ thuộc vào phần mềm để hỗ trợ cho việc phát triển, sản
xuất, quảng cáo nhằm tiếp thị các sản phầm và dịch vụ của họ.
Phần mềm cũng được xem là một sản phẩm, nhưng là loại hình sản xuất đặc biệt.
Trong một quy trình sản xuất phần mềm, giai đoạn phát hiện, xác định và sửa các lỗi
phần mềm được xem là phần không thể thiếu nhằm đảm bảo chất lượng phần mềm.
Đảm bảo chất lượng phần mềm là một nhiệm vụ đặc biệt quan trọng trong phát triển
phầm mềm và là vấn đề sống còn đối với tất cả các công ty phần mềm. Ở mức cao, việc
đảm bảo chất lượng liên quan đến một loạt các vấn đề như chuẩn và qui trình quản lý
của công ty, môi trường và công cụ phát triển, mô hình phát triển phần mềm được lựa
chọn, kỹ năng của nhân viên…Ở mức thấp hơn, chất lượng phần mềm được đảm bảo
trên cơ sở hiểu đúng yêu cầu của khách hàng, đặc tả đúng yêu cầu, tạo ra các thiết kết
tốt và chuyển tải nó một cách đúng đắn thành mã nguồn của phần mềm. Chi phí bỏ ra
cho giai đoạn này thường chiếm không nhỏ trong tổng chi phí mà các tổ chức phát triển
phần mềm bỏ ra cho toàn bộ qui trình. Với tốc độ phát triển chóng mặt của lĩnh vực
công nghệ thông tin trên cả hệ thống phần cứng và phần mềm, khả năng xảy ra nhiều
lỗi, đặc biệt là những lỗi phức tạp là rất cao. Lỗi có thể gây thiệt hại to lớn cả về tiền
bạc, thời gian và công sức con người. Chính vì vậy, cần có phương pháp phát hiện ra lỗi
sớm nhằm giảm công sức để sửa chúng. Để phát hiện ra những lỗi phần mềm, phần
mềm cần phải được thẩm định (Valication) và kiểm chứng (Verification). Xác minh,
thẩm định giúp ta phát hiện và sửa lỗi phần mềm từ đó đánh tính dùng được của phần
mềm.
Con người không thể không mắc sai lầm, và phần mềm mà không được kiểm tra
sẽ làm việc không hiểu quả. Thông thường, có từ 20 đến 50 lỗi trên 1000 dòng lệnh
được tìm thấy trong suốt quá trình phát triển, và vẫn còn từ 1.5 đến 4 lỗi trên 1000 dòng
lệnh sau khi kiểm thử hệ thống [1]. Mỗi lỗi này đều có thể dẫn tới lỗi tổng thể hay
không đúng với đặc tả yêu cầu. Mục đích của kiểm thử phần mềm là làm giảm lỗi phần
mềm xuống mức có thể chấp nhận được, tuỳ thuộc vào mức độ phức tạp của dự án.
Chính vì vậy, kiểm thử phần mềm có vai trò vô cùng quan trọng trong toàn bộ quy trình
11
phát triền phần mềm, và trong công nghiệp phần mềm hiện nay, nó đang thu hút sự
quan tâm của nhiều nhà nghiên cứu.
Trong quy trình phát triển phần mềm hiện đại có giai đoạn kiểm thử phần mềm
dùng để kiểm tra tính đúng đắn của phần mềm. Mục tiêu chính của nhóm phát triển
phần mềm là phải làm sao tạo ra được những sản phầm phần mềm có chất lượng tốt
nhất.Việc viết tập hợp các ca kiểm thử (test cases) là một phần quan trọng không thể
thiếu trong phương pháp phát triển phần mềm linh hoạt. Tập hợp các ca kiểm thử đúng
đắn giúp chúng ta giảm thiểu tối đa các lỗi, giảm thời gian tìm kiếm lỗi, tạo ra được các
phần mềm tốt, tính ổn định cao. Một cách lý tưởng thì người kiểm tra (tester) phải kiểm
tra tất cả các giá trị của biến đầu vào, tuy nhiên điều này là không tưởng bởi vì thường
thì miền giá trị của biến đầu vào là rất lớn, thậm chí gần như dài vô hạn hoặc vô hạn.
Do đó người kiểm tra không thể kỉêm tra được tất cả mọi giá trị, mọi trường hợp mà chỉ
kiểm tra một số trường hợp đại diện mà thôi. Như vậy luôn xuất hiện câu hỏi: xây dựng
những ca kiểm thử nào là hợp lý ? Bao giờ có thể ngưng kiểm tra? Các ca kiểm thử tạo
ra liệu có tốt hay không? Giá trị được chọn để xây dựng ca kiểm thử là những giá trị
nào?... Để nhằm giải đáp các thắc mắc này và xây dựng lên các ca kiểm thử tốt, trong
tài liệu này chúng tôi sẽ phân tích một số đề xuất được đưa ra nhằm đánh giá chất lượng
của một ca kiểm thử: phân tích bao phủ code (code coverage analysis), kiểm tra các
điểm đặc biệt (particular point) cụ thể là phân tích đánh giá giá trị tại vị trí biên.
1.2 Nội dung bài toán
Kiểm thử là giai đoạn vô cùng quan trọng trong quá trình phát triển phần mềm.
Trong giai đoạn này thì công việc thiết kế các ca kiểm thử lại đóng vai trò cực kỳ quan
trọng. Nhằm giúp xây dựng các ca kiểm thử tốt, chiến lược kiểm thử tối ưu, trong tài
liệu này sẽ đề cập đến kỹ thuật phân tích code bao phủ và phân tích các giá trị biên. Kỹ
thuật phân tích bao phủ sẽ đánh giá độ bao phủ từ đó xác định quá trình kiểm tra có đạt
được độ bao phủ yêu cầu hay không, tỷ lệ yêu cầu đã được kiểm tra (tính trên các yêu
cầu của phần mềm và số lượng code đã viết). Trong phạm vi tài liệu sẽ phân tích các
cách bao phủ cơ bản nhưng chúng vô cùng mạnh mẽ. Thông thường, không thể kiểm
thử với mọi dữ liệu, chiến lược chung khi thiết kế ca kiểm thử là phân hoạch tương
đương (equivalence partitioning). Phân hoạch tương đương chia miền dữ liệu vào ra
thành các vùng, mà mỗi vùng chứa các dữ liệu có cùng hành vi. Do đó, đối với mỗi
vùng dữ liệu chỉ cần xây dựng một ca kiểm thử để đại diện. Theo kinh nghiệm, các sai
sót về lập trình thường xảy ra đối với dữ liệu biên nên cần thêm vào đó các ca kiểm thử
kiểm tra đối với biên của các vùng. Trong tài liệu này cũng sẽ tiến hành phân tích đánh
12
giá các giá trị biên sử dụng trong các ca kiểm thử. Đưa ra các giá trị biên đề xuất cần
phải được kiểm tra để đảm bảo phần mềm vẫn hoạt động tốt và ổn định trên các giá trị
đó. Luồng chương trình từ input đến output có các cách đi khác nhau chủ yếu được dựa
vào các câu lệnh điều khiển trong mã nguồn, chúng tôi sẽ tiến hành cài đặt một chương
trình tìm kiếm câu lệnh điều khiển trong file mã nguồn java và xuất ra giá trị biên trong
câu lệnh điều khiển có chứa toán tử so sánh. Tóm lại bài toán đưa ra ở đây là làm sao
xây dựng được ca kiểm thử tốt, các lỗi lập trình thường xảy ra ở các điểm biên của dải
giá trị đầu vào, vậy thì ca kiểm thử thiết kế để kiểm tra giá trị biên là gì? Giải quyết bài
toán này chúng tôi sẽ phân tích kỹ thuật bao phủ code và kỹ thuật phân tích giá trị biên,
sau cùng là cài đặt chương trình tìm kiế