1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó

76 378 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 76
Dung lượng 5,09 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Hai phương pháp phổ biến nhất áp dụng trong mức kiểm thử đơn vị là kiểm thử dòng điều khiển và kiểm thử dòng dữ liệu, tuy nhiên hai phương pháp này không xác định các kiểu của lỗi một cá

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Trang 2

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN

NGƯỜI HƯỚNG DẪN KHOA HỌC: TS ĐẶNG VĂN HƯNG

HÀ NỘI - 2014

Trang 3

LỜI CAM ĐOAN

Tôi xin cam đoan kết quả đạt được trong luận văn là sản phẩm nghiên cứu, tìm hiểu của riêng cá nhân tôi Trong toàn bộ nội dung của luận văn, những điều được trình bày hoặc là của cá nhân tôi hoặc là được tổng hợp từ nhiều nguồn tài liệu Tất cả các tài liệu tham khảo đều có xuất xứ rõ ràng và được trích dẫn hợp pháp

Tôi xin hoàn toàn chịu trách nhiệm và chịu mọi hình thức kỷ luật theo quy định cho lời cam đoan của mình

Hà Nội, ngày 11 tháng 06 năm 2014

Người cam đoan

Trần Văn Trọng

Trang 4

LỜI CẢM ƠN

Sau thời gian học tập nghiên cứu và rèn luyện tại trường Đại học Công nghệ - Đại học Quốc gia Hà Nội, em đã học hỏi được thêm nhiều kiến thức cũng như những kỹ năng góp phần hỗ trợ tốt trong công việc của mình Đến nay em đã hoàn thành chương trình đào tạo và luận văn tốt nghiệp của mình

Em xin chân thành cảm ơn Ban giám hiệu nhà trường đã quan tâm tạo điều kiện thuận lợi để chúng em học tập trong suốt quãng thời gian tại trường

Xin chân thành cảm ơn các Thầy, Cô giáo trong khoa Công nghệ thông tin nói riêng và thầy cô giáo các khoa trong trường nói chung đã luôn nhiệt tình giúp đỡ và tạo điều kiện tốt nhất cho em trong suốt quá trình học tập tại trường

Em xin chân thành cảm ơn TS Đặng Văn Hưng là cán bộ giảng viên của trường Đại học Công Nghệ đã tận tình giúp đỡ em về cả chuyên môn, nghiên cứu và định hướng phát triển trong suốt quá trình làm luận văn

Xin chân thành cảm ơn các bạn học viên khóa K18 – những người bạn thân thiện, nhiệt tình giúp đỡ và chia sẻ cho tôi kinh nghiệm trong công việc, học tập cũng như trong cuộc sống trong suốt thời gian học tập cùng nhau

Cuối cùng, với gia đình, con xin gửi lời biết ơn sâu sắc vì gia đình đã luôn ở bên

và ủng hộ con trên con đường học tập và nghiên cứu khó khăn, vất vả của mình

Hà Nội, ngày 11 tháng 06 năm 2014

Học viên

Trần Văn Trọng

Trang 5

MỤC LỤC

LỜI CAM ĐOAN 3

LỜI CẢM ƠN 4

MỤC LỤC 5

DANH MỤC CÁC BẢNG BIỂU 7

DANH MỤC CÁC HÌNH VẼ 9

LỜI MỞ ĐẦU 11

Chương 1 LÝ THUYẾT VỀ KIỂM THỬ MIỀN 15

1.1 Khái quát kiểm thử đơn vị 15

1.1.1 Kiểm thử dòng điều khiển 15

1.1.2 Kiểm thử dòng dữ liệu 19

1.1.3 Kiểm thử miền 21

1.2 Kiểm thử miền 22

1.2.1 Khái niệm về lỗi miền 22

1.2.2 Xây dựng các miền kiểm thử từ chương trình 25

1.2.3 Các kiểu xuất hiện của lỗi miền 29

1.2.4 Xây dựng các điểm kiểm tra ON và OFF trong kiểm thử miền 33

1.2.5 Xây dựng các chiến lược lựa chọn ca kiểm thử 36

Chương 2: CÁC KỸ THUẬT CẢI TIẾN KIỂM THỬ MIỀN 45

2.1 Cải tiến kỹ thuật lựa chọn điểm ON và OFF từ phương pháp cơ bản 45

2.2 Xây dựng chiến lược bổ sung cho kiểm thử miền 50

2.2.1 Phân tích lỗi tiềm ẩn của chiến lược kiểm thử miền Nx1 50

2.2.2 Chiến lược thay thế chiến lược kiểm tra miền Nx1 51

2.3 Đơn giản hóa kỹ thuật kiểm thử miền 51

Chương 3: THỰC NGHIỆM KIỂM THỬ MIỀN 60

3.1 Mô tả bài toán 60

3.2 Xây dựng các ca kiểm thử với phương pháp kiểm thử miền 61

3.2.1 Xác định các miền từ mã nguồn chương trình 61

Trang 6

3.2.2 Xây dựng các ca kiểm thử cho từng miền 63

3.3 Ứng dụng các ca kiểm thử có được từ phương pháp kiểm thử miền để kiểm tra tính chính xác của phần mềm 67

3.3.1 Kiểm thử với mô-đun “Mô-đun xét trúng tuyển 01” 68

3.3.2 Kiểm thử với mô-đun “Mô-đun xét trúng tuyển 02” 68

3.4 Xây dựng các ca kiểm thử với phương pháp dòng điều khiển 69

3.5 Ứng dụng các ca kiểm thử có được từ phương pháp kiểm thử dòng điều khiển để kiểm tra tính chính xác của phần mềm 72

3.5.1 Kiểm thử với mô-đun “Mô-đun xét trúng tuyển 01” 72

3.5.2 Kiểm thử với mô-đun “Mô-đun xét trúng tuyển 02” 72

3.6 Kết luận 73

KẾT LUẬN VÀ ĐỊNH HƯỚNG NGHIÊN CỨU 74

1 Các kết quả đạt được: 74

2 Định hướng phát triển: 74

TÀI LIỆU THAM KHẢO 76

Trang 7

DANH MỤC CÁC BẢNG BIỂU

Bảng 1.1: Hàm tính trung bình cộng cho các số lẻ < 100 17

Bảng 1.2: Danh sách các ca kiểm thử cho ví dụ về kiểm thử dòng điều khiển 18

Bảng 1.3: Danh sách các ca kiểm thử cho ví dụ về kiểm thử dòng dữ liệu 21

Bảng 1.4: Mã chương trình tính điểm trung bình toán và văn 23

Bảng 1.5: Mã chương trình codedomain 25

Bảng 1.6: Hai giải thích của tuyên bố if() thứ 2 trong hình 1.7 27

Bảng 1.7: Hàm tính điểm tổng kết môn học trong ví dụ 05 29

Bảng 1.8: Các vị từ định nghĩa trong miền TT trong Hình 1.8 29

Bảng 1.9: Phát hiện lỗi khi biên dịch chuyển làm giảm đi độ lớn miền xét (Closed Inequality) 37

Bảng 1.10: Phát hiện lỗi khi biên dịch chuyển làm tăng độ lớn miền xét (Closed Inequality) 39

Bảng 1.11: Phát hiện lỗi nghiêng biên (Closed Inequality) 40

Bảng 1.12: Phát hiện lỗi đóng biên (Closed Inequality) 40

Bảng 1.13: Phát hiện lỗi khi biên dịch chuyển làm giảm đi độ lớn miền (Open Inequality) 41

Bảng 1.14: Phát hiện lỗi khi biên dịch chuyển làm tăng độ lớn miền xét (Open Inequality) 42

Bảng 1.15: Phát hiện lỗi khi nghiêng biên (Open Inequality) 43

Bảng 1.16: Phát hiện lỗi khi xảy ra lỗi đóng biên (Open Inequality) 44

Bảng 2.1: Chương trình mô tả Ví dụ 06 53

Bảng 2.2: Các ca kiểm thử cho kết quả tốt nghiệp trong trường hợp điểm nghề <8 55

Bảng 2.3: Quan hệ tương tác giữa các biến của chương trình 56

Bảng 2.4: Các ca kiểm thử cho kết quả tốt nghiệp trong trường hợp điểm nghề <8 với hai biến X và Y 57

Bảng 2.5: Các ca kiểm thử cho kết quả tốt nghiệp trong trường hợp điểm nghề <8 với biến Z 58

Bảng 2.6: Các ca kiểm thử cho kết quả tốt nghiệp trong trường hợp điểm nghề <8 với phương pháp mới 58

Bảng 3.1: Chương trình xét tuyển cấp 3 60

Bảng 3.2: Các ca kiểm thử cho miền D1 tương ứng với biên EK 65

Bảng 3.3: Các ca kiểm thử cho miền D1 tương ứng với biên KH 66

Trang 8

Bảng 3.4: Các ca kiểm thử cho miền D1 tương ứng với biên HE 66

