Kỹ thuật dòng điều khiển là kỹ thuật là các testcase được sinh ra dựa việc mô hình hóa các luồng xử lý (hành vi của hệ thống) theo khái niệm đồ thị dòng điều khiển (control flow graph). Để tiến hành xác định kiểm thử, ta sẽ mô hình hóa các dòng lệnh từ mã nguồn bằng đồ thị dòng điều khiển. Từ đồ thị đó, mỗi rẽ nhánh trong luồng xử lý sẽ sinh ra một đường đi. Dựa trên các đường đi ta sẽ sinh được các testcase tương ứng.
Kỹ thuật này là kỹ thuật kiểm thử căn bản và được áp dụng hiệu quả cho nhiều hệ thống, nhiều giai đoạn test khác nhau.
Các bộ giá trị kiềm thử sinh ra từ kỹ thuật này có thể kiểm tra được tính đúng đắn với các thành phần của chương trình gồm: Các phương thức ( Method ), các câu lệnh (Statement ), các nhánh (branch), các điều kiện (if, switch…).
Hình 3.6 Sơ đồ dòng điều khiển
Các ký hiệu sử dụng trong đồ thị CFG:
Hình 3.7 Các ký hiệu sử dụng trong đồ thị
Để xác định mức độ bao phủ của chương trình của một tập ca kiểm thử cho trước ta sử dụng khái niệm độ đo kiểm thử. Theo [1]: Mức độ bao phủ của một tập kiểm thử được đo bằng tỷ lệ các thành phần thực sự được kiểm thử so với tổng thể sau khi thực hiện ca kiểm thử. Độ bao phủ càng lớn thì độ tin cậy của bộ kiểm thử ngày càng cao.
Độ đo kiểm thử cấp 1 (C1) : mỗi câu lệnh được thực hiện ít nhất 1 lần sau khi chạy hết các ca kiểm thử.
Độ đo kiểm thử cấp 2 (C2) : các điểm quyết định trong đồ 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) : Với các điều kiện phức tạp (chứa nhiều điều kiện con cơ bản), việc chỉ quan tâm đến giá trị đúng sai là không đủ để kiểm tra tính đúng đắn của chương trình ứng với điều kiện phức tạp này. Do đó, điều kiện để đảm bảo độ đo này là 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.
Từ các định nghĩa về độ đo, ta có thể áp dụng kiểm thử độ đo để xác định số ca kiểm thử sao cho các ca kiểm thử bao phủ một độ đo nào đó. Theo [1], ta có số đường đi ứng với đồ thị dòng điều khiển sẽ được tính bằng một trong hai cách như sau:
1. Số cạnh – số đỉnh + 2 2. Số đỉnh quyết định + 1
Ứng với mỗi đường đi ta sẽ sinh ra được một ca kiểm thử tương ứng.
Bên cạnh việc tiến hành xây dựng kiểm thử dựa trên độ đo, ta nhận thấy vẫn chưa kiểm tra được các lỗi phát sinh do xuất hiện vòng lặp trong chương trình. Mặt khác, trong quá trình viết mã nguồn cho các đơn vị/hàm, các lỗi gây ra do sử dụng vòng lặp là khá nhiều và gây ảnh hưởng lớn đến chương trình. Theo [1], với chương trình có vòng lặp ta cần quan tâm đến loại vòng lặp là:
Lệnh lặp đơn giản: Tức là đơn vị chương trình chỉ có chứa một lệnh lặp. Lệnh lặp liền kề: Tức là đơn vị chương trình chứa lệnh lặp liền kề nhau.
Lệnh lặp lồng nhau: Tức là đơn vị chương trình chứa lệnh lặp mà trong nó còn chứa lênh lặp khác
Để tiến hành kiểm thử với vòng lặp, ta sẽ xây dựng các ca kiểm thử dựa trên số lần thực hiện của vòng lặp trong chương trình gồm:
1. Vòng lặp thực hiện 0 lần 2. Vòng lặp thực hiện 1 lần 3. Vòng lặp thực hiện 2 lần
4. Vòng lặp thực hiện k lần, 2 < k < n - 1, với n là số lần lặp tối đa của vòng lặp
5. Vòng lặp thực hiện n - 1 lần 6. Vòng lặp thực hiện n lần 7. Vòng lặp thực hiện n + 1 lần
Trong một số trường hợp, việc xác định số vòng lặp tối đa là khó, ta chỉ cần pá dụng việc sinh ca kiểm thử với bốn trường hợp đầu tiên. Với những trường hợp không
xác định được lệnh lặp thực hiện n+1 lần, ta chỉ áp dụng sinh kiểm thử với 6 trường hợp trước đó.
Kết luận:
Kỹ thuật kiểm thử dòng điều khiển là kỹ thuật phát hiện các lỗi tiềm ẩn của chương trình bằng các xác định các đường đi tương ứng với dòng điều khiển của chương trình từ đồ thị dòng điều khiển. Với mỗi một đường đi của đồ thị, ta sẽ xây dựng một ca kiểm thử và đảm bảo đường đi là thực thi được.
Trên thực tế, có không nhiều các công ty phần mềm áp dụng kỹ thuật kiểm thử này do việc áo dụng là khó, tốn kém hơn các kỹ thuật kiểm thử hộp đen [1]. Tuy nhiên, có một số công cụ đã hỗ trợ việc thực hiện kỹ thuật này bằng việc thực thi các ca kiểm thử trên một đơn vị hàm, đề xác định tính đúng đắn của hàm dựa trên kết quả chạy ca kiểm thử.