Bao phủ trạng thái (state coverage)

Một phần của tài liệu MỘT số PHƯƠNG PHÁP xác ĐỊNH CHUỖI KIỂM CHỨNG TRẠNG THÁI (Trang 53 - 76)

Để đạt được độ bao phủ trạng thái ta lựa chọn chuỗi các chuyển trạng thái sao cho mỗi trạng thái được thăm ít nhất một lần [5]. Bài toán này sẽ tương đương với việc tìm đường đi qua tất cả các đỉnh của một đồ thị có hướng sao cho mỗi đỉnh được thăm ít nhất một lần. Vì mỗi đỉnh của đồ thị tương đương với một trạng thái mà các trạng thái là hữu hạn nên việc tìm đường đi này là hoàn toàn có thể thực hiện được.

Ta xét máy hữu hạn trạng thái C1 như Hình 5.1 sau:

Hình 5.1: Mô hình máy hữu hạn trạng thái C1.

Với đường đi qua các đỉnh q1 → q4 → q3 → q5 → q2 → q1 (đường nét đậm trong Hình 5.2) sẽ qua tất cả các đỉnh của đồ thị, điều đó có nghĩa là tất cả các trạng thái của FSM đều được thăm. Do đó, với chuỗi chuyển trạng thái q1

Hình 5.2: Một đường đi bao phủ tất cả các trạng thái của FSM C1.

Tuy nhiên, độ bao phủ trạng thái là điều kiện lựa chọn yếu nhất trong tất cả các điều kiện lựa chọn để tạo ra ca kiểm thử [5]. Đường đi q1 → q4 → q3 → q5 → q2 → q1 mới chỉ bao phủ được 5/10 chuyển trạng thái, như vậy còn 5 chuyển trạng thái không được bao phủ và lỗi khi cài đặt có thể xuất hiện ở phần không được bao phủ này. Chúng ta xét một dạng điều kiện bao phủ mạnh hơn đó là bao phủ chuyển trạng thái. Độ bao phủ chuyển trạng thái sẽ được trình bày trong mục 5.1.2.

5.1.2. Độ bao phủ chuyển trạng thái (transition coverage)

Để đạt được độ bao phủ chuyển trạng thái ta lựa chọn chuỗi các chuyển trạng thái sao cho mỗi chuyển trạng thái được thăm ít nhất một lần [5]. Bài toán này sẽ tương đương với việc tìm đường đi qua tất cả các cạnh của một đồ thị có hướng sao cho mỗi cạnh được qua ít nhất một lần. Vì mỗi cạnh của đồ thị tương đương với một sự chuyển trạng thái mà các trạng thái là hữu hạn nên việc tìm đường đi này là hoàn toàn có thể thực hiện được.

Để tìm độ bao phủ chuyển trạng thái trước tiên ta xây dựng cây kiểm thử từ mô hình FSM. Cây kiểm thử của một FSM là một cây có gốc là trạng thái ban

đầu. Từ trạng thái ban đầu, nó chứa ít nhất một đường đi từ trạng thái ban đầu tới các trạng thái còn lại của FSM [2].

Theo [2], phương pháp xây dựng cây kiểm thử như sau:

Bước 1: Gốc của cây kiểm thử là trạng thái ban đầu.

Bước 2: Giả sử rằng cây kiểm thử đã được xây dựng đến mức k, mức thứ k+1 sẽ được xây dựng như sau:

Chọn một nút n tại mức k,

 Nếu n xuất hiện ở mức bất kỳ từ 1 đến k thì n là nút lá và không

xây dựng thêm nhánh này.

 Nếu n không phải là nút lá thì tiếp tục xây dựng nhánh này bằng

cách thêm một nhánh từ n tới nút mới m nếu d(n,x) = m. Gán nhãn của nhánh này là x/y với y = λ(n,x).

Lặp lại bước này với tất cả các nút ở mức k.

Ví dụ: Xây dựng cây kiểm thử từ mô hình FSM C1 ở Hình 5.1. Theo các bước trên, ta xây dựng cây kiểm thử như sau:

1. Xây dựng gốc của cây:

Trạng thái ban đầu của FSM C1 là q1, là gốc của cây, có mức là 1.

2. Phát triển nhánh của cây:

 Mức 2: Từ trạng thái ban đầu của q1 có thể tới trạng thái q1 hoặc q4.

Do vậy, từ gốc q1 của cây ta phát triển 2 nhánh tới 2 nút có nhãn là q1 và q4. Tuy nhiên, tại mức 2, q1 là nút lá vì ở mức 1 đã tồn tại nút có nhãn là q1 nên chỉ phát triển nhánh tại nút q4.

 Mức 3: Tại mức 3, q4 là nút lá vì ở mức 2 đã tồn tại nút có nhãn là