Bảng 3.5: Danh sách các ca kiểm thử cho miền D1 67

Bảng 3.6: So sánh kết quả thực nghiệm các ca kiểm thử trong mô-đun 1 68

Bảng 3.7: So sánh kết quả thực nghiệm các ca kiểm thử trong mô-đun 2 69

Bảng 3.8: Danh sách các đường đi đảm bảo độ phủ cho độ đo cấp 3 của bài toán trong Phần 3.1 71

Bảng 3.9: Danh sách các ca kiểm thử cho độ đo cấp 3 của bài toán trong Phần 3.1 71

Bảng 3.10: So sánh kết quả thực nghiệm các ca kiểm thử có được từ phương pháp kiểm thử dòng điều khiển trong mô-đun 1 72

Bảng 3.11: So sánh kết quả thực nghiệm các ca kiểm thử có được từ phương pháp kiểm thử dòng điều khiển trong mô-đun 2 72

Trang 9

DANH MỤC CÁC HÌNH VẼ

Hình 1.1: Các thành phần cơ bản của đồ thị chương trình 16

Hình 1.2: Các cấu trúc điều khiển phổ biến của chương trình 16

Hình 1.3: Ví dụ về biểu đồ cho kiểm thử dòng kiều khiển 18

Hình 1.4: Ví dụ biểu đồ cho kiểm thử dòng dữ liệu 20

Hình 1.5: Cấu trúc tổng quát của một chương trình 24

Hình 1.6: Phân loại miền đầu vào của chương trình 24

Hình 1.7: Đồ thị dòng điều khiển mô tả các chức năng trong Bảng 1.5 26

Hình 1.8: Các miền thu được từ các giải thích vị từ trong hình 1.7 28

Hình 1.9: Miền vào cho chương trình ở Bảng 1.7 29

Hình 1.10: Các dạng miền và biên trong kiểm thử miền 30

Hình 1.11: Minh họa cho lỗi đóng biên 31

Hình 1.12: Minh họa cho lỗi dịch chuyển biên 32

Hình 1.13: Minh họa cho lỗi nghiêng biên 32

Hình 1.14: Điểm ON và OF 35

Hình 1.15: Biên dịch chuyển làm giảm đi độ lớn miền xét (closed inequality) 37

Hình 1.16: Biên dịch chuyển làm tăng độ lớn miền xét (closed inequality) 38

Hình 1.17: Biên nghiêng (closed inequality) 39

Hình 1.18: Lỗi đóng biên (closed inequality) 40

Hình 1.19: Biên dịch chuyển làm giảm đi độ lớn miền xét (open inequality) 41

Hình 1.20: Biên dịch chuyển làm tăng độ lớn miền xét (open inequality) 42

Hình 1.21: Lỗi nghiêng biên (open inequality) 43

Hình 1.22: Lỗi đóng biên (open inequality) 43

Hình 1.23: Biên bình đẳng 44

Hình 2.1: Các trường hợp phỏng đoán của biên dự kiến 45

Hình 2.2: Lựa chọn điểm ON trong trường hợp lỗi dịch chuyển biên 46

Hình 2.3: Lựa chọn điểm ON trong trường hợp lỗi nghiêng biên 47

Hình 2.4: Lựa chọn điểm ON trong trường hợp lỗi đóng biên 48

Hình 2.5: Lựa chọn điểm OFF trong trường hợp lỗi dịch chuyển biên 49

Hình 2.6: Lựa chọn điểm OFF trong trường hợp lỗi nghiêng biên 49

Hình 2.7: Lỗi nghiêng biên tạo ra miền lỗi vô hạn 50

Hình 2.8: Chiến lược kiểm thử miền 2x2 51

Hình 2.9: Biểu đồ dòng điều khiển cấp 3 của Ví dụ 06 54

Trang 10

Hình 2.10: Các miền đầu vào của chương trình trong Ví dụ 06 khi điểm nghề <8 55

Hình 2.11: Các miền đầu vào của chương trình xét với hai biến X và Y trong Ví dụ 06 khi điểm nghề <8 57

Hình 2.12: Các miền đầu vào của chương trình xét với biến Z trong Ví dụ 06 khi điểm nghề <8 58

Hình 3.1: Biểu đồ dòng điều khiển của chương trình xét tuyển cấp 3 62

Hình 3.2: Các miền đầu vào của chương trình 63

Hình 3.3: Xác định điểm ON và OFF trên biên EK cho miền D1 64

Hình 3.4: Xác định điểm ON và OFF trên biên KH cho miền D1 65

Hình 3.5: Xác định điểm ON và OFF trên biên HE cho miền D1 66

Hình 3.6: Giao diện chương trình xét điểm tuyển sinh 67

Hình 3.7: Tạo ra lỗi trong chương trình xét tuyển cấp 3 ở Phần 3.1 68

Hình 3.8: Lỗi dịch chuyển biên tạo ra trong đoạn code của hình 3.7 69

Hình 3.9: Sơ đồ dòng điều khiển ứng với độ đo cấp 3 của bài toán 70

Trang 11

LỜI MỞ ĐẦU

Cơ sở khoa học và thực tiễn của đề tài

Ngày nay, cùng với xu hướng công nghệ thông tin toàn cầu hóa, không chỉ trên thế giới mà ngay tại trong nước, việc xuất hiện các công ty sản xuất phần mềm đã không còn xa lạ Tuy nhiên có thể đánh giá một cách khách quan rằng thị trường công nghệ phần mềm trong nước ta còn chưa cao, hệ thống phần mềm được xây dựng trong nước

đã khá phong phú nhưng hầu như chỉ tập trung ở việc phục vụ những nhu cầu dịch vụ vừa và nhỏ cho hoạt động xã hội Lý do rất đơn giản là sản phầm của chúng ta chưa thực sự đạt được chất lượng cũng như độ tin cậy cho khách hàng, một phần lớn cho lý

do này chính là ở việc các phần mềm được sản xuất ồ ạt tuy nhiên đều bị coi nhẹ khâu

kiểm thử

Tại nước ngoài, trong quá trình sản xuất phần mềm họ luôn coi trọng khâu kiểm thử, có những phần mềm quan trọng chi phí cho việc kiểm thử có thể tăng lên gấp đôi gấp ba so với chi phí cho việc thiết kế xây dựng phần mềm

Một nghiên cứu được tiến hành bởi NIST trong năm 2002 cho biết rằng các lỗi phần mềm gây tổn thất cho nền kinh tế Mỹ 59,5 tỷ đô mỗi năm, hơn một phần ba chi phí này có thể tránh được nếu việc kiểm thử phần mềm được thực hiện tốt hơn [4] Đứng trước thực trạng như hiện nay, việc cần làm nhất để cải thiện chất lượng phần mềm trong nước là phải chú trọng hơn vào khâu kiểm thử phần mềm Tuy nhiên việc đào tạo về kiểm thử phần mềm trong nước còn chưa thực sự được quan tâm Theo IEEE (Institute of Electrical and Electronics Engineers): kiểm thử là tiến trình vận hành hệ thống hoặc thành phần dưới những điều kiện xác định, quan sát hoặc ghi nhận kết quả và đưa ra đánh giá về hệ thống hoặc thành phần đó

Tuy nhiên một trong những vấn đề với kiểm thử phần mềm là thực tế nó không thể đạt được việc kiểm thử trọn vẹn hoặc toàn diện trên mọi khía cạnh Việc kiểm thử toàn diện hoặc trọn vẹn là không thể vì:

- Miền của đầu vào có thể là quá lớn

- Có quá nhiều nhánh để kiểm tra trong chương trình

- Có quá nhiều sự kết hợp của dữ liệu để kiểm tra

- Cõ lỗi giao diện người sử dụng, cấu hình và khả năng tương thích thất bại, và nhiều kích thước khác nhau của việc phân tích

Kiểm thử hiện nay vô cùng đa dạng cả về phương pháp kiểm thử cũng như mức kiểm thử Xét về phương diện mức kiểm thử cũng bao gồm nhiều mức khác nhau: kiểm thử đơn vị, kiểm thử tích hợp, kiểm thử hệ thống và kiểm thử mức chấp nhận

Trang 12

Trong đó khâu kiểm thử đơn vị đóng vai trò vô cùng quan trọng và là khâu đầu tiên trong quá trình kiểm thử

Kiểm thử đơn vị hay còn được gọi là kiểm thử thành phần, đề cập đến việc kiểm thử chức năng từng phần của mã, thường ở mức độ chức năng Trong một môi trường hướng về đối tượng thì điều này thường là cấp độ lớp, và các kiểm thử đơn vị tối thiểu bao gồm hàm dựng và hàm hủy Nhiều loại kiểm thử được viết bởi các nhà phát triển như họ làm việc trong mã (kiểu hộp trắng) để đảm bảo rằng từng hàm riêng biệt hoạt động đúng như kỳ vọng Một hàm có thể có nhiều kiểm thử từ đó giúp nắm bắt được các trường hợp góc hoặc các nhánh trong mã nguồn Kiểm thử đơn vị một mình không thể đảm bảo hết được từng chức năng của từng bộ phận trong phần phềm nhưng nó được sử dụng để đảm bảo rằng các khối kiến trúc của phần mềm hoạt động độc lập với nhau

