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 3LỜ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 4LỜ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 5MỤ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 63.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 7DANH 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 8Bả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 9DANH 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 10Hì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 11LỜ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 12Trong đó 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 13Bê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 14vă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 15Chươ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 16Hì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 18Hì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 19Việ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 21Xâ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 221.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 24Từ 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 25Vì 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 26Hì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 27Trong 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 28Vì 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 30Mộ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 31b 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 32Ví 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 331.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 34thì 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 361.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 37Hì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