Linear Code Sequence and Jump – LCSAJ Là Gì?
Linear Code Sequence and Jump – LCSAJ là các khối code nhỏ phù hợp với một cấu hình cụ thể. Có ba thành phần tạo thành LCSAJ, mỗi thành phần là một số đại diện cho một dòng code.
- Vạch xuất phát: Có hai cách mà LCSAJ có thể bắt đầu: ở đầu module hoặc tại một dòng được LCSAJ khác nhảy tới.
- LCSAJ đã kết thúc: Có hai cách người ta có thể kết thúc: ở cuối module hoặc ở dòng code nơi xảy ra bước nhảy. Bước nhảy có nghĩa là chúng ta không chuyển sang dòng code tuần tự tiếp theo mà tải một địa chỉ khác và chuyển đến địa chỉ đó, bắt đầu thực thi ở đó.
- Mục tiêu của bước nhảy: Đây cũng chính là line number.
Về mặt hình thức, ta coi rằng các module phần mềm được tạo thành từ các chuỗi code tuyến tính được nhảy tới, thực thi và sau đó nhảy từ đó. Việc xây dựng các thử nghiệm từ LCSAJ bắt đầu bằng việc xác định chúng trước tiên, sau đó tạo dữ liệu để buộc chúng phải vượt qua.
Hạn Chế/ Khó Khăn
Có một số vấn đề chúng ta phải thảo luận khi cố gắng sử dụng LCSAJ. Như được hiển thị, một số LCSAJ thực sự không thể thực thi được. Điều đó có nghĩa là chúng ta gần như không bao giờ có thể đạt được phạm vi bao phủ 100%. Có những người nhấn mạnh rằng việc buộc code phải thực thi là điều cần thiết để kiểm thử tốt, ngay cả khi nó có vẻ vô nghĩa. Chúng ta tự hỏi liệu thời gian cần thiết để thực hiện điều “không thể” có nên dành để thực hiện các trường hợp thử nghiệm khác hay không.
Ngoài ra còn có một số lý do thực tế để bạn phải suy nghĩ kỹ càng và lâu dài trước khi đầu tư thời gian sử dụng phương pháp thiết kế đường dẫn cụ thể này. Vì việc xác định LCSAJ chỉ có thể được thực hiện sau khi code đã được gửi nên chúng ta không nhận được thử nghiệm sớm khi thực hiện kỹ thuật này. Và, vì những thay đổi nhỏ đối với code có thể gây ra những thay đổi căn bản đối với LCSAJ, nên đây là một kỹ thuật đặc biệt khó sử dụng, có khả năng dẫn đến các vấn đề bảo trì rất tốn kém.
Ví Dụ Về Kiểm Thử Bằng Phương Pháp LCSAJ
Hãy xem xét một ví dụ mình tham khảo từ Wikipedia. Hình dưới đây chứa code và bảng LCSAJ.
Phương pháp thiết kế một bài kiểm tra rất đơn giản:
- Một đường dẫn bắt đầu ở đầu module hoặc một dòng được nhảy tới từ đâu đó.
- Việc thực thi đi theo một đường dẫn tuyến tính, tuần tự cho đến khi đến điểm phải nhảy
- Tìm dữ liệu buộc thực thi thông qua đường dẫn đó và sử dụng nó trong trường hợp thử nghiệm.
Dựa vào phương pháp này, chúng ta sẽ xác định được tám LCSAJ riêng biệt trong code như hình dưới đây.
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAXCOLUMNS 26
#define MAXROW 20
#define MAXCOUNT 90
#define ITERATIONS 750
int main (void)
{
int count = 0, totals[MAXCOLUMNS], val = 0;
memset (totals, 0, MAXCOLUMNS * sizeof(int));
count = 0;
while ( count < ITERATIONS )
{
val = abs(rand()) % MAXCOLUMNS;
totals[val] += 1;
if ( totals[val] > MAXCOUNT )
{
totals[val] = MAXCOUNT;
}
count++;
}
return (0);
}
LCSAJ # | Start | Finish | Jump to |
---|---|---|---|
1 | 10 | 17 | 28 |
2 | 10 | 21 | 25 |
3 | 10 | 26 | 17 |
4 | 17 | 17 | 28 |
5 | 17 | 21 | 25 |
6 | 17 | 26 | 17 |
7 | 25 | 26 | 17 |
8 | 28 | 28 | -1 |
LCSAJ 1 bắt đầu ở module (dòng 10), thực thi đến vòng lặp while (dòng 17), sau đó nhảy đến cuối vòng lặp while (có nghĩa là nó không bao giờ thực hiện vòng lặp). Khối này là một ví dụ hoàn hảo về lý do tại sao LCSAJ lại gặp khó khăn khi kiểm thử. Để khối code thực thi theo cách này, chúng ta cần tìm thời điểm mà vòng lặp while không lặp. Biểu thức Boolean cho vòng lặp while (count < ITERATIONS) sẽ luôn đánh giá là TRUE và do đó luôn lặp với các giá trị mà chúng được khởi tạo. Biến count được khởi tạo bằng 0 ở dòng 16. Điều đó luôn xảy ra khi hàm này được khởi động. Tương tự, ITERATIONS là một hằng số được đặt tên có giá trị khởi tạo là 750. Vì 0 luôn nhỏ hơn 750 trong lần thực hiện đầu tiên nên LCSAJ này không bao giờ có thể được thực thi trừ khi chúng ta buộc nó phải sử dụng trình gỡ lỗi. Câu hỏi được đặt ra là, Có đáng để bắt buộc phải kiểm tra một tình trạng mà theo nghĩa đen là không bao giờ có thể xảy ra không?
LCSAJ 2 sẽ thực thi. Nó cũng bắt đầu ở đầu module và tiếp tục thực thi cho đến khi đến dòng 21. Điều đó có nghĩa là vòng lặp while sẽ kích hoạt. Val được đặt bằng một số ngẫu nhiên trong khoảng từ 0 đến MAXCOLUMNS (26), tổng mảng tại chỉ mục [val] được đặt thành 1 (thực tế là 0 + 1) và điều kiện if được đánh giá. Vì mảng ở chỉ mục chỉ được đặt thành 1 nên câu lệnh if trong lần lặp đầu tiên này sẽ luôn đánh giá là FALSE, khiến cho việc chuyển sang dòng 25.
LCSAJ 3 sẽ không bao giờ thực thi vì lý do vừa được đưa ra trong LCSAJ 2. Khối này sẽ yêu cầu hệ thống khởi động, đi tới vòng lặp while, đi tới câu lệnh if ở dòng 21 và đánh giá TRUE. Vì điều này là không thể với các giá trị liên quan nên nó không thể được thực thi mà không buộc các giá trị thông qua trình gỡ lỗi.
LCSAJ 4 sẽ thực thi mỗi lần một lần thông qua hàm. Nó bắt đầu ở dòng 17 và nhảy từ dòng 17 đến hết vòng lặp while ở dòng 28. Khi nào điều này xảy ra? Lần cuối cùng chúng ta đánh giá điều kiện (count < ITERATIONS). Tức là sau lần thứ 750 vòng lặp while. Tại thời điểm đó, số lượng sẽ được tăng lên 750 lần và điều kiện sẽ xác định rằng (750 < 750), đó là FALSE. Tại thời điểm này bước nhảy xảy ra.
LCSAJ 5 sẽ xảy ra rất nhiều lần, mỗi khi điều kiện if được đánh giá là FALSE. Chúng ta bắt đầu ở vòng lặp while (dòng 17), đi tới câu lệnh if (dòng 21), đánh giá FALSE và chuyển đến cuối câu lệnh if, dòng 25.
LCSAJ 6 có thể thực thi hoặc không, tùy thuộc vào số ngẫu nhiên được tạo. Chúng ta bắt đầu từ vòng lặp while, đi vào vòng lặp và tiếp tục đến câu lệnh if. Nếu ô mảng cụ thể được trỏ đến bởi val đã được tăng đủ số lần thì điều kiện so sánh giá trị của ô đó với MAXCOUNT thực tế có thể là TRUE. Tại thời điểm này, với điều kiện đánh giá TRUE, chúng ta sẽ tiếp tục đi vào phần sau của if, thực thi dòng 23, tiếp tục đến dòng 25 và cuối cùng quay lại dòng 17 từ dòng 26.
LCSAJ 7 sẽ xảy ra mỗi khi chúng ta ở trong vòng lặp và câu lệnh if ở dòng 21 có giá trị FALSE. Bước nhảy đưa chúng ta đến dòng 25, chúng ta tăng số lượng và sau đó lặp lại về 17, đánh giá while.
Và cuối cùng, LCSAJ cuối cùng, 8, sẽ xảy ra sau khi vòng lặp while kết thúc.
Chúng ta nhảy tới 28 để bắt đầu khối, thực hiện dòng 28 (phần thân của khối) và sau đó kết thúc hàm.
Mình xin dừng bài viết hôm nay tại đây. Hẹn gặp lại các bạn trong các bài viết tiếp theo.
Happy Testing!