Kiểm thử đơn vị là một quá trình phát triển phần mềm có liên quan đến ứng dụng đồng bộ của một loạt các chiến lược phòng ngừa phát hiện lỗi và để giảm thiểu rủi ro, thời gian và chi phí Nó được thực hiện bởi kỹ sư hay nhà phát triển trong suốt giai đoạn xây dựng của vòng đời phát triển phần mềm Không chỉ tập trung vào việc đảm bảo chất lượng truyền thống mà phải gia tăng nó lên vì thế kiểm thử đơn vị có mục đích loại bỏ những lỗi cấu trúc trước khi mã hóa rồi mới thúc đẩy việc quản lý chất lượng Chiến lược này nhằm nâng cao chất lượng cũng như hiệu quả của phần mềm trong tiến trình quản lý và phát triển chung

Hai phương pháp phổ biến nhất áp dụng trong mức kiểm thử đơn vị là kiểm thử dòng điều khiển và kiểm thử dòng dữ liệu, tuy nhiên hai phương pháp này không xác định các kiểu của lỗi một cách rõ ràng để xem xét và phát hiện Một phương pháp khá phổ biến khác cũng áp dụng cho mức kiểm thử đơn vị là kiểm thử miền, trong kiểm thử miền có cơ chế kiểm thử khá chi tiết, một loại lỗi được gọi là lỗi miền được định nghĩa và sau đó dữ liệu kiểm tra được xác định để bắt những lỗi đó Hiện nay kỹ thuật kiểm thử miền trên thế giới được nghiên cứu khá nhiều, còn tại VN thì hầu như chưa

có công trình chính thức nào nghiên cứu về kỹ thuật này

Kiểm thử miền lần đầu tiên được đề xuất bởi White và Cohen vào năm 1978, sau

đó nó đã được phân tích và mở rộng theo nhiều cách Năm 1982, Clarke, Hassell, và Richardson [3] đưa ra một số lỗi không bị phát hiện bởi chiến lược của White và Cohen Sau đó họ đề xuất một chiến lược có tên là chiến lược V × V để cải thiện kiểm thử miền, trong đó nếu một ranh giới miền được xem xét bao gồm V đỉnh thì chiến lược V × V chọn V điểm ON và V điểm OFF

Trang 13

Bên cạnh đó cũng có một số công trình nghiên cứu xoay quanh việc phân tích các

vị từ đề tìm ra phương pháp kiểm thử hiệu quả thông qua các kỹ thuật lựa chọn điểm

ON và điểm OFF hợp lý cho từng trường hợp cụ thể

Tại hội nghị VISTACON tổ chức vào năm 2010, kiểm thử miền cũng được giới thiệu ở Việt Nam chính thức qua bài giới thiệu tổng quan của Cem Kaner [6] Tuy nhiên tại hội nghị cũng chỉ đề cập đến những vấn đề rất chung chung trong kiểm thử miền chứ chưa đi vào phân tích chi tiết và các kỹ thuật để nâng cao hiệu quả cũng như đơn giản hóa trong quá trình tiến hành kiểm thử

Mục tiêu luận văn

Khái niệm cơ bản về kiểm thử miền là bạn có một miền giá trị rất lớn có thể có cho một biến của một chương trình, do đó bạn cần chia nhỏ nó ra thành các tập con tương đương theo nghĩa mỗi miền tương ứng với một nhánh của chương trình Các miền này được biểu diễn như các miền giới hạn bởi các đồ thị của các hàm số trong không gian n chiều Việc biểu diễn sai các hàm này dẫn đến lỗi miền, tức là dữ liệu trong miền không tương ứng với nhánh chương trình mong muốn của miền Tìm các

ca kiểm thử để phát hiện các lỗi miền là nhiệm vụ của kiểm thử miền

Mục tiêu nghiên cứu:

- Đề tài tập trung vào việc nghiên cứu các kỹ thuật chia nhỏ miền giá trị cho các biến số đầu vào của chương trình và tìm các ca kiểm thử đối với các lỗi miền hay gặp

- Tìm hiểu, nghiên cứu các kỹ thuật sinh ca kiểm thử cho kiểm thử miền

- Từ các kỹ thuật đã có và được nghiên cứu, tìm hiểu đánh giá và cái tiến trong các kỹ thuật phục vụ cho việc sinh ca kiểm thử tối ưu hơn

- Đề xuất ra chiến lược phù hợp giúp đơn giản hóa kiểm thử miền và nâng cao hiệu quả áp dụng kiểm thử miền trong quá trình kiểm thử

- Quá trình nghiên cứu hy vọng sẽ là một tài liệu tốt hỗ trợ cho việc đào tạo về kiểm thử miền trong nước

Phương pháp và phạm vi nghiên cứu của luận văn

Với tính chất luận văn là một đề tài thiên về nghiên cứu các kỹ thuật mới trong kiểm thử Luận văn sẽ tìm hiểu các kỹ thuật cơ bản nhất trong kiểm thử miền được đề xuất từ các công trình nghiên cứu trên thế giới Từ đó trích rút để xây dựng thành bộ tài liệu tiếng việt cho người việt

Bên cạnh đó cần tìm hiểu các kỹ thuật để giúp cải tiến chất lượng các ca kiểm thử được tìm ra nhằm nâng cao khả năng ứng dụng của mỗi ca kiểm thử Ngoài ra luận

Trang 14

văn cũng cần phải xây dựng được chiến lược mới áp dụng kết hợp với kiểm thử miền giúp giải quyết các trường hợp phúc tạp của chương trình

Dựa vào số lượng các biến quan hệ trong một vị từ là một biến, hai biến hay ba biến mà ta quy việc xác định các miền cho chương trình trong không gian một chiều, hai chiều hay ba chiều Tuy nhiên khi số biến quan hệ nhau gia tăng lên đến hơn 4 biến

và các vị từ là các hàm phi tuyến tình thì việc xác định miền trở nên phức tạp hơn trong không gian 4 chiều, năm chiều Do đó để đảm bảo chất lượng luận văn nên các trường hợp này không đề cập đến

Luận văn nghiên cứu nên sau quá trình tìm hiểu cần xây dựng các ví dụ chương trình cụ thể ở mức cơ bản áp dụng lý thuyết để đảm bảo tính chất nắm vững kỹ thuật giúp cho người đọc dễ hình dung tổng thể về kiểm thử miền

Nội dung luận văn

Luận văn cần toát lên được mục tiêu của nó, lý do lựa chọn hướng nghiên cứu và kết quả đã đạt được Nội dung bao gồm:

- Mở đầu: đặt vấn đề, đưa ra mục tiêu và các kết quả mong muốn cần đạt được

sau quá trình nghiên cứu

- Chương 1: Lý thuyết về kiểm thử miền: giới thiệu tổng quan về kiểm thử đơn

vị và tóm tắt ba phương pháp kiểm thử đơn vị động Nghiên cứu về các lý thuyết kiểm thử miền cơ bản

- Chương 2: Các kỹ thuật cải tiến kiểm thử miền: nghiên cứu các cải tiến cho

kiểm thử miền nhằm nâng cao chất lượng của các ca kiểm thử cũng như đơn giản hóa việc kiểm thử miền trong các trường hợp phát sinh phức tạp

- Chương 3: Thực nghiệm kiểm thử miền: xây dựng ví dụ áp dụng các kỹ thuật

đã nghiên cứu về kiểm thử miền, và chứng minh thực nghiệm về hiệu quả của các ca kiểm thử

- Kết luận và định hướng: Tổng kết lại nội dung đã nghiên cứu Đưa ra hướng

phát triển trong tương lai

Trang 15

Chương 1 LÝ THUYẾT VỀ KIỂM THỬ MIỀN

1.1 Khái quát kiểm thử đơn vị

Kiểm thử đơn vị [1] là việc kiểm thử các đơn vị của chương trình một cách độc lập Trong đó một đơn vị chương trình thường là một đoạn mã nguồn có thể là hàm hoặc phương thức của một lớp nào đó, có thể được gọi từ ngoài, và cũng có thể gọi đến các đơn vị chương trình khác Mỗi đơn vị chương trình cần được kiểm thử riêng biệt để phát hiện lỗi trong bên trong nó và khắc phục trước khi được tích hợp với các đơn vị khác Kiểm thử đơn vị thường được làm bởi chính tác giả của chương trình Hai kỹ thuật kiểm thử phổ biến nhất đang được áp dụng cho kiểm thử đơn vị hiện nay trong nước là kiểm thử dòng điều khiển và kiểm thử dòng dữ liệu Cả hai kỹ thuật này đều được tiến hành theo phương pháp kiểm thử hộp trắng Chúng sử dụng các chiến lược cụ thể và mã nguồn để kiểm tra xem từng đơ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 hay kiểm thử hàm/chức năng 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 từng đơn vị chương trình Để