q4. Ở các mức 1, 2 chưa tồn tại nút nào có nhãn là q3 nên tiếp tục phát triển thêm nhánh cho nút này.

 Mức 4: Tại mức 4, q1 là nút lá vì ở mức 1 đã tồn tại nút có nhãn là

q1. Ở các mức 1, 2, 3 chưa tồn tại nút nào có nhãn là q5 nên tiếp tục phát triển thêm nhánh cho nút này.

 Mức 5: Tại mức 5, q5 là nút lá vì ở các mức trên đã tồn tại nút có nhãn là q5. Ở các mức 1, 2, 3, 4 chưa tồn tại nút nào có nhãn là q2 nên tiếp tục phát triển thêm nhánh cho nút này.

 Mức 6: Tại mức 6, cả q1 và q5 đều là nút lá vì ở các mức trên đã tồn

tại nút có nhãn là q1 và q5.

Cuối cùng ta được cây kiểm thử như Hình 5.3 dưới đây:

Hình 5.3: Cây kiểm thử của FSM C1.

Sau khi xây dựng cây kiểm thử, ta tiếp tục tìm tập bao phủ trạng thái P từ

chuỗi con pi thể hiện đường dẫn con bắt đầu từ nút gốc trong cây kiểm thử, nối các nhãn theo các cạnh của đường dẫn con ta được một chuỗi thuộc P [2].

Từ cây kiểm thử của FSM C1 trên Hình 5.3, ta tìm được tập bao phủ P như

sau:

p1 = a – là nhãn của đường đi q1 → q1

p2 = b – là nhãn của đường đi q1 → q4

p3 = bb – là nhãn của đường đi q1 → q4 → q4

p4 = ba – là nhãn của đường đi q1 → q4 → q3

p5 = bab – là nhãn của đường đi q1 → q4 → q3 → q1

Tiếp tục tìm các đường dẫn con còn lại, cuối cùng ta được tập P: P = {a, b, bb, ba, bab, baa, baab, baaa, baaab, baaaa}

5.2. Kỹ thuật sinh ca kiểm thử

Ca kiểm thử tốt là ca kiểm thử có thể bao phủ toàn bộ mô hình FSM. Nếu độ bao phủ chuyển trạng là 100% thì độ bao phủ trạng thái cũng đạt 100%, khi đó có thể phát hiện được tất cả các lỗi về output và các lỗi về trạng thái. Do vậy, ta sẽ chọn độ bao phủ chuyển trạng thái để làm tiền đề sinh ca kiểm thử.

5.2.1. Khuôn dạng ca kiểm thử

Thông thường khuôn dạng của một ca kiểm thử bao gồm thông tin sau:

Mã ca kiểm thử (TC_ID): Dùng để định danh ca kiểm thử.

Tiền điều kiện (Pre-Con): Điều kiện ban đầu để có thể thực hiện ca kiểm thử.

Thông tin đầu vào (Input): Thông tin đầu vào cung cấp cho FSM để thực hiện ca kiểm thử.

Thông tin đầu ra mong đợi (Expected Output): Thông tin đầu ra mong đợi nhận được từ FSM tương ứng với thông tin đầu vào (Input).

Bảng 5.1: Khuôn dạng ca kiểm thử

TC_ID Pre-Con Input Expected Output Post-Con

TC_X Thông tin tiền điều kiện

Thông tin Input

Thông tin kết quả mong đợi

Thông tin hậu điều kiện

5.2.2. Phương pháp sinh ca kiểm thử

Từ mô hình đặc tả FSM MS = <S1, I, O, s01, δ1, λ1> ta sinh ca kiểm thử để kiểm thửFSM MI = <S2, I, O, s02, δ2, λ2> theo các bước như sau:

1. Sinh cây kiểm thử và tìm tập bao phủ chuyển trạng thái

Để dễ dàng cho việc sinh ca kiểm thử, tác giả đề xuất thêm một số thông tin sau vào mỗi dãy các chuyển trạng thái của tập P:

 Thêm thông tin output ứng với mỗi thông tin input.

 Thêm thông tin trạng thái cuối cùng của một dãy chuyển trạng thái: mục

đích để xác định xem phải dùng chuỗi kiểm chứng trạng thái nào và tương ứng với chuỗi kiểm chứng đó thì cho ouput gì.

 Thông tin input và output được ngăn cách bởi ký tự ‘/’, với mỗi cặp

input/output, trạng thái được ngăn cách bởi ký tự ‘.’.

Sau khi thêm các thông tin thì mỗi phần tử trong tập P sẽ có định dạng như sau: i1/o1.i2/o2… ii/oi… in/on.qj

Trong đó:

・ ii/oi là thông tin đầu vào (input) và đầu ra (output) tương ứng với một

chuyển trạng thái.

・ qj là trạng thái cuối của dãy chuyển trạng thái.

