ĐẠ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]:

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

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 kết thúc

Điểm quyết định

Điểm nối

Đ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.

switch

Tuần tự

Rẽ nhánh

While c do …

do … while c

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

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; }

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

Chương trình gốc P

Đột biến P’

Đột biến P’’

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 y) if (x <= y)

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:

E = số cung; N = số nút; P= số nút vị tự

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

Với ví dụ về đồ thị dòng ở trên ta có: V(G) = 4 do đồ thị dòng chia mặt

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]:

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;

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

END average

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

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)

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>, [,[…]<1 dấu cách>

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

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)

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>, [,[…]<1 dấu cách>

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.