áp dụng các phương pháp kiểm thử hộp trắng, người kiểm thử đòi hỏi cần phải hiểu rõ giải thuật và cần có các kỹ năng, 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 mới có thể hiểu rõ mã nguồn của chương trình được kiểm thử

1.1.1 Kiểm thử dòng điều khiển

Theo [1] thì Phương pháp kiểm thử dòng điều khiển xây dựng dựa trên khái niệm

đồ thị dòng điều khiển (control flow graph) Trong đó đồ thị dòng điều khiển được xây dựng từ mã nguồn của chương trình Đồ thị dòng điều khiển là một đồ thị có hướng bao gồm các đỉnh đồ thị tương ứng với các câu lệnh/nhóm câu lệnh và các cạnh chính

là các dòng điều khiển giữa các câu lệnh/nhóm câu lệnh Ta giả sử nếu i và j là các đỉnh của đồ thị dòng điều khiển thì khi đó sẽ 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

Hình 1.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 xuất phát 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)

Trang 16

Hình 1.1: Các thành phần cơ bản của đồ thị chương trình 1

Hình 1.2 mô tả các cấu trúc điều khiển phổ biến của chương trình 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

Hình 1.2: Các cấu trúc điều khiển phổ biến của chương trình 2

Kiểm thử dòng điều khiển cho phép phát hiện ra các lỗi tiềm ẩn trong chương trình bằng cách kiểm thử các đường đi của chương trình tương ứng với các dòng điều khiển

có thể có Kỹ thuật kiểm thử dòng điều khiển được phân cấp ra thành các độ đo khác nhau từ đơn giản đến phức tạp tương ứng với các đồ thị cụ thể Từ đồ thị thu được sẽ sinh ra các đường đi của chương trình Thông qua mỗi đường đi sẽ sinh ra một ca kiểm thử đáp ứng đường đi đó Người kiểm thử cần phải chọn một bộ đầu vào thỏa mãn các điểm quyết định có trong đường đi tương ứng của đồ thị Giá trị đầu ra mong muốn ứng với mỗi bộ đầu vào của mỗi ca kiểm thử cũng được tính toán Việc này thường đòi hỏi người thực hiện phải có kỹ năng phân tích chương trình mới thực hiện được Khi một lỗi được phát hiện bởi một ca kiểm thử nào đó, nó sẽ được thông báo tới lập trình viên để tiến hành sửa lỗi đã phát hiện

Trang 17

- Độ đo kiểm thử cấp 2 (C2): các điểm quyết định trong đồ thị dòng điều khiển của đơn vị kiểm thử đều được thực hiện ít nhất một lần cả hai nhánh đúng và sai

- Độ đo kiểm thử cấp 3 (C3): các điều kiện con thuộc các điều kiện phức tạp tương ứng với các điểm quyết định trong đồ thị dòng điều khiển của đơn vị cần kiểm thử đều được thực hiện ít nhất một lần cả hai nhánh đúng và sai

*) Ví dụ 01: Xây dựng hàm cho nhập vào một mảng n phần tử, tính trung bình cộng

các phần tử là số lẻ trong mảng nhỏ hơn 100 và trả lại kết quả cho giá trị hàm

Trang 18

Hình 1.3: Ví dụ về biểu đồ cho kiểm thử dòng kiều khiển

Từ danh sách các trạng thái ta xác định đƣợc các ca kiểm thử nhƣ trong Bảng 1.2

Bảng 1.2: Danh sách các ca kiểm thử cho ví dụ về kiểm thử dòng điều khiển

{ 5, 7, 8,1, 9,105,4} 5,5

Trang 19

Việc áp dụng phương pháp kiểm thử dòng điều khiển là khó và tốn kém hơn các phương pháp kiểm thử hộp đen khác (phân hoạch tương đương, phân tích giá trị biên, bảng quyết định, ) Để áp dụng kỹ thuât này cần đội ngũ nhân lực về kiểm thử có kiến thức, kỹ năng tốt Ngoài ra cần chi phí lớn đầu tư cho các nguồn lực khác (tài chính, thời gian, ) mới có thể thực hiện tốt phương pháp này Đây cũng có thể coi là yêu cầu chung đối với các phương pháp kiểm thử hộp trắng

1.1.2 Kiểm thử dòng dữ liệu

Kỹ thuật kiểm thử dòng dữ liệu xem đơn vị chương trình gồm các đường đi tương ứng với các dòng dữ liệu, nơi mà các biến được khai báo, được gán giá trị, được sử dụng để tính toán và trả lại kết quả mong muốn của đơn vị chương trình ứng với đường đi này Với mỗi đường đi, người kiểm thử sẽ sinh một ca kiểm thử để kiểm tra tính đúng đắn của nó Cũng theo [1] thì quá trình kiểm thử dòng dữ liệu được chia thành hai pha riêng biệt: kiểm thử dòng dữ liệu tĩnh (static data flow testing) và kiểm thử dòng dữ liệu động (dynamic data flow testing) Với kiểm thử dòng dữ liệu tĩnh, chúng ta áp dụng các phương pháp phân tích mã nguồn mà không cần chạy chương trình nhằm phát hiện các vấn đề về khai báo, khởi tạo giá trị cho các biến và sử dụng chúng Còn trong trường hợp với kiểm thử với dòng dữ liệu động, chúng ta sẽ phải chạy các ca kiểm thử để nhằm phát hiện các lỗi tiềm ẩn mà kiểm thử tĩnh không phát hiện được

Tuy nhiên kiểm thử dòng dữ liệu tĩnh thường không hiệu quả vì nó không đảm bảo việc phát hiện tất cả các lỗi liên quan đến việc khởi tạo, gán giá trị mới và sử dụng các biến (trong các câu lệnh tính toán và các biểu thức điều kiện như trong các lệnh rẽ nhánh và lặp) Nên nó chỉ được xem như một bước tiền xử lý mã nguồn trước khi áp dụng phương pháp kiểm thử dòng dữ liệu động Do đó ta sẽ chỉ tìm hiểu qua về kiểm thử dòng dữ liệu động trong phạm vị của luận văn

Định nghĩa về đồ thị dòng dữ liệu từ tài liệu [1]:

"Đồ thị dòng dữ liệu của một chương trình/đơn vị chương trình là một đồ thị có hướng G = <N, E>, với:

- N là tập các đỉnh tương ứng với các câu lệnh def hoặc c-use của các biến được sử dụng trong đơn vị chương trình Đồ thị G có hai đỉnh đặc biệt là đỉnh bắt đầu (tương ứng với lệnh def của các biến tham số) và đỉnh kết thúc đơn vị chương trình

- E là tập các cạnh tương ứng với các câu lệnh p-use của các biến."

Trong đó def (định nghĩa của một biến) là ký hiểu của một câu lệnh thực hiện việc gán giá trị cho một biến và được gọi là câu lệnh định nghĩa của biến đó; c-use (biến

Trang 20

được sử dụng để tính toán) là ký hiệu của một câu lệnh sử dụng một biến để tính toán

giá trị của một biến khác; p-use (biến được sử dụng để kiểm tra các điều kiện): một

câu lệnh sử dụng một biến trong các biểu thức điều kiện (câu lệnh rẽ nhánh, lặp, ) được gọi là p-use với biến đó

Sau khi xây dựng đồ thị dòng dữ liệu của chương trình, chúng ta cần xác định các đường đi của chương trình của mỗi biến dữ liệu ứng với các độ đo kiểm thử (all-defs, all-c-uses, all-p-uses, all-p-uses/some-c-uses ) Trong mỗi đường dẫn này, biến dữ liệu được định nghĩa tại một đỉnh nào đó và được sử dụng tại các câu lệnh tiếp theo ứng với các đỉnh hoặc các cạnh của đường đi này

*) Ví dụ 02: Xây dựng hàm cho nhập vào một mảng n phần tử, tính trung bình cộng

các phần tử là số lẻ trong mảng nhỏ hơn 100 và trả lại kết quả cho giá trị hàm Bảng 1.1 mô tả mã chương trình

Ta xây dưng được sơ đồ dòng dữ liệu như trong Hình 1.4:

Hình 1.4: Ví dụ biểu đồ cho kiểm thử dòng dữ liệu

Trang 21

Xây dựng dựa trên tiêu chí All-defs

Với biến dem ta có:

Global-def = {2,5}

Ta có một def-clear path: 2,3,4,5

Chọn một complete path: 1,2,3,4,5,6,3,7

Ta có được các ca kiểm thử tương ứng trong Bảng 1.3

