Kiểm Thử Vòng Lặp – Loop Testing Là Gì?
Kiểm thử vòng lặp – Loop testing (hay Loop coverage) là một phương pháp trong kiểm thử phần mềm để đảm bảo rằng tất cả các loại vòng lặp trong source code đã được thực thi một số lần tương ứng. Mục tiêu của kiểm thử vòng lặp là đảm bảo rằng source code chứa vòng lặp hoạt động đúng cách và không gặp phải lỗi hoặc vấn đề về hiệu suất do các vòng lặp không kết thúc hoặc không hoạt động như dự kiến gây ra.
Kiểm thử vòng lặp thường được đo lường bằng cách xác định một số tiêu chí quan trọng, bao gồm:
- Loop Entry Coverage: Đảm bảo rằng mỗi vòng lặp đã được thực thi ít nhất một lần. Điều này đảm bảo rằng mọi vòng lặp đã được kích hoạt trong source code.
- Loop Exit Coverage: Đảm bảo rằng mỗi vòng lặp đã kết thúc ít nhất một lần. Điều này đảm bảo rằng tất cả các điều kiện kết thúc vòng lặp đã được kiểm tra.
- Loop Iteration Coverage: Đảm bảo rằng số lần lặp tối thiểu và tối đa đã được thực hiện cho mỗi vòng lặp. Điều này có thể bao gồm kiểm tra các giới hạn về số lần lặp trong vòng lặp.
Việc sử dụng kiểm thử vòng lặp giúp tăng cường quá trình kiểm thử bằng cách tập trung vào các phần quan trọng của source code mà có thể ảnh hưởng đến hiệu suất và tính ổn định của phần mềm. Nó cũng giúp phát hiện lỗi liên quan đến vòng lặp như lặp vô hạn (infinite loop), vòng lặp không bao giờ thực thi, hoặc vòng lặp thực thi quá ít lần.
Ví Dụ Về Kiểm Thử Vòng Lặp
Các lý thuyết khác nhau đã được đưa ra nhằm cố gắng quy định mức độ kiểm thử mà chúng ta nên đưa ra cho một vòng lặp. Mức tối thiểu cơ bản có xu hướng là ba lần kiểm tra, không lần nào qua vòng lặp và một lần qua vòng lặp, sau đó kiểm tra số lần tối đa dự kiến sẽ quy vòng (nếu bạn biết số lần có thể là bao nhiêu).
Cùng mình xem xét lại ví dụ sau đây:
Hình: Loop coverage 0 and 1 times through
Test 1: n = 0
Bằng cách nhập số 0 (theo mũi tên màu trắng), chúng ta sẽ có vòng lặp không được thực hiện lần nào. Do điều kiện có giá trị là (0 ≤ 1) hoặc FALSE. Điều này khiến chúng ta rơi khỏi vòng lặp.
Test 2: n = 1
Bằng cách nhập số 1 (theo mũi tên màu đen), chúng ta sẽ có vòng lặp thực hiện chỉ một lần. Khi nhập dòng 12, điều kiện có giá trị là (1 <= 1) hoặc TRUE. Vòng lặp thực thi và i được tăng lên. Tại thời điểm này, điều kiện được đánh giá lại, ( 2 <= 1) hoặc FALSE. Điều này khiến chúng ta rơi ra khỏi vòng lặp.
Làm thế nào để xác định số vòng lặp tối đa thông qua? Mỗi vòng lặp có thể có một cách khác nhau để tìm ra điều đó; đối với một số vòng lặp, sẽ không thể xác định được.
Trong đoạn code này, chúng ta có một giá trị tăng dần đều giúp dễ dàng tính toán số vòng lặp lớn nhất có thể. Kích thước tối đa của kiểu dữ liệu được sử dụng trong biến Collector, f, sẽ cho phép chúng ta tính toán số lần lặp tối đa. Chúng ta cần so sánh kích thước của giai thừa được tính toán với kích thước số nguyên tối đa (loại dữ liệu thực tế sẽ phải được xác nhận trong code).
Hãy cùng mình xem xét bảng các giá trị giai thừa dưới đây.
n | n! |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 6 |
4 | 24 |
5 | 120 |
6 | 720 |
7 | 5,040 |
8 | 40,320 |
9 | 362,880 |
10 | 3,628,800 |
11 | 39,916,800 |
12 | 479,001,600 |
13 | 6,227,020,800 |
14 | 87,178,291,200 |
15 | 1,307,674,368,000 |
Giả sử số nguyên 32 bit có dấu được sử dụng để thực hiện phép tính, giá trị tối đa có thể được lưu trữ là 2.147.483.647. Đầu vào là 12 sẽ cho chúng ta giá trị 479.001.600. Giá trị đầu vào là 13 sẽ gây ra tràn (6.227.020.800).
Cùng mình tiếp tục xem xét ví dụ trên với 2 trường hợp kiểm thử mới:
Test 3: n = 12
Test 4: n = 13
Hình: Loop coverage max times through
Cần lưu ý rằng quy tắc về phạm vi bao phủ vòng lặp không giải quyết toàn diện việc kiểm tra tiêu cực (negative testing). Kiểm tra tiêu cực là kiểm tra các giá trị không hợp lệ để đảm bảo lỗi mà chúng gây ra là nhẹ nhàng, cung cấp cho chúng ta thông báo lỗi có ý nghĩa và có thể khôi phục sau lỗi. Có lẽ chúng ta muốn kiểm tra giá trị 13 để đảm bảo việc tràn được xử lý một cách khéo léo. Điều này nhất quán với khái niệm kiểm tra giá trị biên đã thảo luận ở phần trước.
Tóm lại, với với kiểm thử vòng lặp, ví dụ này cần xem xét các trường hợp kiểm thử sau:
Test 1: n = 0, vòng lặp không được thực thi
Test 2: n = 1, vòng lặp được thực thi một lần
Test 3: n = 12, vòng lặp được thực thi tối đa
Test 4: n = 13, vòng lặp không được thực thi. Kiểm tra để đảm bảo việc xử lý tràn bộ nhớ được thực hiện một cách khéo léo.
Bài viết hôm nay mình xin kết thúc ở đây. Hẹn gặp lại các bạn trong các bài viết tiếp theo.
Happy Testing!