đặ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. TIEU LUAN MOI download : skknchat@gmail.com 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 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.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).
TIEU LUAN MOI download : skknchat@gmail.1: Các thành phần cơ bản của đồ thị chương trình.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.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. Các độ đo kiểm thử: - Độ đo kiểm thử cấp 1 (C1): mỗi câu lệnh đƣợc thực hiện ít nhất một lần sau khi chạy các ca kiểm thử. 1 Nguồn: [1] 2 Nguồn: [1] TIEU LUAN MOI download : skknchat@gmail.com 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.1: Hàm tính trung bình cộng cho các số lẻ < 100 public double AVG_Sole(int[] s) { double sum = 0; int dem = 0; int i=0; while(i<s.Length){ if (s[i] % 2 != 0 && s[i]<100) { sum += s[i]; dem++; } i++; } return sum / dem; } Ta xây dựng đƣợc sơ đồ dòng điều khiển ứng với độ đo cấp 3 nhƣ Hình 1.
Các trạng thái: 1,2,3,4,5,6,7,3,8 1,2,3,4,5,7,3,8 1,2,3,4,7,3,8 1,2,3,8 TIEU LUAN MOI download : skknchat@gmail.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: Danh sách các ca kiểm thử cho ví dụ về kiểm thử dòng điều khiển Ca kiểm thử Kết quả dự kiến Error { 5, 7, 8,1, 9,105,4} 5,5 { 2,4,6 } … Lỗi chia cho 0 tại vị trí 8 {} … Lỗi chia cho 0 tại vị trí 8 TIEU LUAN MOI download : skknchat@gmail.com 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.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ó. 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 TIEU LUAN MOI download : skknchat@gmail.com 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.