Bảng 1.3: Danh sách các ca kiểm thử cho ví dụ về kiểm thử dòng dữ liệu

có sự phân tích kỹ về các trường hợp lỗi có thể xảy ra với một biến nào đó trong chương trình

- Các ca kiểm thử được lựa chọn ngẫu nhiên chỉ để phù hợp cho việc thỏa mãn một đường đi nào đó đã định sẵn mà chưa có sự lựa chọn các ca kiểm thử hợp

lý nhất (có nghĩa là có khả năng phát hiện lỗi lớn nhất)

- Việc lựa chọn các ca kiểm thử sẽ trở nên khó khăn khi số lượng các đỉnh trong

đồ thị (đồ thị dòng điều khiển và đồ thị dòng dữ liệu) tăng lên

Là một trong số các kỹ thuật kiểm thử áp dụng vào mức kiểm thử đơn vị Kiểm thử miền đem đến một cách tiếp cận hoàn toàn mới trong việc kiểm thử so với hai kỹ thuật kiểm thử dòng điều khiển và kiểm thử dòng dữ liệu Trong kiểm thử miền ta có

cơ chế kiểm thử khá chi tiết: một loại lỗi được gọi là lỗi miền được định nghĩa và sau

đó các dữ liệu kiểm tra được định nghĩa để bắt các lỗi đó

Trong kiểm thử miền cũng có xây dựng các cơ chế và cách thức rõ ràng giúp cho người kiểm thử có thể chọn lựa các ca kiểm thử có khả năng kiểm soát lỗi cao nhất làm tăng tính khả thi của các ca kiểm thử và giảm thiểu rủi ro một cách lớn nhất

Trang 22

1.2 Kiểm thử miền

Như trên ta đã đề cập, trong kiểm thử dòng điều khiển và kiểm thử dòng dữ liệu không hề xác định các kiểu lỗi một cách rõ ràng để xem xét và xây dựng các ca kiểm thử, còn trong kiểm thử miền, một lại lỗi được gọi là lỗi miền sẽ được định nghĩa, sau

đó dữ liệu kiểm tra được xác định để bắt những lỗi đó

Ý tưởng của kiểm thử miền lần đầu tiên được nghiên cứu bởi White và Cohen vào năm 1978 Sau đó nó đã được tổng hợp lại bởi Naik và Tripathy [2] Trong chương này chúng ta sẽ đi tìm hiểu các khái niệm về lỗi miền; cách xác định các miền đầu vào

từ các đặc tả và mã nguồn của chương trình; các kiểu xuất hiện của lỗi miền; trong kiểm thử miền ta cũng sẽ được làm quen với khái niệm điểm ON và điểm OFF, đó là những điểm có khả năng phát hiện ra lỗi cao nhất trong miền; và đặc biệt chúng ta sẽ tìm hiểu về các chiến lược để xác định các ca kiểm thử tốt nhất Các nội dung được tham khảo từ [2]

1.2.1 Khái niệm về lỗi miền

Hai phần tử cơ bản của một chương trình máy tính là miền đầu vào và các đường

đi của chương trình Miền đầu vào của chương trình là danh sách của tất cả các dữ liệu đầu vào cho chương trình Một đường đi của chương trình là một chuỗi tuần tự các chỉ dẫn từ khi chương trình bắt đầu tới một vài điểm quan trọng trong chương trình Ví dụ điểm cuối cùng của chương trình là một điểm quan trọng Một điểm quan trọng khác là khi chương trình đợi để nhận một dữ liệu đầu vào từ môi trường của nó để nó có thể tiếp tục thực thi Nói cách khác, một đường đi của chương trình tương ứng với một số luồng của điều khiển trong chương trình Một con đường được cho là khả thi nếu có một dữ liệu đầu vào làm cho chương trình thực thi theo đường đi đó Nếu không, con đường đó được cho là không khả thi

Howden [5] đã xác định hai lớp lớn của các lỗi, cụ thể là lỗi tính toán và lỗi miền, bằng cách kết hợp các khái niệm về dữ liệu đầu vào và đường đi chương trình Tác giả đưa ra khái niệm về hai loại lỗi trên như sau:

- Lỗi tính toán: Một lỗi tính toán xảy ra khi một dữ liệu đầu vào cụ thể làm cho

chương trình thực hiện đúng theo một con đường mong muốn, nhưng giá trị đầu ra là sai Chú ý rằng các giá trị đầu ra có thể sai ngay cả khi chương trình thực hiện theo đúng con đường mong muốn Điều này có thể xảy ra do một chức năng thực hiện sai trong một trạng thái thực hiện trong chương trình Lỗi này thường xảy ra ở giai đoạn lập trình viên xây dựng mã chương trình

Trang 23

*) Ví dụ 03: Học sinh thi cấp 3 với 2 môn Toán và Văn Điểm Toán có hệ số 3

và điểm Văn có hệ số 2 Học sinh có điểm trung bình ≥ 5 trúng tuyển vào trường Chương trình tính điểm trung bình như sau:

Bảng 1.4: Mã chương trình tính điểm trung bình toán và văn

Float diemtrungbinh(int toan, int van){

float trungbinh;

trungbinh = (float)(toan*2+van*3)/5;

return(trungbinh);

}

Từ đoạn mã chương trình trong Bảng 1.4 ta thấy, chương trình vẫn sẽ chạy

theo đúng đường dẫn hợp lý nhưng kết quả cho ra là sai

Tổng quát: Hãy xem xét một con đường mong muốn có chứa các kết quả trả

về = f (a, b), trong đó a và b là các giá trị đầu vào Một lỗi tính toán có thể xảy

ra nếu các báo cáo được thay thế bằng một lỗi không chính xác, chẳng hạn như kết quả = f (b, a) Vì vậy, kết quả của thực hiện trên đường đi có thể là sai lầm vì một lỗi trong khi gán các biến hoặc thực hiện tính toán, và điều này có thể xảy ra mặc dù chương trình đã đi theo một đường dẫn chính xác

- Lỗi miền: Một lỗi miền có thể xảy ra khi việc xác định một dữ liệu đầu vào là

nguyên nhân để chương trình thực thi sai, vì khi đó chương trình sẽ thực thi theo một con đường không đúng với mong muốn của nó Một con đường không chính xác có thể được lựa chọn bởi một chương trình nếu có một lỗi trong một hoặc một vài các báo cáo có điều kiện trong chương trình

Chúng ta hãy xem xét một câu lệnh điều kiện của mẫu if (p) then f1()

else f2() Nếu có một lỗi trong việc xây dựng thuộc tính p, khi đó lời gọi của

một chức năng sai được gọi, do đó gây ra một đường dẫn không chính xác được thực thi

Từ đó ta thấy, đối với mỗi giá trị đầu vào, chương trình luôn chỉ định một con đường trong nó để thực hiện; tập những giá trị đầu vào thực hiện chương trình theo một con đường giống nhau để thực thi được gọi là miền con Vì có một số lượng lớn các giá trị đầu vào của chương trình và số lượng lớn các con đường trong một chương trình, tác giả đã xem một chương trình như việc phân vùng không gian đầu vào thành một số hữu hạn các miền con và chỉ định một đường dẫn chương trình riêng biệt cho mỗi miền con đó

Trang 24

Từ Hình 1.5 ta có: tập D là toàn bộ miền đầu vào của chương trình P Ta gọi D là miền của toàn bộ chương trình D có thể là một tập hợp vô hạn và P có thể chỉ có một con đường duy nhất cho toàn bộ giá trị trong miền D và mọi giá trị trong D đều có hành vi tính toán trong P như nhau

Hình 1.5: Cấu trúc tổng quát của một chương trình

Mặt khác, chương trình P có thể thực hiện những cách khác nhau cho mỗi miền con trong D (D1,D2,D3,D4,D5…), lưu ý rằng các phân vùng con trong D có thể không nhìn thấy từ bên ngoài Khi đó trong P sẽ có cơ chế xây dựng khái niệm để quyết định phương pháp cũng như đường đi cần thiết cho từng đầu vào cụ thể nhất định của các giá trị thuộc D

Việc phân loại đầu vào trong một chương trình có thể không tồn tại tại một vị trí hay theo một cách thức duy nhất và được xác định rõ ràng mà nó có thể nằm ở nhiều

vị trí khác nhau trong toàn bộ chương trình (cụ thể thì việc phân loại các phần đầu vào của chương trình có thể tìm thấy trong các mô-đun khác nhau của chương trình) Có thể có 5 tính toán khác nhau cho 5 miền con tương ứng trong D như trong Hình 1.6 Một chức năng chứa trong P sẽ quyết định những gì sẽ tính toán cho một giá trị trong

D và được gọi là phân loại đầu vào Chú ý cấu trúc của một chương trình có thể không giống với trường hợp hiển thị bên trong vòng tròn lớn trong Hình 1.6 Chương trình thực hiện phân loại đầu vào thông qua trình tự của các thuộc tính, một phân loại đầu vào có thể không tồn tại như một mô-đun duy nhất như trong đó