Ví dụ: a/0.b/1.q1 thì chuỗi thông tin đầu vào là ab, chuỗi thông tin đầu ra là 01

và q1 là trạng thái cuối của dãy chuyển trạng thái.

Áp dụng một trong các phương pháp đã trình bày tại Chương 3 để xác định

chuỗi kiểm chứng trạng thái. Giả sử chuỗi kiểm chứng tìm được là X = {x1, x2,

…, xn} thì:

 Nếu MS tồn tại chuỗi UIO thì |X| = |S1|, khi đó n = |S1|.

 Nếu MS tồn tại chuỗi DS thì |X| = 1, khi đó n = 1.

 Nếu MS không tồn tại UIO và DS (tồn tại W) thì: |X| = |S1| * |W|,

khi đó n = |S1| * |W|.

3. Sinh ca kiểm thử

Với mỗi phần tử của tập chuyển trạng thái hay với một đường dẫn con trên

cây kiểm thử sẽ sinh ra một ca kiểm thử, các ca kiểm thử này được xếp vào “Bộ

ca kiểm thử các chuyển trạng thái của FSM”. Ngoài ra, cần phải thiết kế thêm

một bộ ca kiểm thử để kiểm thử xem trạng thái đầu của MI có mô phỏng trạng

thái đầu của MS hay không, các ca kiểm thử này được xếp vào “Bộ ca kiểm thử

trạng thái ban đầu của FSM”.

Với tập chuyển trạng thái P = {p1, p2,…, pm} và chuỗi kiểm chứng trạng

thái X = {x1, x2, …, xn} thì số ca kiểm thử ước tính là: |P| * |X| + |X|.

i. Bộ ca kiểm thử trạng thái ban đầu của FSM

Để kiểm thử trạng thái đầu của MI có mô phỏng MS hay không ta dùng

chuỗi kiểm chứng. Mỗi phần tử của chuỗi kiểm chứng X tương ứng với một ca

kiểm thử nên bộ ca kiểm thử để kiểm chứng trạng thái ban đầu của FSM MI là |

X|. Đầu vào của ca kiểm thử là một phần tử trong chuỗi kiểm chứng X, kết quả

mong đợi là output tương ứng sinh ra từ FSM MS. Áp dụng chuỗi Reset RI thì

FSM MI trở về trạng thái ban đầu s01. Ca kiểm thử trạng thái ban đầu của FSM

MI được thể hiện như Bảng 5.2 sau:

Bảng 5.2: Ca kiểm thử trạng thái ban đầu của FSM MS

TC_ID Pre-Con Input Expected Output Post-Con

TC0-1 N/A x1 λ1(s01,x1) s01

TC0-i N/A xi λ1(s01,xi) s01

… … … … …

TC0-n N/A xn λ1(s01,xn) s01

Nhận xét:

 Nếu FSM có chuỗi UIO thì số ca kiểm thử trạng thái ban đầu bằng số

trạng thái của FSM MS, tức là |X| = |S1|.

 Nếu FSM có chuỗi DS thì số ca kiểm thử trạng thái ban đầu là |X| = 1.

 Nếu FSM không có chuỗi UIO hoặc DS thì số ca kiểm thử trạng thái ban

ii. Bộ ca kiểm thử các chuyển trạng thái của FSM

Nhận xét:

 Với mỗi input thì ta có một chuyển trạng thái, với một dãy input thì ta sẽ có

một dãy các chuyển trạng thái tương ứng.

 Mỗi chuyển trạng thái trong FSM sẽ tương ứng với sự chuyển nút ở mức thứ

i sang nút ở mức thứ i +1.

 Đường đi từ nút gốc tới có nút mức cao hơn sẽ bao phủ đường đi từ nút gốc

tới nút trong có mức thấp hơn.

Ví dụ: Từ cây kiểm thử của FSM C1 ở Hình 5.2, q3 ở mức 3 và q4 ở mức 2 là các nút trong, đường đi từ q1 tới q3 (q3 ở mức 3 trên cây kiểm thử) là q1→ q4 → q3, đường đi từ q1 tới q4 (q4 ở mức 2 trong cây kiểm thử) là q1 → q4. Như vậy đường đi từ q1 → q4 → q3 đã bao phủ đường đi từ q1 → q4.

Do vậy để kiểm thử một chuyển trạng thái từ trạng thái ban đầu (tương ứng với

nút gốc trong cây kiểm thử) đến trạng thái si (tương ứng với nút ở mức thứ

k +1 trên cây kiểm thử) ta không cần phải kiểm chứng tất cả các trạng thái sau

mỗi một chuyển trạng thái mà chỉ cần kiểm chứng trạng thái si vì các trạng thái

trước đó đã được lần lượt kiểm chứng tại các mức trước.

