ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
–––––––––––––––––––––––––
NGUYỄN THỊ HỒNG THUỶ
KỸ THUẬT MA TRẬN ĐỒ THỊ TRONG PHƯƠNG PHÁP
KIỂM THỬ HỘP TRẮNG
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Thái nguyên – 2020
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
–––––––––––––––––––––––––
NGUYỄN THỊ HỒNG THUỶ
KỸ THUẬT MA TRẬN ĐỒ THỊ
TRONG PHƯƠNG PHÁP KIỂM THỬ HỘP TRẮNG
Chuyên ngành: Khoa học máy tính
Mã số : 848 01 01
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Người hướng dẫn khoa học: TS. Lê Văn Phùng
Thái nguyên – 2020
i
LỜI CAM ĐOAN
Tôi xin cam đoan toàn bộ nội dung luận văn này là do tôi tự sưu
tầm, tra cứu thông tin trên mạng Internet, trong một số sách tham khảo
để sắp xếp, hoàn thiện cho phù hợp với nội dung yêu cầu của đề tài.
Đến nay, nội dung luận văn của tôi chưa từng được công bố hay xuất
bản dưới bất kỳ hình thức nào. Nếu sai tôi xin chịu hoàn toàn trách nhiệm.
Ngày ... tháng ... năm 2020
Tác giả
Nguyễn Thị Hồng Thuỷ
ii
LỜI CẢM ƠN
Trong suốt quá trình học tập và thực hiện đề tài, em đã nhận được
sự giúp đỡ tận tình và những chỉ bảo ân cần của các Thầy cô trong viện
Công nghệ thông tin – Viện khoa học và công nghệ Việt nam, các Thầy
cô trong trường đại học Công nghệ Thông tin và Truyền thông, cùng các
bạn bè đồng nghiệp. Đặc biệt là sự giúp đỡ của TS Lê Văn Phùng,
người thầy trực tiếp hướng dẫn, định hướng, chỉnh sửa các kiến thức
chuyên môn và tận tình giúp đỡ em trong suốt quá trình nghiên cứu và
thực hiện luận văn.
Qua đây cho phép em được bày tỏ lời cảm ơn tới tất cả các thầy cô
giáo ở Viện Công nghệ thông tin và Trường Đại học Công nghệ Thông
tin và Truyền thông, đã giảng dạy và tạo mọi điều kiện thuận lợi giúp đỡ
chúng em trong quá trình học tập, nghiên cứu.
Cuối cùng, tôi xin cảm ơn đến gia đình, các bạn bè đồng nghiệp đã
chia sẻ động viên giúp đỡ tôi về chuyên môn cũng như về mọi mặt trong
cuộc sống, đó là nguồn động viên khích lệ giúp tôi có nghị lực hơn để
hoàn thành khoá học.
Học viên
Nguyễn Thị Hồng Thuỷ
iii
MỤC LỤC
Trang
LỜI CAM ĐOAN .................................................................................... i
LỜI CẢM ƠN ......................................................................................... ii
MỤC LỤC .............................................................................................. iii
DANH MỤC CÁC KÝ HIỆU/VIẾT TẮT ............................................ vi
DANH MỤC CÁC HÌNH ..................................................................... vii
DANH MỤC CÁC BẢNG................................................................... viii
PHẦN MỞ ĐẦU ..................................................................................... 1
1. Lý do chọn đề tài ................................................................................. 1
2. Đối tượng và phạm vi nghiên cứu ....................................................... 1
3. Mục tiêu và nhiệm vụ nghiên cứu ....................................................... 2
4. Phương pháp nghiên cứu ..................................................................... 2
5. Ý nghĩa khoa học của đề tài ................................................................ 2
6. Bố cục của luận văn: ........................................................................... 2
CHƯƠNG 1 TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ KIỂM
THỬ HỘP TRẮNG .................................................................................. 3
1.1. Kiểm thử phần mềm ......................................................................... 3
1.1.1. Quan niệm về kiểm thử phần mềm ............................................. 3
1.1.2. Chiến lược kiểm thử phần mềm .................................................. 3
1.1.3. Các mức kiểm thử [9].................................................................. 4
1.1.4. Sơ lược về các phương pháp kiểm thử ........................................ 5
iv
1.2.1. Ý tưởng của kiểm thử hộp trắng ................................................. 6
1.2.2. Mô tả một số cấu trúc theo lược đồ ............................................. 7
1.2.3. Một số hướng chính về kiểm thử hộp trắng ................................ 8
CHƯƠNG 2 MỘT SỐ KỸ THUẬT HIỆU QUẢ TRONG
PHƯƠNG PHÁP KIỂM THỬ HỘP TRẮNG VÀ CA KIỂM THỬ16
2.1. Một số kỹ thuật chính trong phương pháp kiểm thử hộp trắng ..... 16
Có thể tổng hợp một số kỹ thuật hiệu quả trong phương pháp kiểm thử
hộp trắng như sau: ................................................................................. 16
2.1.1. Kỹ thuật kiểm thử dòng điều khiển ............................................. 16
2.1.2. Kỹ thuật kiểm thử dòng dữ liệu .................................................. 18
2.1.3. Kỹ thuật kiểm thử BRO .............................................................. 19
2.1.4. Kỹ thuật kiểm thử đột biến.......................................................... 20
2.2. Ca kiểm thử .................................................................................... 22
2.2.1.Một số quan niệm về ca kiểm thử ................................................ 22
2.2.2.Nội dung thiết kế ca kiểm thử ...................................................... 22
2.2.3. Một số phương pháp chính để thiết kế ca kiểm thử .................... 23
2.3. Kỹ thuật ma trận đồ thị cho thiết kế ca kiểm thử ........................... 27
2.3.1. Ý tưởng và nội dung kỹ thuật ma trận đồ thị [8] ........................ 27
2.3.2. Quy trình kiểm thử phần mềm bằng kỹ thuật ma trận đồ thị ...... 36
CHƯƠNG 3 CHƯƠNG TRÌNH THỬ NGHIỆM KIỂM THỬ
PHẦN MỀM BẰNG KỸ THUẬT MA TRẬN ĐỒ THỊ .................. 38
3.1. Chọn mô-đun phần mềm thử nghiệm ............................................ 38
3.2. Thiết kế ca kiểm thử và kiểm thử mô-đun phần mềm .................. 39
v
3.2.1. Quy trình thiết kế ........................................................................ 39
3.2.2. Nội dung thiết kế ......................................................................... 39
3.3 Một số giao diện chính của chương trình ........................................ 49
3.3.1. Giao diện thiết kế ca kiểm thử theo kỹ thuật ma trận đồ thị ....... 49
3.3.2. Quá trình test với Mô-đun 1 ........................................................ 54
3.3.3. Quá trình test với Mô-đun 2 ........................................................ 57
3.3.4. Quá trình test với Mô-đun 3 ........................................................ 60
3.3.5. Quá trình test với Mô-đun 4 ........................................................ 62
3.3.6. Kiểm thử vòng lặp While ............................................................ 63
3.4. Đánh giá và so sánh kỹ thuật ma trận đồ thị với một số kỹ thuật thiết
kế ca kiểm thử khác ............................................................................... 64
3.5. Đánh giá kết quả thử nghiệm và hướng mở rộng .......................... 66
KẾT LUẬN VÀ KIẾN NGHỊ............................................................... 67
1.Kết luận .............................................................................................. 67
2. Kiến nghị ........................................................................................... 68
TÀI LIỆU THAM KHẢO ..................................................................... 69
iv iv vi
DANH MỤC CÁC KÝ HIỆU/VIẾT TẮT
BRO: Kiểm thử nhánh và toán tử quan hệ
CNTT: Công nghệ thông tin
CSDL: Cơ sở dữ liệu
E: Số cạnh của đồ thị
N: Số đỉnh của đồ thị
P: Số đỉnh điều kiện có trong đồ thị
V(G): Độ phức tạp của chu trình
v vii
DANH MỤC CÁC HÌNH
Hình 1.1. Mô hình chiến lược kiểm thử tổng thể ...................................... 5 Hình 1.2. Một số cấu trúc lập trình ........................................................... 8 Hình 1.3. Sơ đồ điều khiển chương trình .................................................. 9 Hình 1.4. Đồ thị của chương trình .......................................................... 10 Hình 1.5. Minh hoạ về độ phức tạp của câu lệnh.................................... 10 Hình 1.6. Minh hoạ về các bước kiểm tra ............................................... 11 Hình1.7. Lược đồ kiểm thử theo đường dẫn ........................................... 12 Hình1.8. Lược đồ kiểm thử đường dẫn theo biểu thức điều kiện ........... 13 Hình 1.9.Các kiểu vòng lặp ..................................................................... 14 Hình 2.1: Các thành phần cơ bản của đồ thị chương trình. .................... 17 Hình 2.2: Các cấu trúc điều khiển phổ biến của chương trình................ 17 Hình 2.3: Mã nguồn của hàm foo và đồ thị dòng điều khiển của nó. ..... 18 Hình 2.4: Sơ đồ điều khiển của chương trình ......................................... 30 Hình 2.5: Sơ đồ luồng điều khiển .......................................................... 30 Hình 2.6 : Đồ thị dòng dùng để xác định ma trận kiểm thử ................... 31 Hình 2.7: Độ phức tạp chu trình được xác định từ số miền phẳng trong đồ thị dòng ............................................................................................... 32 Hình 2.8 : Đồ thị dòng dùng để xác định ma trận kiểm thử ................... 33 Hình 3.1. Sơ đồ điều khiển của chương trình ......................................... 40 Hình 3.2. Sơ đồ luồng điều khiển ........................................................... 41 Hình 3.3. Đồ thị dòng .............................................................................. 42 Hình 3.4. Độ phức tạp của chu trình ....................................................... 43 Hình 3.5. Đồ thị dòng .............................................................................. 44 Hình 3.6 Giao diện trang chủ .................................................................. 49 Hình 3.7 Giao diện hướng dẫn sử dụng của chương trình ...................... 50 Hình 3.8 Giao diện chính chạy chương trình .......................................... 50 Hình 3.9: Hộp thoại Open để tìm đường dẫn .......................................... 51 Hình 3.10: Form hiển thị mô-đun cần kiểm thử ..................................... 51 Hình 3.11. Giao diện xác định tập đường cơ bản ................................... 52 Hình 3.12: Giao diện thông báo lỗi khi nhập dữ liệu không hợp lệ ....... 53 Hình 3.13: Giao diện test đơn vị chương trình code_1 ........................... 53 Hình 3.14: Form xử lý với đơn vị chương trình code_2 ......................... 59 Hình 3.15: Lỗi tìm thấy trong mô-đun code_2 ....................................... 60 Hình 3.16: Form kiểm thử ứng với code_3 ............................................. 61 Hình 3.17: Form kiểm thử ứng với code_4 ............................................. 63
viii vi
DANH MỤC CÁC BẢNG
Bảng 2.1. Ví dụ minh họa các đột biến ................................................... 21
Bảng 2.2 : Những chiến lược kết hợp ..................................................... 23
Bảng 2.3. Tập đường cơ bản ................................................................... 32
Bảng 2.4 : Ma trận kiểm thử A và cách tính độ phức tạp V(G) .............. 34
Bảng 2.5 Bảng ma trận kiểm thử A= (aij) với i,j=1,2,3,4,...,9 được xác
định như sau: ........................................................................................... 34
Bảng 2.6 : Ví dụ ma trận kiểm thử tích A2= ........................................... 36
Bảng 3.1-Bảng tính độ phức tạp của đồ thị dòng V(G): ......................... 45
Bảng 3.2: Bảng ma trận kiểm thử A= (aij) với i,j=1,2,3,4,...,14............. 45
Bảng 3.3: Các Test path .......................................................................... 48
Bảng 3.4: Bảng các ca kiểm thử vòng lặp while .................................... 49
Bảng 3.5: Bảng TestData1 ...................................................................... 55
Bảng 3.6: Bảng TestData2 ...................................................................... 55
Bảng 3.7: Bảng TestData3 ...................................................................... 55
Bảng 3.8: Bảng TestData4 ...................................................................... 56
Bảng 3.9: Bảng TestData5 ...................................................................... 56
Bảng 3.10: Bảng TestData6 .................................................................... 56
Bảng 3.11: Bảng TestData7 .................................................................... 57
Bảng 3.12: Bảng TestData với code_2 ................................................... 58
Bảng 3.13: Kết quả bảng TestData với code_2 ...................................... 59
Bảng 3.14: Bảng TestData với code_3 ................................................... 61
Bảng 3.15: Bảng TestData với code_4 ................................................... 62
1
PHẦN MỞ ĐẦU
1. Lý do chọn đề tài
Quy trình phát triển phần mềm thường trải qua nhiều giai đoạn, trong
đó kiểm thử phần mềm là một trong các hoạt động chủ chốt nhằm phát hiện
lỗi và đảm bảo chất lượng phần mềm. Trước khi sản phẩm được phát hành, tất
cả các chức năng cũng như giao diện, ứng dụng của sản phẩm đó đều cần qua
kiểm thử. Kiểm thử hiệu quả sẽ phát hiện ra được các sai sót, tránh các lỗi
trước khi phát hành sản phẩm.
Để kiểm thử đạt hiệu quả cao, người kiểm thử cần vạch ra chiến lược
kiểm thử, đó là sự tích hợp các kỹ thuật thiết kế ca kiểm thử. Một trong các kỹ
thuật đó, không thể không nhắc đến đó là kỹ thuật ma trận đồ thị. Kỹ thuật ma
trận đồ thị là một trong những kỹ thuật của phương pháp kiểm thử hộp trắng.
Ma trận kiểm thử được sử dụng như một dữ liệu có cấu trúc để kiểm tra các
con đường cơ bản. Ma trận kiểm thử là một công cụ mạnh trong việc đánh giá
cấu trúc điều khiển chương trình.
Qua luận văn này, tôi mong muốn mọi người có những kiến thức cơ
bản về kiểm thử phần mềm nói chung, kiểm thử hộp trắng nói riêng. Đặc biệt,
tôi mong có thể đóng góp vào việc xây dựng quy trình thiết kế ca kiểm thử
bằng kỹ thuật ma trận đồ thị.
Trên đây là những lí do mà tôi chọn đề tài: “Kỹ thuật ma trận đồ thị
trong phương pháp kiểm thử hộp trắng” làm luận văn thạc sĩ của mình.
2. Đối tượng và phạm vi nghiên cứu
- Kiểm thử phần mềm nói chung và kiểm thử hộp trắng nói riêng.
- Một số kỹ thuật chính về thiết kế ca kiểm thử
- Kỹ thuật ma trận đồ thị để thiết kế ca kiểm thử
- Xây dựng phần mềm thử nghiệm kiểm thử bằng kỹ thuật ma trận đồ thị
2
- Áp dụng kỹ thuật ma trận đồ thị để kiểm thử phần mềm và so sánh với một
số kỹ thuật thiết kế ca kiểm thử khác.
3. Mục tiêu và nhiệm vụ nghiên cứu
- Luận văn tập trung nghiên cứu, tìm hiểu về kiểm thử phần mềm, phương
pháp kiểm thử hộp trắng, ca kiểm thử, đặc biệt là kiểm thử phần mềm bằng
kỹ thuật ma trận đồ thị
- Thiết kế chương trình kiểm thử để kiểm thử một số đơn vị chương trình.
4. Phương pháp nghiên cứu
- Phương pháp nghiên cứu lý thuyết: Sưu tập tài liệu, tổng hợp các phương
pháp kiểm thử phầm mềm, tập trung vào phương pháp kiểm thử hộp trắng,
nghiên cứu chi tiết quy trình thực hiện kỹ thuật ma trận đồ thị.
- Phương pháp nghiên cứu thực nghiệm: Cài đặt thử nghiệm chương trình
kiểm thử phần mềm bằng kỹ thuật ma trận đồ thị
- Phương pháp trao đổi khoa học: Trao đổi nội dung nghiên cứu với người
hướng dẫn, các đồng nghiệp để đề xuất và giải quyết các nội dung luận văn đề
ra.
5. Ý nghĩa khoa học của đề tài
Kết quả thử nghiệm của đề tài một mặt thể hiện tính đúng về mặt lý
thuyết, một mặt vừa mang tính minh hoạ vừa thể hiện khả năng ứng dụng
hiệu quả.
6. Bố cục của luận văn:
Toàn bộ nội dung của luận văn được chia thành ba chương như sau:
Chương 1: Tổng quan về kiểm thử phần mềm và kiểm thử hộp trắng
Chương 2: Một số kỹ thuật hiệu quả trong phương pháp kiểm thử hộp
trắng và ca kiểm thử
Chương 3: Chương trình thử nghiệm kiểm thử phần mềm bằng kỹ thuật
ma trận đồ thị.
3
CHƯƠNG 1
TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ KIỂM THỬ HỘP TRẮNG
1.1. Kiểm thử phần mềm
1.1.1. Quan niệm về kiểm thử phần mềm
Kiểm thử phần mềm (Software Testing) là một yếu tố quan trọng trong vấn
đề xác minh và thẩm định. Việc kiểm thử cung cấp một thành luỹ cuối cùng để
có thể thẩm định về mặt chất lượng, chứng thực hơn, phát hiện ra lỗi [7].
Theo Glen Myers, 1979, kiểm thử phần mềm là quá trình vận hành
chương trình để tìm ra lỗi. Một ca kiểm thử tốt là ca kiểm thử có xác suất cao
tìm ra một lỗi chưa được phát hiện. Một ca kiểm thử thắng lợi là ca kiểm thử
làm lộ ra được ít nhất một lỗi còn chưa phát hiện. Với cách nhìn này, mục tiêu
của chúng ta là thiết kế các ca kiểm thử để có thể phát hiện một cách hệ thống
các loại lỗi khác nhau với chi phí thời gian và công sức ít nhất có thể.
Phát hiện lỗi là công việc của kiểm thử. Nhưng kiểm thử phần mềm
không phải là gỡ lỗi.
Kiểm thử phần mềm là một trong những yếu tố góp phần bảo đảm chất
lượng phần mềm, là khâu điển hình kiểm soát đặc tả, thiết kế, lập mã.
Kiểm thử phần mềm là quá trình thực thi một chương trình với mục đích
tìm ra lỗi, đảm bảo sản phẩm phần mềm đáp ứng chính xác, đầy đủ và đúng
theo yêu cầu của khách hàng. Kiểm thử phần mềm cũng cung cấp mục tiêu,
cái nhìn độc lập về phần mềm, điều này cho phép việc đánh giá và hiểu rõ các
rủi ro khi thực thi phần mềm. Kiểm thử phần mềm tạo điều kiện tận dụng tối
đa tư duy đánh giá và sáng tạo để có thể phát hiện ra những điểm mà người
khác chưa nhìn thấy.
1.1.2. Chiến lược kiểm thử phần mềm
Chiến lược kiểm thử là sự tích hợp các kỹ thuật thiết kế “ca kiểm thử”
tạo thành một dãy các bước nhằm hướng dẫn quá trình kiểm thử phần mềm
thành công [9].
4
Ca kiểm thử (test case) là một tình huống kiểm thử tương ứng với một
mạch hoạt động của chương trình. Nó bao gồm một tập các giá trị đầu vào và
một danh sách các kết quả đầu ra mong muốn và thực tế.
Chiến lược kiểm thử được đặt ra với các mục tiêu nhằm phác thảo lộ
trình để:
- Nhà phát triển tổ chức việc bảo đảm chất lượng bằng kiểm thử;
- Khách hàng hiểu được công sức, thời gian và nguồn lực cần cho kiểm
thử
Chiến lược kiểm thử cần đạt các yêu cầu sau:
- Tích hợp các khâu như lập kế hoạch, thiết kế ca kiểm thử, tiến hành
kiểm thử, thu thập và đánh giá các thông tin kết quả;
- Đủ mềm dẻo để cổ vũ óc sáng tạo, đáp ứng được yêu cầu khách hàng;
- Thích ứng với mức kiểm thử cụ thể;
- Đáp ứng các đối tượng quan tâm khác;
1.1.3. Các mức kiểm thử [9]
Trong tiến trình kiểm thử, người ta chia ra thành nhiều mức kiểm thử. Về
phương diện thực hành người ta thường chia thành 4 mức cơ bản:
Mức 1. Kiểm thử đơn vị (Unit testing);
Mức 2. Kiểm thử tích hợp (Integration testing);
Mức 3. Kiểm thử hệ thống (System testing), bao gồm:
- Kiểm thử chức năng (functional test: system and interface)
- Kiểm thử phục hồi (recovery test)
- Kiểm thử chịu tải (extra: stress and load test)
- Kiểm thử thi hành (performance test)
- Kiểm thử an ninh (security test)
Mức 4. Kiểm thử chấp nhận (acceptance testing)/thẩm định
Có 2 tiến trình thực hiện kiểm thử:
5
Tiến trình 1. Tiến trình thực hiện kiểm thử tương ứng với tiến trình phát
triển (theo từng mô hình).
Tiến trình 2. Tiến trình kiểm thử thường theo mô hình chiến lược kiểm
thử tổng thể:
Kiểm thử thẩm định Kiểm thử đơn vị Kiểm thử tích hợp Kiểm thử hệ thống
Hệ thống thực Cả phần cứng, phần mềm Môđun đơn vị Môđun chức năng, hệ con
Hình 1.1. Mô hình chiến lược kiểm thử tổng thể
1.1.4. Sơ lược về các phương pháp kiểm thử
Bất kỳ sản phẩm kỹ nghệ nào đều có thể được kiểm thử theo một trong
hai cách [1,2,5,6,15]:
Cách 1. Kiểm thử chức năng/hộp đen: cho dữ liệu đầu vào đúng/sai,
kiểm tra đầu ra đúng/sai, tức là kiểm thử xem từng chức năng có vận hành
đúng không, không quan tâm đến cấu trúc bên trong của chức năng đó.
Cách 2. Kiểm thử cấu trúc/hộp trắng: không những quan tâm đến mối
quan hệ giữa đầu vào và đầu ra của chức năng đó mà còn quan tâm, đến cấu
trúc bên trong, quan tâm chi tiết đến từng đầu vào, đầu ra của các thành phần
cấu thành trong đó và cả sự ăn khớp giữa chúng nữa, tức là bảo đảm rằng sự
vận hành bên trong thực hiện đúng theo đặc tả và tất cả các thành phần bên
trong đều được quan tâm và được kiểm tra một cách chi tiết.
Đối với phần mềm máy tính, kiểm thử hộp đen biểu thị việc kiểm thử
được tiến hành tại giao diện phần mềm. Mặc dù chúng được thiết kế để phát
hiện ra lỗi, kiểm thử hộp đen được dùng để thể hiện rằng các chức năng phần
mềm đã vận hành, cái vào được chấp nhận đúng, và cái ra được tạo ta đúng,
tính toàn vẹn của thông tin ngoài (như tệp dữ liệu) là được duy trì. Phép kiểm
6
thử hộp đen xem xét một số khía cạnh của hệ thống ít để ý tới cấu trúc logic
bên trong của phần mềm.
1.2. Kiểm thử hộp trắng
1.2.1. Ý tưởng của kiểm thử hộp trắng
Kiểm thử hộp trắng (white-box test) không những quan tâm đến mối
quan hệ giữa đầu vào và đầu ra của chức năng đó mà còn quan tâm đến cấu
trúc bên trong, quan tâm chi tiết đến từng đầu vào đầu ra của các thành phần
cấu thành trong đó và cả sự ăn khớp giữa chúng nữa, tức là bảo đảm rằng sự
vận hành bên trong thực hiện đúng theo đặc tả và tất cả các thành phần bên
trong đều được quan tâm và được kiểm tra một cách chi tiết [9].
Kiểm thử hộp trắng được hướng tới việc xem xét kỹ về chi tiết thủ tục.
Các đường logic đi qua phần mềm được kiểm thử bằng cách đưa ra các
trường hợp kiểm thử, vốn thực hiện trên một tập xác định các điều kiện và
/hoặc chu trình. “Trạng thái của chương trình” có thể được xem xét tại nhiều
điểm khác nhau để xác định liệu trạng thái dự kiến hay khẳng định có tương
ứng với trạng thái thực tại không [9].
Bản chất của khiếm khuyết phần mềm chính là lý do đầu tiên phải kiểm
thử hộp trắng. Hơn nữa, việc kiểm thử hộp đen, dù làm kỹ lưỡng đến đâu vẫn
có thể sót nhiều loại lỗi. Theo Beizer: “Lỗi ẩn nấp trong các ngóc ngách và
tập hợp tại biên giới”. Việc kiểm thử hộp trắng có nhiều khả năng phát hiện ra
chúng hơn,...
Kiểm thử hộp trắng (white box) là việc kiểm tra các đoạn mã chương
trình xem nó có vận hành đúng như thiết kế hay không. Kiểm thử hộp trắng
dựa trên việc xem xét cấu trúc bên trong của chương trình theo cấu trúc điều
khiển và sự hoạt động của chúng. Nó có nhiều tên gọi khác như glass testing,
structure testing, open box testing, clear box testing [Beizer 1995]. Đối tượng
của kiểm thử hộp trắng là các mã nguồn ở các mô-đun đơn vị [7,8].
7
Kiểm thử hộp trắng sử dụng các chiến lược cụ thể và sử dụng mã nguồn
của chương trình/đơn vị phần mềm cần kiểm thử nhằm kiểm tra xem chương
trình/đơn vị phần mềm có thực hiện đúng so với thiết kế và đặc tả hay không.
Trong khi các phương pháp kiểm thử hộp đen chỉ cho phép phát hiện các
lỗi/khiếm khuyết có thể quan sát được, kiểm thử hộp trắng cho phép phát hiện
các lỗi/khiếm khuyết tiềm ẩn bên trong chương trình/đơn vị phần mềm, các
lỗi này thường khó phát hiện bởi các phương pháp kiểm thử hộp đen.
Kiểm thử hộp đen và kiểm thử hộp trắng không thể thay thế cho nhau mà
chúng cần được sử dụng kết hợp với nhau trong một quy trình kiểm thử thống
nhất nhằm đảm bảo chất lượng phần mềm. Tuy nhiên, để áp dụng các phương
pháp kiểm thử hộp trắng, người kiểm thử không chỉ cần hiểu rõ giải thuật mà
còn cần có các kỹ năng và kiến thức tốt về ngôn ngữ lập trình được dùng để
phát triển phần mềm, nhằm hiểu rõ mã nguồn của chương trình/đơn vị phần
mềm cần kiểm thử. Do vậy, việc áp dụng phương pháp kiểm thử hộp trắng
thường tốn thời gian và công sức nhất là khi chương trình/đơn vị phần mềm
có kích thước lớn. Vì lý do này, phương pháp kiểm thử hộp trắng chủ yếu
được sử dụng cho kiểm thử đơn vị.
1.2.2. Mô tả một số cấu trúc theo lược đồ
Trong các phương pháp kiểm tra tính đúng đắn của chương trình, lược
đồ được dùng để:
- Trừu tượng hóa cú pháp của mã lệnh;
- Làm khuôn mẫu cơ bản cho các nguyên tắc kiểm tra theo trường hợp.
- Kiểm tra tính đúng đắn trên toàn bộ lược đồ.
UNTIL
SEQUENCE
IF
WHILE
CASE
8
Hình 1.2. Một số cấu trúc lập trình
1.2.3. Một số hướng chính về kiểm thử hộp trắng
1.2.3.1. Kiểm thử theo câu lệnh (Statement Testing)
Thiết kế quá trình kiểm thử sao cho mỗi câu lệnh của chương trình được
thực hiện ít nhất một lần. Phương pháp kiểm thử này xuất phát từ ý tưởng [1]:
- Trừ phi một câu lệnh được thực hiện, nếu không ta không thể biết được
có lỗi xảy ra trong câu lệnh đó hay không.
- Việc kiểm thử với một giá trị đầu vào không đảm bảo là sẽ đúng cho
mọi trường hợp.
Ví dụ: Đoạn chương trình thực hiện tính:
result = 0+1+...+|valuel|,
nếu result <= maxint, báo lỗi trong trường hợp ngược lại.
1. PROGRAM maxsum ( maxint, value : INT)
2. INT result :=0;i := 0 ;
3. IF value < 0
4. THEN value := - value;
5. WHILE ( i < value ) AND ( result <= maxint)
6. DO BEGIN
7. i:=i+1; result := result + i;
8. END;
9. IF result <= maxint
9
10. THEN OUTPUT ( result )
11. ELSE OUTPUT (“too large”)
1
2
3
4
6,7
5
8
9
11
12. END.
12
10
Hình 1.3. Sơ đồ điều khiển chương trình
10
Yes
Value:=Value
Value<0
No
i:=i+1
result:=result + i
Yes
(i No No Yes result< =maxint output (“too large”); output (result); Start End. Hình 1.4. Đồ thị của chương trình Ví dụ: Với các bộ giá trị đầu vào (input): maxint = 10, value = -1 hay: maxint = 0, value = -1 sẽ kiểm tra được toàn bộ các câu lệnh trong đoạn chương trình trên. A B Để đánh giá phương pháp này ta xem qua ví dụ sau: Hình 1.5. Minh hoạ về độ phức tạp của câu lệnh 11 Với câu hỏi đầu tiên “Lược đồ nào phức tạp hơn”, ta có câu trả lời là B. Với câu hỏi tiếp theo “Lược đồ nào cần các bước kiểm tra nhiều hơn?” Số kiểm tra: 2 Số kiểm tra: 2 Ta cũng trả lời là B. Hình 1.6. Minh hoạ về các bước kiểm tra Tuy nhiên, ta thấy số lần kiểm tra tối thiểu để có thể kiểm tra toàn bộ các câu lệnh như trên cho cả hai hàm đều là 2. Vì vậy, phương pháp này không tương ứng với sự phức tạp của mã lệnh. 1.2.3.2. Kiểm thử theo đường dẫn (Path Testing) Kiểm thử theo đường dẫn là phương pháp kiểm thử bao trùm mọi đường dẫn của chương trình và cần kết hợp với lược đồ tiến trình. 12 A>B S1;S2; S3; Hình dưới đây giải thích đường dẫn của chương trình [1] A < B True False S1; S2; S3; If (A>B)
S1;
S2;
else
S3; A < B True False C < D While (A
False True S2; S1; S3; If (A
Hình1.7. Lược đồ kiểm thử theo đường dẫn Nhận xét: Phương pháp kiểm thử theo đường dẫn phụ thuộc nhiều vào các biểu thức điều kiện (Xem hình 1.8). Tuy nhiên, có những trường hợp số lượng đường dẫn quá lớn (trường hợp vòng lặp). Vì vậy chương trình này thường không phải là lựa chọn thực tế để tiến hành việc kiểm tra tính đúng đắn của chương trình. 13 Có khoảng 520= 95.367.431.640.625 đường dẫn Loop < 20 Hình1.8. Lược đồ kiểm thử đường dẫn theo biểu thức điều kiện 1.2.3.3. Kiểm thử theo điều kiện (Condition Testing) Kiểm thử theo điều kiện là phương pháp kiểm thử các biểu thức điều kiện trên hai giá trị true và false [1]. Ta xét các ví dụ sau: if (x > 0 &&y>0) x= 1; else x=2; Các bộ kiểm tra { (x>0, y>0), (x <=0, y>0) } sẽ kiểm thử toàn bộ các điều kiện. Tuy nhiên, không thỏa mãn với mọi giá trị đầu vào, cần kết hợp cả x và y để thực hiện bước kiểm thử. 14 1.2.3.4 Kiểm thử theo vòng lặp (Loop Testing) Kiểm thử theo vòng lặp là phương pháp tập trung vào tính hợp lệ của các cấu trúc vòng lặp. Các loại vòng lặp được thể hiện như sau [1,8]: Hình 1.9.Các kiểu vòng lặp - Các bước cần kiểm thử cho vòng lặp đơn + Bỏ qua vòng lặp. + Lặp một lần. + Lặp hai lần. + Lặp m lần (men). + Lặp (n-1), n, (n+1) lần. Trong đó n là số lần lặp tối đa của vòng lặp. - Các bước cần kiểm thử cho vòng lặp dạng lồng nhau + Khởi đầu với vòng lặp nằm bên trong nhất. Thiết lập các tham số lặp cho các vòng lặp bên ngoài về giá trị nhỏ nhất. + Kiểm tra với tham số min+1, một giá trị tiêu biểu, max-1 và max cho vòng lặp bên trong nhất trong khi các tham số lặp của các vòng lặp bên ngoài là nhỏ nhất. 15 + Tiếp tục tương tự với các vòng lặp liền ngoài tiếp theo cho đến khi tất cả vòng lặp bên ngoài được kiểm tra. - Các bước cần kiểm thử cho vòng lặp nối tiếp + Nếu các vòng lặp là độc lập với nhau thì kiểm tra như trường hợp các vòng lặp dạng đơn, nếu không thì kiểm thử như trường hợp các vòng lặp lồng nhau. Ví dụ: // LOOP TESTING EXAMPLE PROGRAM import java.io.*; class LoopTestExampleApp { // ---------------------------- FIELDS ------------------------ public static BufferedReader keyboardinput = new BufferedReader(new InputStreamReader(System.in)); private static final int MINIMUM = 1; private static final int MAXIMUM = 10; I I --------------------------- METHODS ----------------------- /* Main method */ public static void main(String[] args) throws lOException { System.out.println("Input an integer value:”); int input = new Integer(keyboardInput.readLine()).intValue(); int numberOflterations = 0; 16 CHƯƠNG 2 MỘT SỐ KỸ THUẬT HIỆU QUẢ TRONG PHƯƠNG PHÁP KIỂM THỬ HỘP TRẮNG VÀ CA KIỂM THỬ 2.1. Một số kỹ thuật chính trong phương pháp kiểm thử hộp trắng Có thể tổng hợp một số kỹ thuật hiệu quả trong phương pháp kiểm thử hộp trắng như sau: 2.1.1. Kỹ thuật kiểm thử dòng điều khiển Kỹ thuật kiểm thử dòng điều khiển dựa trên khái niệm đồ thị dòng điều khiển (control flow graph). Đồ thị này được xây dựng từ mã nguồn của chương trình/đơn vị chương trình. Đồ thị dòng điều khiển là một đồ thị có hướng gồm các đỉnh tương ứng với các câu lệnh/nhóm câu lệnh và các cạnh là các dòng điều khiển giữa các câu lệnh/nhóm câu lệnh. Nếu i và j là các đỉnh của đồ thị dòng điều khiển thì tồn tại một cạnh từ i đến j nếu lệnh tương ứng với j có thể được thực hiện ngay sau lệnh tương ứng với i. Xây dựng một đồ thị dòng điều khiển từ một chương trình/đơn vị chương trình khá đơn giản. Hình 2.1 mô tả các thành phần cơ bản của đồ thị dòng điều khiển bao gồm điểm bắt đầu của đơn vị chương trình, khối xử lý chứa các câu lệnh khai báo hoặc tính toán, điểm quyết định ứng với các câu lệnh điều kiện trong các khối lệnh rẽ nhánh hoặc lặp, điểm nối ứng với các câu lệnh ngay sau các lệnh rẽ nhánh, và điểm kết thúc ứng với điểm kết thúc của đơn vị chương trình. Các cấu trúc điều khiển phổ biến của chương trình được mô tả trong Hình 2.2. Chúng ta sẽ sử dụng các thành phần cơ bản và các cấu trúc phổ biến này để dễ dàng xây dựng đồ thị dòng điều khiển cho mọi đơn vị chương trình viết bằng mọi ngôn ngữ lập trình. 17 Điểm xuất phát Khối xử lý Hình 2.1: Các thành phần cơ bản của đồ thị chương trình. Hình 2.2: Các cấu trúc điều khiển phổ biến của chương trình. Chúng ta thử xem cách dựng đồ thị dòng điều khiển cho đơn vị chương trình có mã nguồn bằng ngôn ngữ C như Hình 2.3. Chúng ta đánh số các dòng lệnh của đơn vị chương trình và lấy số này làm đỉnh của đồ thị. Điểm xuất phát của đơn vị chương trình ứng với câu lệnh khai báo hàm foo. Đỉnh 1 ứng với câu lệnh khai báo biến e. Các đỉnh 2 và 3 ứng với câu lệnh if. Đỉnh 4 ứng với câu lệnh khai báo biến x trong khi các đỉnh 5 và 6 ứng với câu lệnh if. Đỉnh 7,8 đại diện cho hai câu lệnh 7 và 8. Trong trường hợp này, chúng ta không tách riêng thành hai đỉnh vì đây là hai câu lệnh tuần tự nên chúng ta ghép chúng thành một đỉnh nhằm tối thiểu số đỉnh của đồ thị dòng điều khiển. 18 Hình 2.3: Mã nguồn của hàm foo và đồ thị dòng điều khiển của nó. 2.1.2. Kỹ thuật kiểm thử dòng dữ liệu Đồ thị dòng dữ liệu là một sự mở rộng của đồ thị dòng điều khiển bằng cách bổ sung thêm xử lý dữ liệu trong chương trình. Việc xử lý dữ liệu trong chương trình được thực hiện thông qua sự định nghĩa và sử dụng các biến. Định nghĩa, được kí hiệu là def, là vị trí mà giá trị của biến được lưu trữ trong bộ nhớ. Sử dụng, được kí hiệu là use, là vị trí mà biến được truy cập. Lộ trình định nghĩa - sử dụng, được kí hiệu du-path. Tiêu chí bao phủ cho đồ thị luồng dữ liệu sẽ được định nghĩa dựa trên khái niệm du-path. Chúng ta chia du-path thành 2 nhóm [1,3,8,10,11]: - du-path liên quan đến định nghĩa biến, gồm các du-path với 1 biến được định nghĩa tại 1 đỉnh. du(ni,v) là tập các du-path đối với biến v xuất phát từ đỉnh ni. - du-path liên quan đến các cặp định nghĩa và sử dụng biến, gồm các du- path đối với 1 biến được định nghĩa tại một đỉnh và được sử dụng tại một đỉnh khác. du(ni, nj, v) là tập các du-path đối với biến v xuất phát từ đỉnh ni và kết thúc tại đỉnh nj. 19 2.1.3. Kỹ thuật kiểm thử BRO Người ta đưa ra chiến lược cho các phép thử nhạy cảm bằng cách áp dụng kết hợp chiến lược kiểm thử nhánh và kiểm thử miền (quan hệ) có tên là chiến lược kiểm thử BRO (Branch and Relational Operation) [8]. Chiến lược BRO bao gồm kiểm thử nhánh và toán tử quan hệ. - Chiến lược kiểm thử nhánh bao gồm: + Kiểm thử từng điều kiện trong chương trình. + Kiểm thử điều kiện không chỉ là phát hiện sai trong điều kiện mà còn phát hiện sai khác của chương trình liên quan. Kiểm thử nhánh được thực hiện theo nguyên tắc: với mỗi điều kiện phức hợp C, thì với mỗi nhánh “true” và “false” của C, mỗi điều kiện đơn trong C phải được kiểm thử ít nhất một lần. - Chiến lược kiểm thử miền Chiến lược kiểm thử miền cần 3 hoặc 4 kiểm thử cho 1 biểu thức quan hệ bao gồm <, >, = và có thể ≠ nữa. Nếu biểu thức Bool có n biến, mà n nhỏ thì thuận lợi, song n lớn thì khó thực hiện tất cả trường hợp. Điều kiện logic Điều kiện logic có thể là: - Điều kiện đơn: 1 biến Bool (cả toán tử phủ định): X - Biểu thức quan hệ của 2 biểu thức số học C = (A Θ B), với Θ là phép so sánh: , , , , hay và A, B là biểu thức số học. - Điều kiện phức hợp cấu thành từ hơn một điều kiện đơn nhờ các toán tử Bool: hoặc (), và (), phủ định (┘). D = X1 & X 2 & … Xn , trong đó Xi là điều kiện đơn & là toán tử Bool. Kiểu sai trong điều kiện logic có thể là: - Sai biến Bool. 20 - Sai toán tử Bool. - Sai số hạng trong biểu thức toán tử Bool. - Sai toán tử quan hệ. - Sai biểu thức số học. BRO dùng “ràng buộc điều kiện làm điều kiện cần thử” để phát hiện sai ở nhánh và toán tử khi xảy ra 1 lần và không có biến chung. Giả sử: D = X1&X2 & … Xn, Xi: điều kiện đơn, &: toán tử Bool Cần đặc tả ràng buộc đầu ra của mỗi Xi tương ứng với điều kiện D đã xác định. Ta nói rằng, ràng buộc Xi của điều kiện D được phủ bởi một sự thực thi của C nếu khi đó, đầu ra của mỗi điều kiện đơn Xi trong D thỏa mãn các ràng buộc tương ứng. Điều này có nghĩa là: Khi giá trị của D đã cho, ta cần tìm các điều kiện ràng buộc mà mỗi Xi (một thành phần của D) cần thỏa mãn để bảo đảm nhận được giá trị của D đã cho. Với 1 biến Bool B, thì ràng buộc đầu ra của B là t (true) hoặc f (false). Với 1 biểu thức quan hệ (A Θ B) thì ràng buộc đầu ra của nó là toán tử quan hệ: Θ có thể nhận 1 trong 4 giá trị >, <, =, ≠ (lớn hơn, nhỏ hơn, bằng hoặc khác). 2.1.4. Kỹ thuật kiểm thử đột biến Dick Lipton là người đầu tiên đề xuất ra kỹ thuật kiểm thử đột biến, sau đó lĩnh vực này được đánh dấu sự ra đời và phổ biến bởi DeMillo và Sayward. Kiểm thử đột biến là phương pháp kiểm thử dựa trên lỗi nhằm cung cấp một tiêu chuẩn kiểm thử được gọi là tỷ lệ đột biến. Tỷ lệ đột biến được sử dụng để đánh giá khả năng phát hiện lỗi của tập dữ liệu thử [6,12,13,14]. 21 Nguyên lý chung của kiểm thử đột biến là tạo ra các phiên bản của chương trình có chứa các lỗi đơn giản, các lỗi được sử dụng bởi kiểm thử đột biến đại diện cho các lỗi sơ suất do lập trình viên thường tạo ra. Các lỗi như thế được gieo một cách thận trọng vào chương trình gốc, bằng cách thay đổi cú pháp đơn giản, để tạo một tập các chương trình lỗi. Mỗi chương trình lỗi được gọi là đột biến, mỗi đột biến mang một thay đổi cú pháp khác nhau. Cụ thể, cho P là một chương trình gốc, P’ là một đột biến của P bằng cách thực hiện một thay đổi nhỏ về cú pháp trong chương trình. Trong Bảng 2.1, P là chương trình gốc, P’ và P’’là các đột biến của P bằng cách thay đổi cú pháp trong phép toán quan hệ, thay thế x>y bằng x đối với P’ ;thay x đánh dấu bởi ký hiệu gạch chân. Bảng 2.1. Ví dụ minh họa các đột biến int max(int x, int y) int max(int x,int y) int max(int x,int y) { { { int mx = x int mx=x; int mx=x; If x mx = y mx=y mx=y return mx; return mx; return mx; } } } Sau khi tạo ra các đột biến, mỗi đột biến và chương trình gốc được thực thi trên cùng một bộ dữ liệu thử, nếu kết quả của đột biến và chương trình gốc khác nhau, thì đột biến đó được gọi là đột biến bị diệt. Nếu không thể tìm thấy dữ liệu thử sao cho khi thực thi đột biến và chương trình gốc cho kết quả khác nhau, thì đột biến đó được gọi là đột biến tương đương. 22 Tỷ số MS=100*D/(N-E) được gọi là tỷ lệ đột biến. Trong đó, MS: tỷ lệ đột biến; D: là đột biến đã bị diệt; N: là tổng số các đột biến; E: là tổng số đột biến tương đương. Tỷ lệ đột biến cho phép đánh giá chất lượng bộ dữ liệu thử. 2.2. Ca kiểm thử 2.2.1.Một số quan niệm về ca kiểm thử Kiểm thử là một tiến trình thực hiện một chương trình với ý định tìm ra lỗi. Một ca kiểm thử là một trường hợp kiểm thử có xác suất cao để tìm ra lỗi [8]. Nói rõ hơn, Ca kiểm thử (test case) là một tình huống kiểm thử tương ứng với một mạch hoạt động của chương trình. Nó bao gồm một tập các giá trị đầu vào và một danh sách các kết quả đầu ra mong muốn và thực tế [9]. 2.2.2.Nội dung thiết kế ca kiểm thử Một trong những lý do quan trọng nhất trong kiểm thử phần mềm là thiết kế và tạo ra các ca kiểm thử (Test case) có hiệu quả (ca kiểm thử tốt nhất có khả năng phát hiện ra lỗi, sai sót của phần mềm một cách nhiều nhất). Với những ràng buộc về thời gian và chi phí đã cho, thì vấn đề then chốt của kiểm thử là phải trả lời câu hỏi: Tập con nào của tất cả ca kiểm thử có thể có khả năng tìm ra nhiều lỗi nhất? [2,8]. Thông thường, phương pháp kém hiệu quả nhất là kiểm tra tất cả đầu vào ngẫu nhiên - quá trình kiểm thử một chương trình bằng việc chọn ngẫu nhiên một tập con các giá trị đầu vào có thể. Về mặt khả năng tìm ra nhiều lỗi nhất, tập hợp các ca kiểm thử được chọn ngẫu nhiên có rất ít cơ hội là tập hợp tối ưu hay gần tối ưu. Sau đây là một số phương pháp để chọn ra một tập dữ liệu kiểm thử một cách thông minh. Để kiểm thử hộp đen và kiểm thử hộp trắng một cách thấu đáo là không thể. Do đó, một chiến lược kiểm thử hợp lý là chiến lược có thể kết hợp sức mạnh của cả hai phương pháp trên: Phát triển một cuộc kiểm thử nghiêm ngặt vừa bằng việc sử dụng các phương pháp thiết kế ca kiểm thử hướng hộp đen 23 nào đó và sau đó bổ sung thêm những ca kiểm thử này bằng việc khảo sát tính logic của chương trình, sử dụng phương pháp hộp trắng. Bảng 2.2 : Những chiến lược kết hợp Hộp đen Hộp trắng Phân lớp tương đương Bao phủ câu lệnh Phân tích giá trị biên Bao phủ quyết định Đồ thị nguyên nhân - kết quả Bao phủ điều kiện Đoán lỗi Bao phủ điều kiện - quyết định Bao phủ đa điều kiện. Mỗi phương pháp có những ưu điểm cũng như khuyết điểm riêng, do đó để có được tập các ca kiểm thử tối ưu, chúng ta cần kết hợp hầu hết các phương pháp. Quy trình thiết kế các ca kiểm thử sẽ bắt đầu bằng việc phát triển các ca kiểm thử sử dụng phương pháp hộp đen và sau đó phát triển bổ sung các ca kiểm thử cần thiết với phương pháp hộp trắng. Kiểm thử hộp trắng có liên quan tới mức độ mà các ca kiểm thử thực hiện hay bao phủ tính logic (mã nguồn) của chương trình. Kiểm thử hộp trắng cơ bản là việc thực hiện mọi đường đi trong chương trình, nhưng việc kiểm thử đầy đủ đường đi là một mục đích không thực tế cho một chương trình với các vòng lặp. 2.2.3. Một số phương pháp chính để thiết kế ca kiểm thử 2.2.3.1. Thiết kế các ca kiểm thử dựa vào ý tưởng phương pháp bao phủ câu lệnh (Statement Coverage) [2,4,5,8] Tư tưởng của phương pháp này là thực hiện mọi câu lệnh trong chương trình ít nhất 1 lần. Phương pháp này bao gồm: Dựa vào ý tưởng phương pháp bao phủ quyết định (Decision coverage) 24 Ý tưởng của phương pháp này là viết đủ các ca kiểm thử mà mỗi quyết định có kết luận đúng hay sai ít nhất 1 lần. Nói cách khác, mỗi hướng phân nhánh phải được xem xét kỹ lưỡng ít nhất 1 lần. Bao phủ quyết định thường thỏa mãn bao phủ câu lệnh. Vì mỗi câu lệnh là trên sự bắt nguồn một đường đi phụ nào đó hoặc là từ một câu lệnh rẽ nhánh hoặc là từ điểm vào của chương trình, mỗi câu lệnh phải được thực hiện nếu mỗi quyết định rẽ nhánh được thực hiện. Dựa vào ý tưởng phương pháp bao phủ điều kiện (Condition coverage) Ý tưởng của phương pháp này là viết đủ các ca kiểm thử để đảm bảo rằng mỗi điều kiện trong một quyết định đảm nhận tất cả các kết quả có thể ít nhất 1 lần. Dựa vào ý tưởng phương pháp bao phủ quyết định/điều kiện (Decision/condition coverage) Ý tưởng của phương pháp này là thực hiện đủ các ca kiểm thử mà mỗi điều kiện trong một quyết định thực hiện trên tất cả các kết quả có thể ít nhất 1 lần, và mỗi điểm vào được gọi ít nhất 1 lần. Điểm yếu của bao phủ quyết định/điều kiện là mặc dù xem ra nó có thể sử dụng tất cả các kết quả của tất cả các điều kiện, nhưng thường không phải vậy vì những điều kiện chắc chắn đã cản các điều kiện khác. Dựa vào ý tưởng phương pháp bao phủ đa điều kiện (Multiple condition coverage) Ý tưởng của phương pháp này là viết đủ các ca kiểm thử mà tất cả những sự kết hợp của các kết quả điều kiện có thể trong mỗi quyết định, và tất cả các điểm vào phải được gọi ít nhất 1 lần. 2.2.3.2. Thiết kế các ca kiểm thử dựa vào ý tưởng phương pháp phân lớp tương đương (Equivalence Patitioning) [2,4,5,8] 25 Phân lớp tương đương là một phương pháp kiểm thử hộp đen chia miền đầu vào của một chương trình thành các lớp dữ liệu, từ đó suy dẫn ra các ca kiểm thử. Phương pháp này cố gắng xác định ra một ca kiểm thử mà làm lộ ra một lớp lỗi, do đó làm giảm tổng số các trường hợp kiểm thử phải được xây dựng. Thiết kế ca kiểm thử cho phân lớp tương đương dựa trên sự đánh giá về các lớp tương đương với một điều kiện vào. Lớp tương đương biểu thị cho tập các trạng thái hợp lệ hay không hợp lệ đối với điều kiện vào. Các lớp tương đương được xác định bằng cách lấy mỗi trạng thái đầu vào (thường là 1 câu hay 1 cụm từ trong đặc tả) và phân chia nó thành 2 hay nhiều nhóm. Mặc dù việc phân lớp tương đương là rất tốt khi lựa chọn ngẫu nhiên các ca kiểm thử, nhưng nó vẫn có những thiếu sót. Chẳn hạn, nó bỏ qua các kiểu ca kiểm thử có lợi nào đó. Hai phương pháp tiếp theo, phân tích giá trị biên và đồ thị nguyên nhân - kết quả, bao phủ được nhiều những thiếu sót này. 2.2.3.3. Thiết kế các ca kiểm thử dựa vào ý tưởng phương pháp phân tích giá trị biên (Boundary Value Analysis) [2, 4, 5, 8] Kinh nghiệm cho thấy các ca kiểm thử mà khảo sát kỹ các điều kiện biên có tỷ lệ phần trăm cao hơn các ca kiểm thử khác. Các điều kiện biên là những điều kiện mà các tình huống ngay tại, trên và dưới các cạnh của các lớp tương đương đầu vào và các lớp tương đương đầu ra. Phân tích các giá trị biên là phương pháp thiết kế ca kiểm thử bổ sung thêm cho phân lớp tương đương, nhưng khác với phân lớp tương đương ở 2 khía cạnh: - Phân tích giá trị biên không lựa chọn phần tử bất kỳ nào trong 1 lớp tương đương là điển hình, mà nó yêu cầu là 1 hay nhiều phần tử được lựa chọn như vậy mà mỗi cạnh của lớp tương đương đó chính là đối tượng kiểm tra. 26 - Ngoài việc chỉ tập trung chú ý vào các trạng thái đầu vào (không gian đầu vào), các ca kiểm thử cũng nhận được bằng việc xem xét không gian kết quả (các lớp tương đương đầu ra). Phân tích giá trị biên yêu cầu óc sáng tạo và lượng chuyên môn hóa nhất định và nó là một quá trình mang tính kinh nghiệm rất cao. 2.2.3.4. Thiết kế các ca kiểm thử dựa vào ý tưởng phương pháp đồ thị nguyên nhân - kết quả (Cause - Effect Graphing) [2, 4, 5, 8] Một yếu điểm của phân tích giá trị biên và phân lớp tương đương là chúng không khảo sát sự kết hợp của các trường hợp đầu vào. Việc kiểm tra sự kết hợp đầu vào không phải là một nhiệm vụ đơn giản bởi vì nếu phân lớp tương đương các trạng thái đầu vào, thì số lượng kết hợp thường là rất lớn. Nếu không có cách lựa chọn có hệ thống một tập con các trạng thái đầu vào thì khi chọn ra một tập tùy hứng các điều kiện, điều này có thể dẫn tới việc kiểm thử không có hiệu quả. Đồ thị nguyên nhân - kết quả hỗ trợ trong việc lựa chọn một cách có hệ thống tập các ca kiểm thử có hiệu quả cao. Nó có tác động có lợi ảnh hưởng tới việc chỉ ra tình trạng chưa đầy đủ và nhập nhằng trong đặc tả. Nó cung cấp cả cách biểu diễn chính xác cho các điều kiện logic và hành động tương ứng. Vẽ đồ thị nguyên nhân - kết quả là phương pháp tạo các ca kiểm thử có hệ thống mô tả sự kết hợp của các điều kiện. Sự thay đổi sẽ là một sự lựa chọn kết hợp không thể dự tính trước, nhưng khi thực hiện như vậy sẽ bỏ sót nhiều ca kiểm thử “thú vị” được xác định bằng đồ thị nguyên nhân - kết quả. Vì đồ thị nguyên nhân - kết quả làm chúng ta mất thời gian trong việc chọn các giá trị cụ thể cho các toán hạng, nên các điều kiện giới hạn có thể bị pha trộn thành các ca kiểm thử xuất phát từ đồ thị nguyên nhân - kết quả. Vì vậy, chúng ta đạt được một tập các ca kiểm thử nhỏ nhưng hiệu quả mà thỏa mãn cả hai mục tiêu. 27 2.2.3.5. Thiết kế các ca kiểm thử dựa vào ý tưởng phương pháp đoán lỗi - Error Guessing[2,4,5,8] Một kỹ thuật thiết kế ca kiểm thử khác là error guessing – đoán lỗi. Người kiểm thử được đưa cho một chương trình đặc biệt. Họ phỏng đoán (cả bằng trực giác và kinh nghiệm) các loại lỗi có thể và sau đó viết các ca kiểm thử để đưa ra các lỗi đó. Thật khó để đưa ra một quy trình cho kỹ thuật đoán lỗi vì nó là một quy trình có tính trực giác cao và không thể dự đoán trước. Ý tưởng cơ bản là liệt kê một danh sách các lỗi có thể hay các trường hợp dễ xảy ra lỗi và sau đó viết các ca kiểm thử dựa trên danh sách đó. Một ý tưởng khác để xác định các ca kiểm thử có liên đới với các giả định mà lập trình viên có thể đã thực hiện khi đọc đặc tả (tức là, những thứ bị bỏ sót khỏi đặc tả, hoặc là do tình cờ, hoặc là vì người viết có cảm giác những đặc tả đó là rõ ràng). Nói cách khác, cần liệt kê những trường hợp đặc biệt đó mà có thể đã bị bỏ sót khi chương trình được thiết kế. 2.3. Kỹ thuật ma trận đồ thị cho thiết kế ca kiểm thử 2.3.1. Ý tưởng và nội dung kỹ thuật ma trận đồ thị [8] 2.3.1.1 Kỹ thuật đồ thị dòng Một kỹ thuật kiểm thử hộp trắng đầu tiên được Tom McCabe đề nghị là “kiểm thử đường cơ sở”. Phương pháp đường cơ sở giúp cho người thiết kế trường hợp kiểm thử có thể suy dẫn ra một cách đo độ phức tạp logic của thiết kế thủ tục và dùng cách đo này như một hướng dẫn để xác định một tập cơ sở các đường thực hiện. Các trường hợp kiểm thử được suy dẫn ra để thực hiện một tập cơ sở, được đảm bảo để thực hiện mọi câu lệnh trong chương trình ít nhất một lần trong khi kiểm thử Trong phương pháp đường cơ sở, một hệ thống ký pháp đơn giản được dùng để biểu diễn cho luồng điều khiển, được gọi là đồ thị dòng (hay đồ thị 28 chương trình). Đồ thị dòng mô tả cho dòng điều khiển logic bao gồm các cấu trúc cơ bản: sequence, if, while, until, case. Đồ thị dòng thực chất là một kỹ thuật dựa trên cấu trúc điều khiển của chương trình. Nó gần giống đồ thị luồng điều khiển của chương trình. Đồ thị dòng nhận được từ đồ thị luồng điều khiển bằng cách: - Gộp các lệnh tuần tự và điều khiển liên tiếp thành một lệnh; - Thay lệnh rẽ nhánh của các đường điều khiển bằng một nút “vị tự”. Cấu trúc đồ thị dòng gồm: - Mỗi nút (hình tròn) biểu thị một hay một số lệnh tuần tự và rẽ nhánh hoặc thay cho điểm phân nhánh hay hội tụ các đường điều khiển. - Mỗi cạnh nối hai nút biểu diễn dòng điều khiển. Kết quả đồ thị dòng thể hiện: - Chia mặt phẳng thành nhiều miền. - Có nút vị tự biểu thị sự phân nhánh của các cung. - Mỗi cung nối từng cặp nút biểu diễn luồng điều khiển. Ví dụ Xét cấu trúc điều khiển chương trình: Do while còn bản ghi chưa xử lý Read bản ghi chưa xử lý If giá trị trường thứ nhất của bản ghi = 0 then xử lý bản ghi; Cất vào bộ nhớ; tăng biến đếm; Else if giá trị trường thứ hai của bản ghi = 0 then tạo lại bản ghi; Else xử lý bản ghi; Cất vào tệp; 29 Endif Endif Enddo Bước 1-Gán nhãn dòng lệnh: 1 Do while còn bản ghi chưa xử lý Read bản ghi chưa xử lý 2 If giá trị trường thứ nhất của bản ghi = 0 3 then xử lý bản ghi; 4 Cất vào bộ nhớ; tăng biến đếm; 5 Else if giá trị trường thứ hai của bản ghi = 0 6 then tạo lại bản ghi; 7 Else xử lý bản ghi; 8 Cất vào tệp; Endif 9 10 Endif 11Enddo Các dòng lệnh có liên quan đến xử lý dữ liệu đều được đánh số thứ tự (1,2,…,11), từ đó sẽ được sơ đồ điều khiển của chương trình và sơ đồ luồng điều khiển Bước 2-Vẽ sơ đồ điều khiển chương trình: 30 Hình 2.4: Sơ đồ điều khiển của chương trình Bước 3a- Vẽ sơ đồ luồng điều khiển rút gọn Hình 2.5: Sơ đồ luồng điều khiển Bước 3b- Vẽ đồ thị dòng Từ sơ đồ luồng điều khiển xác định được đồ thị dòng: 31 Hình 2.6 : Đồ thị dòng dùng để xác định ma trận kiểm thử Các thông số của đồ thị dòng gồm: Trong ví dụ có: 9 nút (=N) trong đó 3 nút là vị tự (=P) và 11 cung (=E) Bước 4- Tính độ phức tạp chu trình: Để đảm bảo mọi câu lệnh đều được kiểm thử ít nhất một lần, cần tìm được tất cả các đường điều khiển độc lập trong chương trình (khác nhau ít nhất một lệnh). Số các đường độc lập của một chương trình là giới hạn trên số ca kiểm thử cần tiến hành. Nó được gọi là độ phức tạp chu trình của chương trình. Tập các đường độc lập/cơ bản (bacsic paths) của một chương trình trùng với các đường độc lập của đồ thị dòng (tìm đơn giản hơn) Độ phức tạp chu trình được tính theo công thức: Với N: Số nút; P: Số nút vị tự; E: Số cung V(G) = E – N +2 (=11-9+2=4) Hoặc V(G) = số miền phẳng (=4) Hoặc V(G) = P + 1 (=3+1=4) 32 Hình 2.7: Độ phức tạp chu trình được xác định từ số miền phẳng trong đồ thị
dòng phẳng thành 4 miền: R1, R2, R3, R4.
Bước 5- Xác định tập đường cơ bản/các ca kiểm thử: Xác định các ca kiểm thử bằng cách xác định số miền phẳng trong đồ thị dòng. Dựa vào hình 2.6 có thể xác định đồ thị trên có 4 miền phẳng tương
ứng V(G) = 4. Như vậy từ đồ thị dòng, do xác định được độ phức tạp chu trình V(G)=4 và suy ra cần thiết kế 4 đường kiểm thử, tạo thành tập đường cơ bản: Bảng 2.3. Tập đường cơ bản Tập đường cơ bản 11 1 a 2-3 4-5 10 1 1 b 2-3 6 7 9 10 1 1 c 2-3 6 8 9 10 1 1 d 33 2.3.1.2 Kỹ thuật ma trận kiểm thử Ma trận kiểm thử là một ma trận vuông có kích thước bằng số các nút trên đồ thị dòng: - Mỗi dòng/cột ứng với tên 1 nút; - Mỗi ô: là tên một cung nối nút dòng đến nút cột. Nhân liên tiếp k ma trận này ta được ma trận có số ở mỗi ô chỉ số con đường k cung từ nút dòng tới nút cột. Ma trận kiểm thử được sử dụng như một dữ liệu có cấu trúc để kiểm tra các con đường cơ bản: số đường đi qua nút (có thể tính cả trọng số của chúng). Ma trận kiểm thử là một công cụ mạnh trong việc đánh giá cấu trúc điều khiển chương trình. Khi kiểm thử, ta thêm trọng số cho các cung của ma trận kiểm thử (ma trận kiểm thử có trọng số) như sau: - Xác suất cung đó được thực thi. - Thời gian xử lý của tiến trình đi qua cung đó - Bộ nhớ đòi hỏi của tiến trình đi qua cung đó. - Nguồn lực đòi hỏi của tiến trình đi qua cung đó. Ví dụ:
Từ đồ thị dòng: Hình 2.8 : Đồ thị dòng dùng để xác định ma trận kiểm thử xác định được: 34 Bảng 2.4 : Ma trận kiểm thử A và cách tính độ phức tạp V(G) Nút
1
23
45
6
7
8
9 1 23 45 6
1
1
1 7
1 8
1 1
1 9 10 11 V(G) = 4
1 1+1-1=1
1+1-1=1
1-1 = 0
1+1-1=1
1-1 = 0
1
1-1 = 0
1
1-1 = 0
1-1 = 0 10 1 11 +1=3+1= 4 (Các số 1 trong ma trận đánh dấu nút dòng đi tới nút cột, ví dụ nút dòng 2,3 xác định chuyển tới nút cột 4,5 nên ô có tọa độ (23,45) được đánh dấu 1). Bảng 2.5 Bảng ma trận kiểm thử A= (aij) với i,j=1,2,3,4,...,9 được xác định như sau: 1 1 1 1 1 1
1 1
1 1 1 Độ phức tạp của đồ thị được xác định theo công thức: V(G) =(Σi(Σjaij)-1)+1)=4 với (i,j=1,...,9) Để thuận tiện cho việc lập trình, chúng ta xác định cách tính độ phức tạp theo quy trình sau: Bước a: tính các tổng theo hàng của ma trận A trừ dòng cuối cùng T1=a11+ a12+ a13+... +a1,9 = 2 35 T2=a21+ a22+ a23+...+ a2,9 = 2 T3=a31+ a32+ a33+... +a3,9 = 1 T4=a41+ a42+ a43+...+ a4,9 = 2 T5=a51+ a52+ a53+... +a5,9 = 1 T6=a61+ a62+ a33+...+ a6,9= 1 T7=a71+ a72+ a73+... +a7,9 = 1 T8=a81+ a82+ a83+... +a8,9 = 1 Bước b: Tính Ti (i=1,…,14) T1:=T1-1=1 T2:=T2-1=1 T3:=T3-1=0 T4:=T4-1=1 T5:=T5-1=0 T6:=T6-1 = 0 T7:=T7-1 = 0 T8:=T8-1 = 0 Bước c: Tính V(G)= (T1+T2+...+T8) + 1= 4 Trong đó: (T1+T2+...+T8) cho biết số nút vị tự P là 3 nên V(G)= P+1= (T1+T2+...+T9) + 1= 3+1 = 4 Như vậy, xác định được số đường phải kiểm thử là 4 Bước d: Xác định được tập đường kiểm thử Từ đây, chúng ta dễ dàng xác định được tập đường kiểm thử giống như trên: Do V(G) = 4 nên xác định được 4 đường kiểm thử giống như phương pháp xác định V(G) bằng phương pháp tô màu xác định miền phẳng. 36 Tập đường cơ bản a 1 11 b 1 2-3 4-5 10 1 c 1 2-3 6 7 9 10 1 d 1 2-3 6 8 9 10 1 Ma trận kiểm thử tích A2 Bảng 2.6 : Ví dụ ma trận kiểm thử tích A2= Nút
1
23
45
6
7
8
9
10
11 1
1
1 23
1 45
1 6
1 7
1 8
1 9
2 10
1
1
1 11
1 (Các số trong ma trận cho biết số con đường có hai cạnh đi qua cung đó). 2.3.2. Quy trình kiểm thử phần mềm bằng kỹ thuật ma trận đồ thị Kiểm thử phần mềm bằng kỹ thuật ma trận đồ thị cần tuân theo lộ trình sau: Giai đoạn 1: - Nhập văn bản mô-đun chương trình cần kiểm thử - Lập bảng biểu diễn luồng dữ liệu của đồ thị dòng Giai đoạn 2: - Lập bảng ma trận đồ thị - Lập bảng tính độ phức tạp của đồ thị dòng V(G) 37 Giai đoạn 3: - Xác định số đường kiểm thử - Lập bảng kết quả xác định tập đường cơ bản Giai đoạn 4: - Nhập các inputs cho các test path -Thực hiện các test cases và cho ra các bảng so sánh kết quả thực và kết quả mong đợi Giai đoạn 5: - Nhập các input cho các ca kiểm thử cho kiểm thử vòng lặp - Thực hiện các test cases và cho ra các bảng so sánh kết quả thực và kết quả mong đợi Giai đoạn 6: - Đánh giá kết quả thử nghiệm. 38 CHƯƠNG 3 CHƯƠNG TRÌNH THỬ NGHIỆM KIỂM THỬ PHẦN MỀM BẰNG KỸ THUẬT MA TRẬN ĐỒ THỊ 3.1. Chọn mô-đun phần mềm thử nghiệm Mô-đun phần mềm thử nghiệm được chọn là mô-đun “Thủ tục tính giá trị trung bình của 100 số hay ít hơn, nằm giữa các giá trị cận, tính tổng số phần tử hợp lệ” [15]: INTERFACE RETURNS average, total.input, total.valid; INTERFACE ACCEPT value, minimum,maximum; TYPE value [1:100] IS SCALAR ARRAY; TYPE average, total.input, total.valid; minimum, maximum, sum IS SCALAR; TYPE i IS INTERGER; I=1; total.input= total.valid=0; sum=0; DO WHILE value[i] <> -999 AND total.input < 100; Increment total.input by 1; IF value[i] >= minimum AND value[i] <= maximum THEN Begin increment total.valid by 1; Sum=sum+ value[i] end ENDIF Increment i by 1; ENDDO IF total.valid > 0 THEN average = sum/ total.valid; ELSE average = -999; ENDIF 39 3.2. Thiết kế ca kiểm thử và kiểm thử mô-đun phần mềm 3.2.1. Quy trình thiết kế Bài toán thiết kế ca kiểm thử và kiểm thử mô-đun phần mềm được tuân theo quy trình thiết kế chuẩn sau đây [15]: Bước 1- Gán nhãn dòng lệnh Bước 2- Vẽ sơ đồ điều khiển của chương trình Bước 3- Vẽ sơ đồ luồng điều khiển rút gọn và đồ thị dòng Bước 4- Xác định độ phức tạp của chu trình Bước 5- Xác định tập đường cơ bản Bước 6- Xác định các Inputs cho các test path Bước 7- Xác định các ca kiểm thử cho kiểm thử vòng lặp While 3.2.2. Nội dung thiết kế Trình tự thiết kế bao gồm các bước sau: Bước 1- Gán nhãn dòng lệnh PROCEDURE average; INTERFACE RETURNS average, total.input, total.valid; INTERFACE ACCEPT value, minimum,maximum; TYPE value [1:100] IS SCALAR ARRAY; TYPE average, total.input, total.valid; minimum, maximum, sum IS SCALAR; TYPE i IS INTERGER; i=1; total.input= total.valid=0; 1 sum=0; DO WHILE value[i] <> -999 AND total.input < 100 2 3 Increment total.input by 1; 4 IF value[i] >= minimum AND value[i] <= maximum 5 6 40 THEN Begin 7 increment total.valid by 1; Sum=sum+value[i]; End ENDIF 8 Increment i by 1; 9 ENDDO 10 IF total.valid > 0 11 THEN average = sum/ total.valid; 12 ELSE average = -999; 13 ENDIF 14 END average 1 2 Bước 2- Vẽ sơ đồ điều khiển của chương trình đ s 10 3 đ 11 4 s đ 12 5 s đ 14 s 6 8 đ 7 9 s 13 Hình 3.1. Sơ đồ điều khiển của chương trình 41 Bước 3a- Vẽ Sơ đồ luồng điều khiển rút gọn Việc rút gọn đã được thực hiện khi dán nhãn nên ta vẫn có sơ đồ 1 2 luồng điều khiển sau: s s 10 3 đ 11 4 đ 12 13 5 s đ 14 s đ 6 8 s 7 9 đ Hình 3.2. Sơ đồ luồng điều khiển Bước 3b- Vẽ Đồ thị dòng Từ sơ đồ luồng điều khiển xác định được đồ thị dòng gồm: N - số nút = 14 P - số nút vị tự = 5 (nút sẫm màu) E - số cung = 18 1 2 10 3 11 4 12 13 5 14 6 8 7 9 42 Hình 3.3. Đồ thị dòng Bước 4- Xác định độ phức tạp của chu trình Độ phức tạp của chu trình được xác định bằng số miền phẳng trong đồ thị dòng: Độ phức tạp của chu trình V(G) của đồ thị được tính theo 3 cách sau: V(G) = E – N + 2= 18 – 14 + 2= 6, hoặc V(G)= số miền phẳng= 6, hoặc V(G)= P+1= 5+1=6 1 2 R1 10 3 R6 11 4 12 13 R5 5 14 R4 R2 6 8 R3 7 9 43 Hình 3.4. Độ phức tạp của chu trình Bước 5- Xác định tập đường cơ bản Cách 1-Xác định tập đường cơ bản theo số miền phẳng Do xác định được có 6 miền phẳng nên có được 6 đường kiểm thử. Tập đường cơ bản xác định được bao gồm: Path1: 1-2-10-11-12-14
Path2: 1-2-10-11-13-14
Path3: 1-2-3-10-11-12-14
Path4: 1-2-3-4-5-8-9-2-10-11-12-14
Path5: 1-2-3-4-5-6-8-9-2-10-11-12-14
Path6: 1-2-3-4-5-6-7-8-9-2-10-11-12-14 44 Cách 2-Xác định tập đường cơ bản theo ma trận đồ thị 1 2 10 3 11 4 12 113 5 14 6 8 7 9 Theo trên, chúng ta có Đồ thị dòng: Hình 3.5. Đồ thị dòng Từ đồ thị dòng, xác định “ma trận kiểm thử”: Ma trận kiểm thử, ký hiệu là A=(aij) với i,j=1,2,3,...,n, là một ma trận vuông cấp n, có kích thước bằng số các nút (n=14) trên đồ thị dòng: - Mỗi dòng/ cột ứng với tên một nút; - Mỗi ô: là tên một cung nối nút dòng đến nút cột. Nhân liên tiếp k ma trận này ta được ma trận có số ở mỗi ô chỉ số con đường k cung từ nút dòng tới nút cột. Ma trận kiểm thử được sử dụng như một dữ liệu có cấu trúc để kiểm tra các con đường cơ bản: số đường đi qua nút (có thể tính cả trọng số của chúng). - Ma trận kiểm thử là một công cụ mạnh trong việc đánh giá cấu trúc điều khiển chương trình. 45 3 4 5 6 7 8 9 10 11 12 13 14 V(G)=6 2 1-1=0 1 nút 1 1. 1 1+1-1=1 1 2. 1 1+1-1=1 1 3. 1-1=0 1 4. 1 1+1-1=1 1 5. 1 1+1-1=1 1 6. 1 1-1=0 7. 1 1-1=0 8. 1-1=0 1 9. 1 1-1=0 10. 1 1 1+1-1=1 11. 1 12. 1 13. V(G)= 14. theocot+1= 5+1=6 Bảng 3.1-Bảng tính độ phức tạp của đồ thị dòng V(G): (Các số 1 trong ma trận đánh dấu nút dòng đi tới nút cột, ví dụ nút dòng 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 xác định chuyển tới nút cột 3 nên có tọa độ (2,3) được đánh dấu 1).
Bảng 3.2: Bảng ma trận kiểm thử A= (aij) với i,j=1,2,3,4,...,14 46 Độ phức tạp của đồ thị được xác định theo công thức: V(G) = +1 = 6 Để thuận tiện cho việc lập trình, chúng ta xác định cách tính độ phức tạp theo quy trình sau: Bước a: tính các tổng theo hàng của ma trận A trừ dòng cuối cùng T1=a11+ a12+ a13+... +a1,14 = 1 T2=a21+ a22+ a23+...+ a2,14 = 2 T3=a31+ a32+ a33+... +a3,14 = 2 T4=a41+ a42+ a43+...+ a4,14 = 1 T5=a51+ a52+ a53+... +a5,14 = 2 T6=a61+ a62+ a33+...+ a6,14 = 2 T7=a71+ a72+ a73+... +a7,14 = 1 T8=a81+ a82+ a83+... +a8,14 = 1 T9= a91+ a92+ a93+... +a9,14 = 1 T10=a10,1+ a10,2+ a10,3+... +a10,14 = 1 T11=a11,1+ a11,2+ a11,3+... +a11,14 = 2 T12=a12,1+ a12,2+ a12,3+... +a12,14 =1 T13=a13,1+ a13,2+ a13,3+... +a13,14 = 1 T14=a14,1+ a14,2+ a14,3+... +a14,14 = 1 Bước b: Tính Ti (i=1,…,14) T1:=T1-1=0 T2:=T2-1=1 T3:=T3-1=1 T4:=T4-1=0 T5:=T5-1=1 T6:=T6-1 = 1 T7:=T7-1 = 0 47 T8:=T8-1 = 0 T9 := T9-1 = 0 T10:= T10-1 = 0 T11:= T11-1 =1 T12:= T12-1 = 0 T13:= T13-1 = 0 T14:= T14-1 = 0 Bước c: Tính V(G)= (T1+T2+...+T14) + 1=6 Trong đó: (T1+T2+...+T9) chính là số nút vị tự P V(G)= P+1= (T1+T2+...+T14) + 1= 5+1 = 6 Như vậy, xác định được số đường phải kiểm thử là 6 Bước d: Xác định được tập đường kiểm thử Từ đây, chúng ta dễ dàng xác định được tập đường kiểm thử giống như trên: Path1: 1-2-10-11-12-14 Path2: 1-2-10-11-13-14 Path3: 1-2-3-10-11-12-14 Path4: 1-2-3-4-5-8-9-2-10-11-12-14 Path5: 1-2-3-4-5-6-8-9-2-10-11-12-14 Path6: 1-2-3-4-5-6-7-8-9-2-10-11-12-14 48 Bước 6- Xác định các Inputs cho các test path: Bảng 3.3: Các Test path Dữ liệu vào Kết quả Kết quả mong đợi Ghi chú Path 1 không thể Path 1 test case được kiểm thử value (k)= dữ value (i)=-999 average là đúng dựa trên đơn độc mà phải liệu vào hợp lệ, với 2≤ i ≤100 các giá trị k và các tổng thử như là một where k
phần của các đường 4,5 và 6 2≤ i ≤100 Path 2 test case value (1)=-999 Average=-999 Giá trị các tổng giữ nguyên giá trị ban đầu Path 3 test case value (k)= 101 hoặc 100 giá trị đầu Giống như ca kiểm lớn hơn tiên là hợp lệ thử 1 Path 4 test case value (i)= dữ liệu value (k) < Average đúng với mọi vào hợp lệ, where minimum, k và các giá trị tổng i <100 where k
Path 5 test case value (i)= dữ liệu value (k) > Average đúng với mọi vào hợp lệ, where maximum, k và các giá trị tổng i <100 where k ≤ i đều đúng Path 6 test case value (i)= dữ liệu Average đúng với mọi vào hợp lệ, where k và các giá trị tổng i <100 đều đúng 49 Bước 7- Xác định các ca kiểm thử vòng lặp While: Bảng 3.4: Bảng các ca kiểm thử vòng lặp while Số lần Đầu ra Đầu ra ID Inputs Ghi chú lặp mong đợi thực tế tcl0 0 [-999, ...] 1 2 -999 tcl1 1 [1,-999] 1 2 1 tcl2 2 [1,2,-999] 1 2 1.5 tclk 3 [1,2,3,4,5,-999] 1 3 2 tcl(n-1) 99 [1,2,...,99,-999] 1 100 50 tcl(n) 100 [1,2,...,100,-999] 1 100 50.5 tcl(n+1) 100 [1,2,...,100,-999] 1 100 50.5 3.3 Một số giao diện chính của chương trình 3.3.1. Giao diện thiết kế ca kiểm thử theo kỹ thuật ma trận đồ thị 3.3.1.1. Giao diện trang chủ Hình 3.6 Giao diện trang chủ 50 3.3.1.2. Giao diện trợ giúp Chọn “Trợ giúp” để xem hướng dẫn sử dụng chương trình Hình 3.7 Giao diện hướng dẫn sử dụng của chương trình 3.3.1.3. Giao diện xử lý Chọn “Chương trình” để vào giao diện xử lý Hình 3.8 Giao diện chính chạy chương trình 51 3.3.1.4. Giao diện định hướng dữ liệu Nhấn nút “Mở file” để chọn đường dẫn. Hình 3.9: Hộp thoại Open để tìm đường dẫn 3.3.1.5. Giao diện nhập mô-đun cần kiểm thử Sau khi chọn file dữ liệu bằng cách ấn nút Mở file, hiển thị mô-đun cần kiểm thử: Hình 3.10: Form hiển thị mô-đun cần kiểm thử 52 3.3.1.6.Giao diện tính độ phức tạp và xác định tập đường cơ bản Nhấn vào nút “Tính độ phức tạp”, chương trình cho giá trị độ phức tạp, ma trận kiểm thử và tập đường cơ bản. Hình 3.11. Giao diện xác định tập đường cơ bản Như vậy, khi chọn nút lệnh Tính độ phức tạp, phần mềm sẽ đưa ra kết quả đỗ phức tạp là V(G) = 6, ma trận kiểm thử, tập đường kiểm thử gồm 6 đường cơ bản là: 1-2-10-11-12-14; 1-2-10-11-13-14; 1-2-3…; 1-2-3-4-5-8- 9…; 1-2-3-4-5-6-8-9…; 1-2-3-4-5-6-7-8-9… 3.3.1.7.Giao diện nhập tham số thử nghiệm Nhập dữ liệu vào ô “Đầu vào” cho code_1.txt, dữ liệu nhập vào cần được thực hiện đúng quy cách: [ 999] Trong quá trình nhập dữ liệu, nếu dữ liệu đầu vào không được nhập theo quy cách, hệ thống sẽ báo lỗi 53 Hình 3.12: Giao diện thông báo lỗi khi nhập dữ liệu không hợp lệ 3.3.1.8. Giao diện test Chọn nút lệnh để đưa ra kết quả trong ô “Đầu ra” và “Đường kiểm thử” Hình 3.13: Giao diện test đơn vị chương trình code_1 Kết quả “Đầu ra” hiển thị 3 giá trị cơ bản: - average: Kết quả trung bình của các giá trị nhập vào thoả mãn nằm trong đoạn cận dưới đến đoạn cận trên. - total.input: Số lượng các giá trị nhập vào; - total.valid: Số lượng các giá trị nhập vào thoả mãn nằm trong đoạn cận dưới đến đoạn cận trên. Hiển thị “Đường kiểm thử” đã đi tương ứng với Input nhập vào 54 3.3.2. Quá trình test với Mô-đun 1: “Thủ tục tính giá trị trung bình của 100 số hay ít hơn, nằm giữa các giá trị cận, tính tổng số phần tử hợp lệ” PROCEDURE average INTERFACE RETURNS average,total.input,total.valid; INTERFACE ACCEPT value,minimum,maximum; TYPE value[1:100] IS SCALAR ARRAY; TYPE average,total.input,total.valid,minimum,maximum,sum IS SCALAR; TYPE i IS INTERGER; i = 1; total.input = 0; total.valid = 0; sum = 0; DOWHILE value[i]<>-999 AND total.input<100 total.input = total.input + 1; IF value[i]>=minimum AND value[i]<=maximum THEN Begin total.valid = total.valid + 1; sum = sum + value[i]; End ENDIF i = i + 1; ENDDO IF total.valid>0 THEN average = sum / total.valid; ELSE average = -999; ENDIF END average Mô-đun 1 (code_1) 55 -Với Input TestData1: [-999,25,4,2,-8] 1 2, theo thiết kế ca kiểm thử Path 1 test case Kết quả: Bảng 3.5: Bảng TestData1 Total. Total. Total. Total. Average Average input Valid Input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 0 [-999,25,4,2,-8] 1 2 -999 0 0 -999 0 0 Như vậy, trong trường hợp này, ca kiểm thử đã bỏ qua vòng lặp while do điều kiện thực hiện vòng lặp không thoả mãn. -Với Input TestData2: [1,-999] 1 2, theo thiết kế ca kiểm thử Path 2 test case: Kết quả: Bảng 3.6: Bảng TestData2 Total. Total. Total. Total. Average Average input valid Input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 5 [1,-999] 1 2 1 1 1 1.0 1 1 Như vậy, trong trường hợp này, ca kiểm thử đã thực hiện vòng lặp while 1 lần. -Với Input TestData3: [1,2,-999] 1 2, theo thiết kế ca kiểm thử Path 3 test case. Kết quả: Bảng 3.7: Bảng TestData3 Total. Total. Total. Total. Average Average Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp input
2 valid
2 input
2 valid
2 2 [1,2,-999] 1 2 1.5 1.5 Như vậy, trong trường hợp này, ca kiểm thử đã thực hiện vòng lặp while 2 lần. 56 -Với Input TestData4: [1,2,3,4,5,-999] 1 10, theo thiết kế ca kiểm thử Path 4 test case: Kết quả: Bảng 3.8: Bảng TestData4 Total. Total. Total. Total. Average Average Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp input
5 valid
5 input
5 valid
5 5 [1,2,3,4,5,-999] 1 10 3 3.0 Như vậy, trong trường hợp này, ca kiểm thử đã thực hiện vòng lặp while 5 lần. -Với Input TestData5: [1,2,...,99,-999] 1 100, theo thiết kế ca kiểm thử Path 5 test case: Kết quả: Bảng 3.9: Bảng TestData5 Total. Total. Total. Total. Average Average Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp input
99 valid
99 input
50.0 99 valid
99 99 [1,2,...,99,-999] 1 100 50 Như vậy, trong trường hợp này, ca kiểm thử đã thực hiện vòng lặp while 99 lần. -Với Input TestData6: [1,2,...,100,-999] 1 100, theo thiết kế ca kiểm thử Path 6 test case: Kết quả: Bảng 3.10: Bảng TestData6 Total. Total. Total. Total. Average Average input valid input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 100 [1,2,...,100,-999] 1 100 50.5 100 100 50.5 100 100 Như vậy, trong trường hợp này, ca kiểm thử đã thực hiện vòng lặp while 100 lần. 57 -Với Input TestData7: [1,2,...,100,101,-999] 1 100, theo thiết kế ca kiểm thử Path 7 test case: Kết quả: Bảng 3.11: Bảng TestData7 Total. Total. Total. Total. Average Average input valid input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 100 [1,2,...,100,101,-999] 1 100 50.5 100 100 50.5 100 100 Như vậy, trong trường hợp này, mặc dù cho dữ liệu đưa vào là 101 số, tuy nhiên ca kiểm thử cũng chỉ thực hiện vòng lặp while 100 lần như lần Test 6 mà thôi. Theo bộ thiết kế kiểm thử, cả 7 test khác nhau đã cho ra các kết quả theo đúng mong đợi. Như vậy, có thể kết luận mô-đun 1 kiểm thử không có lỗi. 3.3.3. Quá trình test với Mô-đun 2 Mô-đun 2 (code_2): “Thủ tục tính giá trị trung bình của 100 số hay ít hơn, nằm giữa các giá trị cận, tính tổng và tổng số phần tử hợp lệ” nhưng có nội dung code khác so với code_1: PROCEDURE average INTERFACE RETURNS average,total.input,total.valid; INTERFACE ACCEPT value,minimum,maximum; TYPE value[1:100] IS SCALAR ARRAY; TYPE average,total.input,total.valid,minimum,maximum,sum IS SCALAR; TYPE i IS INTERGER; i = 1; total.input = 0; total.valid = 0; sum = 0; DOWHILE value[i]<>-999 AND total.input<100 Code_2: total.input = total.input + 1; IF value[i]==minimum AND value[i]<=maximum THEN Begin total.valid = total.valid + 1; sum = sum + value[i]; End ENDIF i = i + 1; ENDDO IF total.valid>0 THEN average = sum / total.valid; ELSE average = -999; ENDIF END average 58 -Với Input TestData: [1,2,3,4,5,-999] 1 10, theo thiết kế ca kiểm thử: Bảng 3.12: Bảng TestData với code_2 Total. Total. Total. Total. Average Average input valid input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 5 [1,2,3,4,5,-999] 1 10 3 5 5 Giao diện xử lý: 59 Hình 3.14: Form xử lý với đơn vị chương trình code_2 Kết quả: Bảng 3.13: Kết quả bảng TestData với code_2 Total. Total. Total. Total. Average Average input valid input valid Đầu ra mong đợi Đầu ra thực tế Số lần Input lặp 5 [1,2,3,4,5,-999] 1 10 3 5 5 1.0 5 1 Nhận xét: Đầu ra mong đợi khác đầu ra thực tế. Điều này chứng tỏ mô- đun được kiểm thử có lỗi. Đã có lỗi ở kết quả đầu ra Average, từ đó người kiểm thử sẽ kiểm duyệt lại đoạn chương trình liên quan đến lệnh Average, và trên nữa là lệnh tính Sum. Qua quá trình kiểm duyệt lại đoạn chương trình nhận thấy quá trình đặt điều kiện trong vòng lặp While đã bị sai do vậy kết quả tính Sum đã sai theo. Người lập trình đã đặt sai điều kiện là giá trị bằng minimum và nhỏ hơn bằng maximum. Vì thế khi tính tổng và đếm giá trị thoả mãn trong đoạn cận thì chương trình chỉ xét những phần tử bằng minimum và nhỏ hơn bằng maximum. Như vậy nhờ vào kỹ thuật kiểm thử theo vòng lặp, mà người kiểm thử (Tester) đã tìm ra được lỗi của đơn vị chương trình, 1 ca kiểm thử đã thành công. 60 Hình 3.15: Lỗi tìm thấy trong mô-đun code_2 3.3.4. Quá trình test với Mô-đun 3 Mở rộng sang bài toán thứ 2: test Mô-đun 3 (Code_3) thực hiện nhiệm vụ: “Thủ tục tính giá trị max của 100 số hay ít hơn, với số lượng các phần tử xác định” PROCEDURE Tim_max INTERFACE RETURNS max; INTERFACE ACCEPT array,num; TYPE array[1:100] IS SCALAR ARRAY; TYPE max,num,tmp,i IS SCALAR; i = 1; tmp = array[1]; DOWHILE i<=num IF array[i]>tmp THEN Begin tmp = array[i]; End ENDIF i = i + 1; Với Code_3 có nội dung code như sau: ENDDO IF num>0 THEN max = tmp; ELSE max = 0; ENDIF END Tim_max 61 Bảng 3.14: Bảng TestData với code_3 3 [1,3,4,8] 3 4 3 4 Với code_3, chương trình kiểm thử phần mềm cũng thực hiện kiểm thử để tính độ phức tạp, ma trận kiểm thử, tập đường cơ bản. Với bộ input nhập vào trong mục Đầu vào hợp lệ theo cấu trúc: [ trị phần tử 1>, [ lượng phần tử xét trong dãy> từ đó đưa ra kết quả Max (Giá trị lớn nhất trong các phần tử được xét của dãy) trong mục Đầu ra và Đường kiểm thử. Hình 3.16: Form kiểm thử ứng với code_3 62 3.3.5. Quá trình test với Mô-đun 4 Mở rộng sang bài toán thứ 3: test Mô-đun 4 (Code_4) thực hiện nhiệm vụ: “Thủ tục tính tổng các số chẵn của 100 số hay ít hơn, với số lượng các phần tử được xác định” PROCEDURE Tinh_tong_cac_so_chan INTERFACE RETURNS sum; INTERFACE ACCEPT array,num; TYPE array[1:100] IS SCALAR ARRAY; TYPE sum,num,tmp IS SCALAR; TYPE i,c IS INTEGER; i = 1; tmp = 0; DOWHILE i<=num c = array[i] % 2; IF c==0 THEN Begin tmp = tmp + array[i]; End ENDIF i = i + 1; ENDDO sum = tmp; END Tinh_tong_cac_so_chan Với Code_4 có nội dung code như sau: Bảng 3.15: Bảng TestData với code_4 6 [4,5,6,7,14,8,22,15,46] 6 10 6 32 63 Với code_4, chương trình kiểm thử phần mềm cũng thực hiện kiểm thử để đưa tính độ phức tạp, ma trận kiểm thử, tập đường cơ bản. Với bộ input nhập vào trong mục Đầu vào hợp lệ theo cấu trúc: [ trị phần tử 1>, [ lượng phần tử xét trong dãy> từ đó đưa ra kết quả Sum (Tổng các số chẵn trong các phần tử được xét của dãy) trong mục Đầu ra và Đường kiểm thử. Hình 3.17: Form kiểm thử ứng với code_4 3.3.6. Kiểm thử vòng lặp While Đối với đơn vị chương trình thứ nhất (có tên code_1) qua áp dụng các bước trong quá trình kiểm thử vòng lặp đơn, nên chương trình kiểm thử ở trên đã đưa ra được 7 đường kiểm thử của đơn vị chương trình với số lần lặp tương ứng số giá trị nhập vào của chương trình thử nghiệm kiểm thử là: 0 giá trị, 1 giá trị, 2 giá trị, m =5 giá trị (0 Đối với đơn vị chương trình thứ hai (có tên code_2), đơn vị chương trình thứ ba (có tên code_3), đơn vị chương trình thứ bốn (có tên code_4) đều thực hiện kiểm thử vòng lặp while thông qua các bộ test từ đó tìm ra các lỗi còn tiềm ẩn trong chương trình để thu được ca kiểm thử thành công. 64 Mặc dù 4 chương trình code thử nghiệm cho chương trình chạy kiểm thử ở dạng đơn giản, nhưng cũng đã làm nổi bật được kỹ thuật ma trận đồ thị trong quá trình xây dựng phần mềm kiểm thử. 3.4. Đánh giá và so sánh kỹ thuật ma trận đồ thị với một số kỹ thuật thiết kế ca kiểm thử khác Kỹ thuật ma trận kiểm thử là một trong những kỹ thuật kiểm thử hộp trắng. Ma trận kiểm thử được sử dụng như một dữ liệu có cấu trúc để kiểm tra các con đường cơ bản: số đường đi qua nút (có thể tính cả trọng số của chúng). Ma trận kiểm thử là một công cụ mạnh trong việc đánh giá cấu trúc điều khiển chương trình. Thứ nhất, về mặt kỹ thuật, kỹ thuật ma trận kiểm thử có những ưu thế nổi trội sau: - So với kỹ thuật đồ thị dòng, tận dụng được những tính năng đặc trưng của kỹ thuật đồ thị dòng là “kiểm thử đường cơ sở”. Chúng ta biết rằng phương pháp đường cơ sở giúp cho người thiết kế trường hợp kiểm thử có thể suy dẫn ra một cách đo độ phức tạp logic của thiết kế thủ tục và dùng cách đo này như một hướng dẫn để xác định một tập cơ sở các đường thực hiện. Các trường hợp kiểm thử được suy dẫn ra để thực hiện một tập cơ sở, được đảm bảo để thực hiện mọi câu lệnh trong chương trình ít nhất một lần trong khi kiểm thử. Mỗi kết cấu có cấu trúc theo triết lý lập trình có cấu trúc như sequence, if, while, until, case đều có một cú pháp đơn giản thể hiện. Như vậy, kỹ thuật ma trận đồ thị thực chất cũng là một kỹ thuật dựa trên cấu trúc điều khiển của chương trình. Từ đó tính được độ phức tạp V(G) và xác định được các đường kiểm thử cụ thể. Bên cạnh đó, kỹ thuật ma trận kiểm thử đã khắc phục được hạn chế rất lớn của kỹ thuật đồ thị dòng là việc xác định miền phẳng kín trên đồ thị dòng 65 rất khó tự động hóa (mặc dù thực hiện bằng tay lại rất trực quan và dễ). Điều này gây trở ngại lớn cho việc lập trình. - So với kỹ thuật điều kiện logic, bao phủ được điều kiện logic, nó đỡ phức tạp hơn vì không phải phân tích các kiểu sai và điều kiện phức hợp cấu thành từ hơn một điều kiện đơn nhờ các toán tử Bool. - So với kỹ thuật kiểm thử phân nhánh, nó vẫn kiểm thử được từng điều kiện trong chương trình. Giống như kiểm thử nhánh, việc thực hiện vẫn theo nguyên tắc: với mỗi điều kiện phức hợp C, thì với mỗi nhánh “true” và “false” của C, mỗi điều kiện đơn trong C phải được kiểm thử ít nhất một lần. - So với kỹ thuật kiểm thử miền, nó cũng quan tâm đến kiểm thử nhánh và toán tử quan hệ, dùng “ràng buộc điều kiện làm điều kiện cần thử” để phát hiện sai ở nhánh và toán tử khi xảy ra 1 lần và không có biến chung. - So với kỹ thuật kiểm thử điều khiển theo dòng dữ liệu, nó duyệt toàn bộ chứ không chỉ tuyển chọn các đoạn đường của chương trình tương ứng nhằm định vị việc xác định biến và sử dụng biến trong chương trình. Với chiến lược theo dòng dữ liệu, chương trình được kiểm soát phần lớn trạng thái. Thứ hai, về mặt thiết kế ca kiểm thử, kỹ thuật ma trận đồ thị dựa vào ý tưởng phương pháp bao phủ câu lệnh bao gồm cả bao phủ quyết định/điều kiện, thực hiện đủ các ca kiểm thử mà mỗi điều kiện trong một quyết định thực hiện trên tất cả các kết quả có thể ít nhất 1 lần và mỗi điểm vào được gọi ít nhất 1 lần, và bao phủ đa điều kiện, viết đủ các ca kiểm thử mà tất cả những sự kết hợp của các kết quả điều kiện có thể trong mỗi quyết định, và tất cả các điểm vào phải được gọi ít nhất 1 lần. So với một số kỹ thuật thiết kế ca kiểm thử khác, nó có những ưu thế nhất định. - So với kỹ thuật phân lớp tương đương, nó không bỏ sót một ca kiểm thử có lợi nào. 66 - So với kỹ thuật phân tích giá trị biên, nó không đòi hỏi yêu cầu óc sáng tạo cao và lượng chuyên môn hóa nhất định cũng như đòi hỏi tính kinh nghiệm cao. - So với kỹ thuật đồ thị nguyên nhân – kết quả, nó không cần khảo sát đầu vào. Việc kiểm tra sự kết hợp đầu vào không phải là một nhiệm vụ đơn giản, thường là rất lớn, dễ có thể dẫn tới việc kiểm thử không có hiệu quả, mất thời gian do số lượng các ca kiểm thử rất lớn. Bên cạnh đó, kỹ thuật đồ thị nguyên nhân – kết quả cũng gặp khó khăn trong việc chuyển đổi đồ thị thành bảng quyết định, tức là không có tính thuật toán, khó có thể tự động hóa nó bằng việc viết một chương trình. - So với kỹ thuật đoán lỗi, nó không yêu cầu một quy trình có tính trực giác cao, không cần liệt kê những trường hợp đặc biệt đó mà có thể đã bị bỏ sót khi chương trình được thiết kế. Tất nhiên mỗi kỹ thuật có thể đóng góp một tập riêng các ca kiểm thử hữu dụng, nhưng không cái nào trong số chúng tự nó đóng góp một tập trọn vẹn các ca kiểm thử. 3.5. Đánh giá kết quả thử nghiệm và hướng mở rộng Kết quả thử nghiệm trình bày ở trên, về cơ bản, đã đáp ứng được mục tiêu đề ra trong luận văn. Phần mềm thử nghiệm đã có thể kiểm thử được nhiều đơn vị chương trình khác nhau Hướng mở rộng: - Phát triển chương trình kết hợp đồ họa vẽ biểu đồ để người dùng dễ hiểu, dễ hình dung. - Thực hiện kiểm thử cho nhiều đơn vị chương trình hơn, với những đơn vị chương trình lớn hơn nữa, và chương trình kiểm thử có thể kiểm thử cho nhiều đơn vị chương trình viết bằng các ngôn ngữ khác nhau. 67 KẾT LUẬN VÀ KIẾN NGHỊ 1. Kết luận Từ việc nghiên cứu tổng quan về kiểm thử phần mềm và kiểm thử hộp trắng để nắm những kiến thức cơ sở về kiểm thử phần mềm nói chung và kiểm thử hộp trắng nói riêng phục vụ các nghiên cứu tiếp theo. Sau đó, em tiến hành nghiên cứu các hướng chính trong phương pháp kiểm thử hộp trắng. Cuối cùng em nghiên cứu một số kỹ thuật chính để thiết kế ca kiểm thử đặc biệt là kỹ thuật ma trận đồ thị cho thiết kế ca kiểm thử và áp dụng kỹ thuật ma trận đồ thị này vào kiểm thử một số chương trình cụ thể. Như vậy với quá trình nghiên cứu ở trên về mặt cơ bản em đã hoàn thành được mục tiêu của đề tài đưa ra. Một số kết quả đạt được như sau: - Nắm được kiến thức cơ bản liên quan đến kiểm thử phần mềm và kiểm thử thộp trắng; - Trình bày một số kỹ thuật chính để thiết kế các ca kiểm thử trong kiểm thử phần mềm; - Lập trình thử nghiệm kỹ thuật ma trận đồ thị cho thiết kế ca kiểm thử từ đó có thể kiểm thử được một số môdun phần mềm. - Báo cáo có thể làm tài liệu tham khảo về lĩnh vực kiểm thử phần mềm, kiểm thử hộp trắng và đặc biệt là kiểm thử bằng kỹ thuật ma trận đồ thị; - Kết quả nghiên cứu có thể làm tiền đề cho các nghiên cứu liên quan khác. 68 2. Kiến nghị Đây là lĩnh vực mới tiếp cận nên trong báo cáo còn một số phần chưa được hoàn thiện, do vậy thời gian tới em sẽ tiếp tục nghiên cứu chuyên sâu hơn và cố gắng xây dựng được chương trình kiểm thử cho nhiều môđun hơn nữa dựa vào kỹ thuật ma trận đồ thị. Trong quá trình làm luận văn, em đã cố gắng rất nhiều, tuy nhiên không tránh khỏi những thiếu sót, em mong rằng sẽ nhận được các ý kiến đóng góp của các Thầy giáo, Cô giáo, các bạn bè, đồng nghiệp để luận văn ngày càng hoàn thiện hơn. 69 TÀI LIỆU THAM KHẢO A.TIẾNG VIỆT [1]. Thạc Bình Cường, Nguyễn Đức Mận (2011), Kiểm thử và đảm bảo chất lượng phần mềm, Nhà xuất bản Bách Khoa Hà Nội. [2]. Chu Thị Minh Huệ, Đặng Đức Hạnh, Nguyễn Ngọc Bình (2015), Phương pháp sinh tự động ca kiểm thử từ mô hình ca sử dụng, Kỷ yếu Hội nghị Quốc gia lần thứ VIII về Nghiên cứu cơ bản và ứng dụng CNTT (FAIR); DOI: 10.15625/vap.2015.000198. [3]. Phạm Ngọc Hùng, Trương Anh Hoàng, Đặng Văn Hưng (2014), Giáo trình kiểm thử phần mềm, Đại học Công nghệ, Đại học Quốc gia Hà Nội [4]. Phạm Thị Hùy (2017), Kỹ thuật xác định các ca kiểm thử, Luận văn Thạc
sỹ CNTT, Đại học Quản lý và Công nghệ Hải Phòng. [5].Tô Hữu Nguyên, Nguyễn Hồng Tân, Hà Thị Thanh, Đỗ Thanh Mai (2016), Thực thi tượng trưng trong sinh tự động dữ liệu kiểm thử phần mềm, Tạp chí Khoa học Đại học Đà Lạt, Tập 6, Số 2, 254–131 254. [6]. Đỗ Văn Nhỏ, Nguyễn Quang Vũ, Nguyễn Thanh Bình (2017), Kiểm thử đột biến bậc cao: hiệu quả và những vấn đề tồn tại, Kỷ yếu Hội nghị Quốc gia lần thứ X về Nghiên cứu cơ bản và ứng dụng CNTT (FAIR), Đà Nẵng, ngày17-18/08/2017.DOI:10.15625/vap.2017.00040. [7]. Lê Văn Phùng (2014), Kỹ nghệ phần mềm, tái bản lần 1, Nhà xuất bản Thông tin và Truyền thông. [8]. Lê Văn Phùng (2015), Kỹ nghệ phần mềm nâng cao, tái bản lần 1, Nhà xuất bản Thông tin và Truyền thông. [9]. Lê Văn Phùng, Nguyễn Văn Tảo (2018), Giáo trình Công nghệ phần mềm nâng cao, Nhà xuất bản Đại học Thái Nguyên. [10]. Nguyễn Thị Tính (2016), Các phương pháp đánh giá chất lượng phần mềm, Luận văn Thạc sỹ CNTT, Đại học CNTT&TT, Đại học Thái Nguyên. 70 [11]. Nguyên Thị Yên (2016), Các kỹ thuật trong kiểm thử dòng dữ liệu tĩnh, Luận văn thạc sỹ Kỹ thuật phần mềm, Đại học Công nghệ, Đại học quốc gia Hà Nội. B.TIẾNG ANH [12] L. Madeyski, W. Orzeszyna, R. Torkar, and M. Józala (2014). Overcoming the equivalent mutant problem: A systematic literature review and a comparative experiment of second order mutation. IEEE Transactionson Software Engineering, 40 (1):23-42. [13]. Quang Vu Nguyen and L. Madeyski (2015), Searching for strongly subsuming higher order mutants by applying multiobjective optimization algorithm. Advanced Computational Methods for Knowledge Engineering , Advances in Intelligent Systemsand Computing, 358:391-402. [14]. Quang Vu Nguyen and L. Madeyski (2017), Addressing mutation testing problems by applying multi-objective optimization algorithms and higher order mutation. Journal of Intelligent & Fuzzy Systems, vol. 32, No 2, pp. 1173-1182, 2017. [15]. Roger S.Pressman (1992). Software Engineering, a Practitioner’s Approach. 3th Edition, McGraw-Hill, Inc.Vòng lặp nối tiếp nhau
Vòng lặp đơn giản
Vòng lặp không cấu trúc
Vòng lặp lồng
nhau
Điểm kết thúc
Điểm quyết định
Điểm nối
switch
Tuần tự
Rẽ nhánh
While c do …
do … while c
1
Float foo (int a, int b, int c, int d) {
2
3
1. Float e;
2. If (a==0)
4
3. Return 0;
5
6
7,8
4. Int x = 0;
5. If ((a==b) || (c==d))
6. x = 1;
7. e = 1/x;
8. return e;
}
Chương trình gốc P
Đột biến P’
Đột biến P’’
E = số cung; N = số nút; P= số nút vị tự
Với ví dụ về đồ thị dòng ở trên ta có: V(G) = 4 do đồ thị dòng chia mặt
PROCEDURE average;
END average
Số lần lặp
Input
Tổng số phần tử của dãy Số lượng phần tử xét Output(Max)
Số lần
Tổng số phần tử
Số lượng phần
Output
Input
lặp
của dãy
tử xét
(Sum)