Hình 1.6: Phân loại miền đầu vào của chương trình

Trang 25

Vì vậy, một chương trình sẽ thực hiện các tính toán sai nếu có lỗi trong phần phân loại đầu vào Từ đó chúng ta có thể xác định hai khái niệm cơ bản như sau:

- Một miền là một tập hợp tất cả các giá trị đầu vào mà chương trình thực hiện việc tính toán tương tự cho các phần tử trong đó (ở đây chúng ta quan tâm đến miền lớn nhất mà chương trình thực hiện các tính toán khác nhau trong các miền liền kề)

- Một chương trình có một lỗi miền nếu nó không thực hiện phân loại đầu vào chính xác Khi đó giả định rằng tại các miền liền kề sẽ thực hiện các tính toán khác nhau, một lỗi miền sẽ làm cho chương trình tạo ra các giá trị đầu ra không chính xác

Để thuận lợi cho quá trình nghiên cứu, các ví dụ sau đây về kiểm thử miền sẽ chỉ tập trung vào trường hợp chương trình có nhiều nhất 2 biến đầu vào có quan hệ với nhau, từ đó miền đầu vào cho các chương trình sẽ dễ hình dung hơn trong môi trường không gian hai chiều

1.2.2 Xây dựng các miền kiểm thử từ chương trình

Dựa vào các tài liệu đặc tả chương trình và mã nguồn tác giả chỉ ra việc xác định các miền của một chương trình theo các bước sau:

- Bước 1: từ mã nguồn, vẽ một biểu đồ luồng điều khiển chương trình;

- Bước 2: tìm tất cả các diễn giải khác nhau của các vị từ trong chương trình

Lưu ý rằng một vị từ trong một chương trình có thể có nhiều cách giải thích, bởi vì điều khiển có thể đi đến một nút vị từ thông qua các con đường khác nhau

- Bước 3: Phân tích những giải thích về các vị từ để xác định các miền

*) Ví dụ 04: Tác giả đã đưa ra một ví dụ đơn giản sau đây để minh họa cho việc xác

định các miền của một chương trình: xây dựng một hàm codedomain() chấp nhận hai

yếu tố đầu vào là x và y và trả về một số nguyên

Trang 26

Hình 1.7: Đồ thị dòng điều khiển mô tả các chức năng trong Bảng 1.5 3

Xét vị từ đầu tiên:

P1: c > 5

3 Nguồn: [2]

Trang 27

Trong phát biểu if() đầu tiên chỉ có một giải thích, cụ thể là:

Hai giải thích đƣợc tóm tắt trong Bảng 1.6:

Bảng 1.6: Hai giải thích của tuyên bố if() thứ 2 trong hình 1.7

Tiếp theo, chúng ta xem xét hai cách giải thích của vị từ P2 Cho P1 = True, P2 có giải thích sau đây:

P2: x ≤ −4

Trang 28

Vì vậy, P2 tiếp tục phân chia miền được xác định bởi giá trị P1 = True thành hai bộ tương ứng với hai giá trị của nó Biên P2 chia ra, khi P1 là True, được đại diện bởi các đường thẳng x = -4 Khu vực bên trái của biên P2 và trên biên P1 tương ứng với P1P2 =

TT, và khu vực bên phải của biên P2 và trên biên P1 tương ứng với P1P2 = TF

Hình 1.8: Các miền thu được từ các giải thích vị từ trong hình 1.7 4

Khi P1 = False, P2 có giải thích như sau:

P2 : x >4

Nói cách khác, P2 tiếp tục phân chia miền được xác định khi P1 = False thành hai

bộ tương ứng với hai giá trị thật của nó Biên P2, khi P1 = True, được phân chia bởi đường thẳng x = 4 Khu vực bên phải của biên P2 và dưới biên P1 tương ứng với P1P2

= FT, và khu vực bên trái của biên P2 và dưới biên P1 tương ứng với P1P2 = FF trong Hình 1.8

Chúng ta có thể lưu ý rằng nếu một chương trình có chứa k vị từ trong đó, số lượng tối đa các miền thu được là 2k Trong thực tế, số lượng các miền thu được là nhỏ hơn nhiều so với 2k,

4 Nguồn: [2]

Trang 29

*)Ví dụ 05: Chương trình nhập vào điểm và xét điểm tổng kết môn học

Bảng 1.7: Hàm tính điểm tổng kết môn học trong ví dụ 05

Ta xây dựng được các miền vào của biến như sau:

Hình 1.9: Miền vào cho chương trình ở Bảng 1.7

Từ mã nguồn xác định được 4 vị từ nhưng số miền xác định là 4 miền

Tương tự cho các trường hợp áp dụng với không gian 2 chiều và 3 chiều…

1.2.3 Các kiểu xuất hiện của lỗi miền

a Các khái niệm cơ bản:

Các thuộc tính của một miền:

- Một miền là một tập hợp các giá trị mà chương trình thực hiện các tính toán giống hệt nhau

- Một miền có thể được mô tả bởi một tập hợp các vị từ Các phần tử riêng biệt của miền đáp ứng các vị từ của miền đó

Ví dụ: Miền TT trong Hình 1.8 là cách biểu diễn theo toán học tập hợp các vị từ thể

hiện trong Bảng 1.8 dưới đây:

Bảng 1.8: Các vị từ định nghĩa trong miền TT trong Hình 1.8

Trang 30

Một miền được xác định, theo phương pháp của hình học, bởi một tập các ràng buộc được gọi là các biên khác nhau Các thuộc tính của một miền được thảo luận trong nhóm của các thuộc tính của các biên đó như sau:

Biên đóng (Closed Boundary): Một biên được cho là đóng nếu các điểm trên biên

cũng thuộc trong miền quan tâm

Ví dụ: Hãy xem xét miền TT trong Hình 1.8 và biên của nó được xác định bởi:

P2 : x ≤ −4

Biên trên là một biên đóng của miền TT

Biên mở (Open Boundary): Một biên được cho là mở nếu các điểm trên biên không

thuộc về miền được quan tâm

Ví dụ: Xem xét miền TT trong Hình 1.8 và biên của nó được xác định bởi biểu thức

P1: x +y > 5

Biên trên là một biên mở của miền TT Chúng ta có thể nhận thấy rằng ký hiệu dấu "=" trong một toán tử quan hệ xác định có hay không một biên được đóng lại Nếu các toán tử quan hệ trong một hàm của biên có biểu tượng "=" trong nó, thì khi đó biên

là một biên đóng, nếu không nó là một biên mở

Miền đóng (Closed Domain): Một miền được cho là miền đóng nếu tất cả các biên

của nó là đóng

Miền mở (Open Domain): Một miền được cho là mở nếu một số biên của nó được

mở

Điểm cực biên (Extreme Point): Một điểm cực biên là một điểm mà hai hoặc nhiều

biên đi qua

Miền liền kề (Adjacent Domains): Hai miền được cho là liền kề nếu chúng có một

biên chung

Hình 1.10: Các dạng miền và biên trong kiểm thử miền

Trang 31

b Các kiểu lỗi miền:

Một đường đi của chương trình sẽ có một lỗi miền nếu ta xây dựng không chính xác một đường đi của vị từ Từ giải thích không chính xác của một vị từ sẽ sinh ra một con đường khác với con đường chính xác:

- Mập mờ giữa miền đóng và miền mở;

- Bị dịch chuyển một khoảng cách từ vị trí chính xác;

- Bị quay nghiêng một góc so với vị trí chính xác

Từ đó tác giả đưa ra 3 kiểu lỗi miền cơ bản:

+) Lỗi đóng biên (Closure Error):

Một lỗi đóng biên xảy ra nếu một biên mục tiêu là đóng bị thay bằng một biên mở hoặc ngược lại biên mở bị thay bằng biên đóng trong quá trình xây dựng chương trình Một số ví dụ về lỗi đóng biên:

- Toán tử quan hệ ≤ được thực hiện như là <

- Toán tử quan hệ < được thực hiện như là ≤

- Toán tử quan hệ ≥ được thực hiện như là >

- Toán tử quan hệ > được thực hiện như là ≥

Nguyên nhân chính xuất hiện lỗi đóng biên do sự mập mờ giữa dấu “=” trong các biểu thức của vị từ

Hình 1.11: Minh họa cho lỗi đóng biên

+) Lỗi dịch chuyển biên (Shifted-Boundary Error):

Một lỗi dịch chuyển biên xảy ra khi biên thực hiện song song với biên dự định Điều này xảy ra khi giá trị bất biến của bất đẳng thức xác định biên chiếm một giá trị khác với giá trị dự kiến Trong điều kiện cụ thể, một lỗi dịch chuyển biên xảy ra do sự thay đổi về độ lớn hoặc các dấu hiệu của giá trị bất biến của bất đẳng thức