Với trường hợp chuyển trạng thái q1→ q4 → q3 ở trên ta chỉ cần kiểm chứng trạng thái q3 vì trạng thái q4 ứng với chuyển trạng thái q1→ q4 đã được kiểm chứng tại mức 2.

Theo như đề xuất về định dạng phần tử của tập P như sau: i1/o1.i2/o2…

ii/oi… in/on.qj, giả sử y1 là chuỗi kiểm chứng trạng thái của trạng thái qj, ta dễ dàng xác định thông tin của ca kiểm thử:

 Thông tin đầu vào (Input) là: i1.i2…ii…in.y1

 Thông tin đầu ra mong đợi (Expected Output) là: o1.o2…oi…on.λ(qj, y1)

Trong đó:

o i1.i2…ii…in là chuỗi input dẫn tới trạng thái qj, điều đó cũng có nghĩa là

để đi tới trạng thái qj thì phải qua mức 1, 2,…, i,…, n trên cây kiểm

o Ứng với chuỗi input i1.i2…ii…in sẽ cho chuỗi output o1.o2…oi…on

tương ứng.

o y1 là chuỗi input để kiểm chứng trạng thái q1, nếu đúng là trạng thái qj

thì sẽ cho output là λ(qj,y1).

Ứng với mỗi phần tử trong tập P là một ca kiểm thử và ứng với mỗi sự chuyển dịch từ mức 1 tới các mức tiếp theo ta sẽ được một nhóm các ca kiểm thử, cụ thể:

 Nhóm ca kiểm thử TC1-:

Là các ca kiểm thử dùng để kiểm thử các chuyển trạng thái từ trạng thái ban đầu tới trạng thái tiếp theo ngay sau đó, điều này tương ứng với việc chuyển từ nút gốc (mức 1) tới nút con liền kề nó (mức 2) trên cây kiểm thử.

Để có thể thực hiện được ca kiểm thử nhóm này thì tất cả các ca kiểm thử nhóm TC0- phải được thực hiện không có lỗi (Passed). Điều này tương ứng với tiền điều kiện (Pre-Con) của nhóm ca kiểm thử TC1- là Passed TC0-.

Ta quy ước:

o t là số nút tại mức 2 trên cây kiểm thử,

o i11/o11 là input/output của chuyển trạng thái từ trạng thái ban đầu tới

trạng thái s11’ - tương ứng với chuyển từ nút gốc (mức 1) tới nút

đầu tiên của mức 2 trên cây kiểm thử,

o i12/o12 là input/output của chuyển trạng thái từ trạng thái ban đầu tới

trạng thái s12’ - tương ứng với chuyển trạng thái từ nút gốc tới nút

thứ 2 của mức 2 trên cây kiểm thử,

o Tổng quát, i1j/o1j là input/output của chuyển trạng thái từ trạng thái

ban đầu tới trạng thái s1j’ - tương ứng với chuyển từ nút gốc tới nút

thứ j của mức 2 trên cây kiểm thử (với j = ).

Nhóm ca kiểm thử này sẽ được mô tả trong Bảng 5.3 bên dưới.

 Nhóm ca kiểm thử TC2-: là các ca kiểm thử dùng để kiểm thử các chuyển

trạng thái tương ứng với việc chuyển tử nút gốc (mức 1) tới nút con thuộc mức 3 trên cây kiểm thử.

Để có thể thực hiện được ca kiểm thử nhóm này thì tất cả các ca kiểm thử nhóm TC1- phải được thực hiện không có lỗi. Điều này tương ứng với tiền điều kiện của nhóm ca kiểm thử TC2- là Passed TC1-.

Ta quy ước:

o v là số nút tại mức 3 trên cây kiểm thử,

o i1j/o1j .i21/o21 là input/output của chuyển trạng thái từ trạng thái ban

đầu qua trạng thái s1j’ tới trạng thái s21’ - tương ứng với chuyển từ

nút gốc (mức 1) qua nút thứ j của mức 2 rồi tới nút đầu tiên của mức 3 trên cây kiểm thử (với j {1, 2, ..., t}),

o i1j/o1j .i22/o22 là input/output của chuyển trạng thái từ trạng thái ban

đầu qua trạng thái s1j’ tới trạng thái s22’ - tương ứng với chuyển từ

nút gốc qua nút thứ j của mức 2 rồi tới nút thứ 2 của mức 3 trên cây kiểm thử,

o Tổng quát, i1j/o1j.i2e/o2e là input/output của chuyển trạng thái từ

trạng thái ban đầu qua trạng thái s1j’ tới trạng thái thứ e của mức 3

trên cây kiểm thử - tương ứng với chuyển từ nút gốc qua nút thứ j

Một phần của tài liệu MỘT số PHƯƠNG PHÁP xác ĐỊNH CHUỖI KIỂM CHỨNG TRẠNG THÁI (Trang 53 - 76)