Trang 32

Ví dụ: Hãy xem xét biên được xác định bởi vị từ trong Hình 1.8 sau đây:

Hình 1.12: Minh họa cho lỗi dịch chuyển biên

+) Lỗi nghiêng biên (Tilted-Boundary Error):

Nếu các hệ số bất biến của các biến trong một vị từ xác định một biên lấy giá trị sai, thì lỗi nghiêng biên xảy ra

Ví dụ: Hãy xem xét biên được xác định bởi vị từ trong Hình 1.8 sau đây:

P1: x + y> 5

Nếu ý định của người lập trình là xác định một biên đại diện bởi vị từ

P1 ’’: x + 0.5y> 5

Thì khi đó biên được xác định bởi P1 nghiêng so với biên được xác định bởi P1’’

Hình 1.13: Minh họa cho lỗi nghiêng biên

Trang 33

1.2.4 Xây dựng các điểm kiểm tra ON và OFF trong kiểm thử miền

Trong kiểm thử miền cần xác định rõ mục tiêu là để tìm ra các lỗi miền ở nơi mà các ca kiểm thử được thiết kế với mục đích phát hiện ra các lỗi miền đã được nêu trong Phần 1.2.3 ở trên

Một đặc điểm quan trọng của lỗi miền đó là: Các điểm dữ liệu ở trên hoặc gần biên sẽ có khả năng cao để đưa ra các lỗi miền Do đó, với mục tiêu xác định các điểm

dữ liệu được cho là nhạy cảm nhất dẫn đến các lỗi miền, thì việc thực hiện các chương trình với những giá trị đầu vào đó sẽ đem đến kết quả khả thi nhất cho quá trình kiểm thử

Trong kiểm thử miền tác giả sẽ cho chúng ta làm quen với hai khái niệm về điểm

ON và OFF, đây chính là những điểm được xác định trên hoặc gần với biên của miền nhất, và vì vậy chúng là những điểm dễ phát hiện ra lỗi của chương trình

a Điểm ON:

*) Định nghĩa: Cho một biên, một điểm ON là một điểm trên biên hoặc "rất gần" biên

Định nghĩa này cho thấy rằng chúng ta có thể chọn một điểm ON theo hai cách phụ thuộc vào vị từ và mục đích lựa chọn Từ đó chúng ta sẽ biết lựa chọn một điểm

*) Ví dụ: Hãy xem xét những bất đẳng thức của biên sau đây

PON1

Do đó ta thấy: theo bất đẳng thức PON1 thì nếu chọn x=1 sẽ xác định được chính xác y = 1, khi đó ta sẽ có một điểm chính xác nằm trên biên Tuy nhiên nếu cho x = 0

Trang 34

thì y = 6/7 và cho một số không chính xác, khi đó chọn một giá trị tương đối của y sẽ cho ta một điểm gần với biên

Điểm nằm chính xác trên biên được xác định bởi vị từ: PON2 ’ : x + 7y = 6

Nhưng điểm đó lại không phải là một phần của miền đang được xem xét Điểm

(-1, 1) nằm chính xác trên biên PON2 và là một điểm ON Lưu ý rằng điểm (-1, 1) không phải là một phần của miền đang được xem xét Tương tự như vậy, các điểm (0, 0.858), trong đó gần như trên biên, nó nằm rất gần với biên, là một điểm ON và nó nằm ngoài phạm vi quan tâm

b Điểm OFF:

*) Định nghĩa: Một điểm OFF của một biên là điểm nằm cách xa biên

Tuy nhiên, khi lựa chọn một điểm OFF, chúng ta phải xem xét liệu một biên là mở hay đóng đối với một miền:

- Nếu một biên là mở với một miền đang được xem xét, thì khi đó một điểm OFF của biên đó là một điểm trong nằm bên trong miền với một khoảng cách nhỏ tùy ý từ biên

- Nếu một biên là đóng so với miền đang được xem xét, thì sau đó một điểm OFF của biên đó là một điểm ngoài nằm ở phía ngoài của biên với một khoảng cách nhỏ tùy ý

Khi biên được đóng lại, một điểm OFF nằm ngoài miền này có nghĩa là bất đẳng thức biên không đáp ứng Lưu ý rằng điểm (-1, 1) nằm chính xác trên biên và nó thuộc

về miền Do đó, (-1, 1) không phải là một điểm OFF Tuy nhiên, điểm (-1, 0.99) nằm bên ngoài miền, và nó không phải là một phần của miền đang được xem xét Điều này

có thể dễ dàng kiểm chứng bằng cách thay thế x = -1 và y = 0,99 vào trong bất đẳng thức POFF1, khi đó sẽ sinh ra một giá trị 5.93 < 6 Do đó, (-1, 0.99) là một điểm OFF

với một biên mở như sau: POFF2: x + 7Y <6

Khi biên POFF2 là mở, một điểm OFF nằm bên trong miền Có thể dễ dàng xác định điểm (-1, 0.99) nằm bên trong D2, và do đó nó là một điểm OFF cho miền D2 đối với biên POFF2

c Tổng quát:

Từ các ý tưởng trên của điểm ON và OFF tác giả đã cho ta thấy:

Trang 35

- Trong khi kiểm thử một biên đóng, các điểm ON sẽ thuộc miền được kiểm tra,

và các điểm OFF nằm trong một miền lân cận

- Trong khi kiểm thử một biên mở, các điểm ON nằm trong một miền lân cận, còn các điểm OFF nằm trong miền đang được thử nghiệm

Hình 1.14: Điểm ON và OF

Để hiểu rõ hơn ta có thể xem thêm một ví dụ trong Hình 1.14, trong đó cho thấy hai miền D1 và D2 được xác định bởi vị từ x < 4 và x ≥ 4 tương ứng Vì vậy, thực tế biên được xác định bởi vị từ sau đây:

PON, OFF: x = 4

Trong hình, chúng ta thấy hai điểm ON là A và B, trong đó A nằm chính xác trên biên và B nằm "rất gần" với biên Vì vậy, chúng ta có A = 4 và ví dụ B = 4,00001 Chúng ta thấy một điểm OFF C nằm trong D1 và cách biên một khoảng Điểm C = 3,95 nằm bên trong miền D1 và bên ngoài miền D2

Trang 36

1.2.5 Xây dựng các chiến lược lựa chọn ca kiểm thử

Trong phần này, chúng ta sẽ tìm hiểu cách tác giả giải thích các phương pháp để lựa chọn các ca kiểm thử với các trường hợp xuất hiện lỗi khác nhau trong kiểm thử miền và chứng minh được rằng dữ liệu thử nghiệm đã được lựa chọn sẽ tiết lộ lỗi miền xác định tại Phần 1.2.3

a Tổng quan các trường hợp xuất hiện lỗi miền:

Đối với từng miền và cho mỗi biên, chọn hai điểm ON là A, B và một điểm OFF

là C Tiêu chí này tạo ra dữ liệu thử nghiệm cho thấy lỗi miền Tuy nhiên tùy thuộc vào mỗi loại biên và loại lỗi miền mà các tiêu chí lựa chọn các ca kiểm thử cũng có sự khác nhau, cụ thể như sau:

+) Trường hợp biên đóng với miền xét (Closed inequality boundary)

- Dịch chuyển biên làm giảm đi độ lớn miền (Boundary shift resulting in a reduced domain)

- Dịch chuyển biên làm mở rộng độ lớn miền (Boundary shift resulting in an enlarged domain)

- Nghiêng biên (Boundary tilt)

- Lỗi đóng biên (Closure error)

+) Trường hợp biên mở với miền xét (Open inequality boundary)

- Dịch chuyển biên làm giảm đi độ lớn miền (Boundary shift resulting in a reduced domain)

- Dịch chuyển biên làm mở rộng độ lớn miền (Boundary shift resulting in an enlarged domain)

- Nghiêng biên (Boundary tilt)

- Lỗi đóng biên (Closure error)

+) Biên bình đẳng(Equality boundary)

Để thuận tiện và tổng quát, tác giả xem xét trường hợp bất đẳng thức chứa 2 biến quan hệ nhau, khi đó sẽ xây dựng miền vào cho các ca kiểm thử mô phỏng trong không gian miền hai chiều Xem xét hai miền liền kề D1 và D2, giả thiết rằng việc tính toán chương trình tương ứng với D1 và D2 sẽ thu được f1 và f2, và f1 ≠ f2

b Trường hợp biên đóng với miền đang xét

+) Biên dịch chuyển làm cho miền xét bị giảm đi:

Biên giữa hai miền D1 và D2 đã được dịch chuyển bởi một số lượng nhất định (xem Hình 1.15)

Trang 37

Hình 1.15: Biên dịch chuyển làm giảm đi độ lớn miền xét (closed inequality)

Trong hình này ta thấy biên thực tế giữa hai miền và một vị trí tùy ý của biên mong đợi Cần chú ý rằng tác giả sẽ giả thuyết không biết chính xác vị trí của biên mong đợi Biên dự kiến đã được hiển thị chỉ để giải thích rằng biên thực tế đã di chuyển ra khỏi biên dự kiến và để chứng minh phương pháp này sẽ xây dựng các Ca kiểm thử đưa ra được lỗi trong trường hợp này

Biên giữa hai miền là đóng đối với miền D1 Do đó, hai điểm ON là A và B thuộc

về miền D1, và điểm OFF C thuộc miền D2 Vì vậy mà kết quả đầu ra thực tế từ chương trình tương ứng để kiểm tra dữ liệu A, B, và C ta sẽ được f1(A), f1(B), và f2(C) tương ứng

Rõ ràng ta thấy trong Hình 1.15 nếu trong trường hợp không có bất kỳ sự thay đổi biên nào (có nghĩa là sẽ không có lỗi xuất hiện trong chương trình) và biên xác định lúc này là d trùng với biên lý tưởng Khi đó tất cả các điểm kiểm tra đều thuộc về miền

D1 Ta có kết quả đầu ra dự kiến tương ứng để kiểm tra dữ liệu A, B, và C được f1(A),

f1(B), và f1(C) Các kết quả được liệt kê trong Bảng 1.9 Chúng ta quan sát, bằng cách

so sánh cột thứ hai và thứ ba của Bảng 1.9, kết quả thực tế và kết quả dự kiến là không giống hệt nhau cho điểm dữ liệu C Do đó, điểm dữ liệu C cho thấy lỗi dịch chuyển biên

Bảng 1.9: Phát hiện lỗi khi biên dịch chuyển làm giảm đi độ lớn miền xét (Closed

Inequality)

Trang 38

Điều quan trọng là chúng ta cần phải hiểu:

 Chúng ta không cần phải biết vị trí chính xác của biên mong đợi Bởi vì cái mà chúng ta thực sự cần là kết quả chương trình dự kiến để đáp ứng với ba điểm dữ liệu A, B, và C

 Tất cả ba điểm dữ liệu A, B, và C không cần đồng thời phải tiết lộ các lỗi Mục đích của chúng ta là để chỉ ra rằng dữ liệu thử nghiệm được lựa chọn theo các tiêu chí quy định như trên sẽ có khả năng để lộ các lỗi miền Vì vậy chỉ cần thỏa mãn ít nhất một điểm dữ liệu cho thấy lỗi, khi đó ta có thể kết luận lỗi chương trình xuất hiện với ca kiểm thử được lựa chọn

 Nếu điểm C cách biên một khoảng cách có độ lớn là a, sau đó biên sẽ dịch chuyển một đoạn nhỏ hơn độ lớn a này thì lỗi miền không thể được phát hiện

Vì khi đó Kết quả dự kiến f2(C) giống hệt với Kết quả thực tế f2(C)

+) Biên dịch chuyển để nhận được miền rộng hơn:

Để phát hiện lỗi này, chúng ta theo dõi Hình 1.16, nơi mà biên giữa hai miền D1 và

D2 đã chuyển từ vị trí dự kiến d của nó đến vị trí thực tế d’ làm cho kích thước của miền D1 được xem xét đã mở rộng

Hình 1.16: Biên dịch chuyển làm tăng độ lớn miền xét (closed inequality)

Một lần nữa, chúng ta không biết chính xác vị trí của biên mong đợi Biên giữa hai miền là đóng đối với miền D1 Do đó, hai điểm ON là A và B thuộc về miền D1, và điểm OFF C thuộc miền D2 Vì vậy mà kết quả đầu ra thực tế từ chương trình tương ứng cho việc để kiểm tra các dữ liệu A, B, và C là f1(A), f1(B), và f2(C)

Từ Hình 1.16 ta thấy, trong trường hợp không có bất kỳ sự thay đổi biên, tất cả các điểm kiểm tra thuộc về miền D2 Và khi đó, kết quả mong đợi tương ứng để kiểm tra

dữ liệu A, B, và C là f2(A), f2(B), và f2(C) Chúng ta quan sát từ Bảng 1.10 là Kết quả thực tế và Kết quả dự kiến không giống nhau cho các điểm dữ liệu A và B

Ngày đăng: 25/03/2015, 10:23

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Phạm Ngọc Hùng, Trương Anh Hoàng và Đặng Văn Hưng (2014). Giáo trình kiểm thử phần mềm. Trường Đại học Công nghệ, ĐHQG.Tiếng Anh Sách, tạp chí
Tiêu đề: Giáo trình kiểm thử phần mềm
Tác giả: Phạm Ngọc Hùng, Trương Anh Hoàng và Đặng Văn Hưng
Năm: 2014
[2] K. Naik and P. Tripathy (2008), “Software Testing and Quality Assurance- Theory and Practice”, Sagar Naik, University of Waterloo, Piyu Tripathy, Wiley Sách, tạp chí
Tiêu đề: Software Testing and Quality Assurance- Theory and Practice
Tác giả: K. Naik and P. Tripathy
Năm: 2008
[3] L. Clarke, H. Hassell, and D. Richardson (July 1982). A Close Look at Domain Testing. IEEE Transactions on Software Engineering, pp. 380–392 Sách, tạp chí
Tiêu đề: A Close Look at Domain Testing
[5] W. E. Howden (September 1976). Reliability of the Path Analysis Testing Strategy. IEEE Transactions on Software Engineering, pp. 208–215 Sách, tạp chí
Tiêu đề: Reliability of the Path Analysis Testing Strategy
[6] Cem Kaner, Sowmya Padmanabhan (September, 2010). An introduction to the theory and practice of domain testing. VISTACON HCMC, VIETNAM Sách, tạp chí
Tiêu đề: An introduction to the theory and practice of domain testing
[4] NIST report (2002), Software errors cost U.S. economy $59.5 billion annually Khác

HÌNH ẢNH LIÊN QUAN

Bảng 1.1: Hàm tính trung bình cộng cho các số lẻ &lt; 100 - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Bảng 1.1 Hàm tính trung bình cộng cho các số lẻ &lt; 100 (Trang 17)
Hình 1.3: Ví dụ về biểu đồ cho kiểm thử dòng kiều khiển - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.3 Ví dụ về biểu đồ cho kiểm thử dòng kiều khiển (Trang 18)
Hình 1.4: Ví dụ biểu đồ cho kiểm thử dòng dữ liệu - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.4 Ví dụ biểu đồ cho kiểm thử dòng dữ liệu (Trang 20)
Hình 1.6: Phân loại miền đầu vào của chương trình - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.6 Phân loại miền đầu vào của chương trình (Trang 24)
Hình 1.8: Các miền thu được từ các giải thích vị từ trong hình 1.7 4 - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.8 Các miền thu được từ các giải thích vị từ trong hình 1.7 4 (Trang 28)
Hình 1.10: Các dạng miền và biên trong kiểm thử miền - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.10 Các dạng miền và biên trong kiểm thử miền (Trang 30)
Hình 1.11: Minh họa cho lỗi đóng biên - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.11 Minh họa cho lỗi đóng biên (Trang 31)
Hình 1.14: Điểm ON và OF - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.14 Điểm ON và OF (Trang 35)
Hình 1.15: Biên dịch chuyển làm giảm đi độ lớn miền xét (closed inequality). - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.15 Biên dịch chuyển làm giảm đi độ lớn miền xét (closed inequality) (Trang 37)
Bảng 1.9: Phát hiện lỗi khi biên dịch chuyển làm giảm đi độ lớn miền xét (Closed  Inequality) - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Bảng 1.9 Phát hiện lỗi khi biên dịch chuyển làm giảm đi độ lớn miền xét (Closed Inequality) (Trang 37)
Hình 1.16: Biên dịch chuyển làm tăng độ lớn miền xét (closed inequality). - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.16 Biên dịch chuyển làm tăng độ lớn miền xét (closed inequality) (Trang 38)
Hình 1.17: Biên nghiêng (closed inequality). - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 1.17 Biên nghiêng (closed inequality) (Trang 39)
Bảng 1.16: Phát hiện lỗi khi xảy ra lỗi đóng biên (Open Inequality) - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Bảng 1.16 Phát hiện lỗi khi xảy ra lỗi đóng biên (Open Inequality) (Trang 44)
Hình 2.1: Các trường hợp phỏng đoán của biên dự kiến - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 2.1 Các trường hợp phỏng đoán của biên dự kiến (Trang 45)
Hình 2.2: Lựa chọn điểm ON trong trường hợp lỗi dịch chuyển biên - Tìm hiểu, nghiên cứu các kỹ thuật cho kiểm thử miền và cải tiến các kỹ thuật đó
Hình 2.2 Lựa chọn điểm ON trong trường hợp lỗi dịch chuyển biên (Trang 46)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w