Saturday, April 9, 2022

Kiểm thử bằng bảng quyết định

Giới thiệu

Có bao giờ bạn tự hỏi đâu là phương pháp kiểm thử chức năng hiệu quả nhất không? Có phải là phương pháp kiểm thử giá trị biên hay kiểm thử phân lớp tương đương? Câu trả lời là phương pháp kiểm thử bằng bảng quyết định [1]. Lý do của việc này là trong hai phương pháp kiểm thử giá trị biên và kiểm thử phân lớp tương đương, các giá trị của tham số đầu vào của hàm là không liên quan đến nhau. Việc này rất khó xảy ra trong thực tế. Phương pháp kiểm thử bằng bảng quyết định là phương pháp giúp kiểm thử viên có thể mô tả được điều kiện xảy ra, hành vi tương ứng của hàm trong những trường hợp đó. Việc này có thể giúp ta mô tả sự liên quan đến nhau của những tham số đầu vào của hàm.

Cấu trúc của bảng quyết định

Một bảng quyết định bao gồm bốn thành phần như sau:

+ Các biểu thức điều kiện C1, C2, C3, v.v.

+ Giá trị của các điều kiện này: T, F, - (không xác định).

+ Hành vi tương ứng của hàm: A1, A2, A3, v.v.

+ Giá trị của hành vi: x: có xảy ra, rỗng: không xảy ra.

Hình sau đây nêu ví dụ về một bảng quyết định với bốn đầu vào được mô tả phía trên.

 

Quy tắc

1

2

3

4

5

6

Điều kiện

C1

T

T

T

T

F

F

C2

T

T

F

F

F

F

C3

T

F

T

F

T

F

Hành vi

A1

x

 

x

x

 

 

A2

 

x

 

 

x

 

A3

x

 

 

 

 

x

 Xét về bản chất, thứ tự của các điều kiện C1, C2, C3, các hành động A1, A2, A3, và các quy tắc 1, 2, v.v. là không quan trọng. Ta có thể thay đổi để phù hợp ngữ cảnh của mình. Tuy nhiên, do mỗi giá trị điều kiện có thể là T, F, hoặc -, ta có thể tăng các cột để phủ hết tổ hợp của các giá trị này.

Thực tế áp dụng

Trong thực tế, để áp dụng phương pháp kiểm thử bằng bảng quyết định, ta cần nắm được quy tắc và bản chất của nó là điều kiện ràng buộc giữa các đầu vào và hành vi tương ứng của hàm hay của phần mềm. Từ đó, ta thấy rằng, phương pháp này có thể được áp dụng không chỉ với hàm mà còn có thể được áp dụng cho việc kiểm thử giao diện với nhiều đầu vào là các điều khiển người dùng. Ngoài ra, ta có thể áp dụng nó cho việc kiểm thử những hành vi của hệ thống phần mềm nói chung với một tập những tham số, sự kiện, thao tác của người dùng hoặc của các hệ thống khác.

Ví dụ

Xét hàm kiểm tra một tam giác có phải tam giác cân hay không

void IsoscelesTriangle(int a, int b, int c)

{

    if( a<b+c && b<a+c && c<a+b ){

        if(a==b || a==c || b==c)

            cout<<"Tam giac can";       

        else

            cout<<"Tam giac khong can";    

    }

    else

        cout<<"Khong phai mot tam giac";

}

  

 

Quy tắc

1

2

3

4

Điều kiện

a<b+c && b<a+c && c<a+b

T

T

F

F

a==b || a==c || b==c

T

F

T

F

Hành vi

Tam giac can

x

 

 

 

Tam giac khong can

 

x

 

 

Khong phai mot tam giac

 

 

x

x

 

Tài liệu tham khảo

[1] Phạm Ngọc Hùng, Trương Anh Hoàng, Đặng Văn Hưng, Giáo trình kiểm thử phần mềm, NXB ĐHQG HN, 2014

Saturday, April 2, 2022

Kiểm thử lớp tương đương

 Kiểm thử lớp tương đương còn được biết đến với tên gọi kiểm thử phân vùng tương đương. Ý tưởng chính của phương pháp này là phân chia miền giá trị đầu vào của mỗi tham số của hàm thành những lớp giá trị mà mỗi giá trị trong đó có tác động tương đương nhau đến hàm cần  kiểm thử. Với cách làm như vậy, ta hy vọng rằng những giá trị của biến đầu vào trong một lớp tương đương có thể gây ra những lỗi giống nhau đối với hàm. Do đó, thay vì cần kiểm thử nhiều giá trị cho mỗi vùng tương đương, ta chỉ cần kiểm thử hàm với một giá trị trong vùng đó thôi.

Vấn đề của ta bây giờ là làm sao tìm được các lớp tương đương của tham số đầu vào để có thể sinh được những ca kiểm thử tương ứng. Có hai phương pháp để làm việc này:

  • Ta có thể dựa vào việc phân tích mã nguồn, hoặc
  • Dựa vào yêu cầu đầu vào của hàm.

Xét ví dụ sau về hàm kiểm tra một năm có phải là năm nhuận hay không:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
int leapYear(int year)
{ 
	if (year % 4 == 0) 
	{
		if (year % 100 == 0) 
		{
			if (year % 400 == 0)
				return 1;
			else
				return 0;
		}
		else
			return 1;
	}
	else
		return 0;
}

 Trong ví dụ trên, nếu dựa trên việc phân tích mã nguồn, ta thấy rằng, tham số đầu vào có thể chia làm các lớp sau của giá trị tham số [year]:

+ Lớp chia hết cho 4 nhưng không chia hết cho 100: kết quả của hàm là năm nhuận

+ Lớp chia hết cho 4 và chia hết cho 100, nhưng không chia hết cho 400: kết quả của hàm là năm KHÔNG nhuận

+ Lớp chia hết cho 4 và chia hết cho 100 và chia hết cho 400: kết quả của hàm là năm nhuận

+ Lớp không chia hết cho 4: kết quả của hàm là năm KHÔNG nhuận

Nếu dựa vào yêu cầu đầu vào của hàm, ta cần dựa vào thực tế khi nào một năm được gọi là năm nhuận. Trong tình huống này, ta cũng có những lớp tương đương tương tự như đã phân tích từ mã nguồn ở trên.

Phân loại kiểm thử lớp tương đương

Xét một hàm có hai đầu vào là A và B, trong đó A có các lớp tương đương A1 và A2, B có các lớp tương đương B1, B2, và B3. Giả sử các giá trị a1 và a2 tương ứng thuộc A1 và A2. Các giá trị b1, b2, và b3 tương ứng thuộc B1, B2, và B3. Ta có một số phân loại kiểm thử lớp tương đương sau:

  • Kiểm thử lớp tương đương yếu

Trong kiểm thử lớp tương đương yếu, ta chỉ yêu cầu giá trị mỗi miền tương đương của các tham số đầu vào xuất hiện trong một ca kiểm thử nào đó là đủ. Trong ví dụ trên, ta chỉ cần 3 ca kiểm thử là đã có thể thỏa mãn yêu cầu này. Ba ca kiểm thử này là: (a1, b1), (a2, b2), (a1, b3). Ta cũng có thể sử dụng ba ca kiểm thử sau để thỏa mãn yêu cầu này: (a1, b1), (a2, b2), (a2, b3).

  • Kiểm thử lớp tương đương mạnh

Trong kiểm thử lớp tương đương mạnh, ta cần tổ hợp các giá trị của những lớp tương đương của các biến đầu vào để có thể đáp ứng được yêu cầu của loại kiểm thử này. Trong ví dụ trên, ta cần tổng số 2x3 = 6 ca kiểm thử để thỏa mãn yêu cầu kiểm thử lớp tương đương mạnh. Sáu ca kiểm thử này như sau: (a1, b1), (a1, b2), (a1, b3), (a2, b1), (a2, b2), (a2,  b3).

  • Kiểm thử lớp tương đương đơn giản

Trong kiểm thử lớp tương đương đơn giản, ta chỉ chia miền giá trị của tham số đầu vào của hàm thành hai lớp tương đương là lớp giá trị hợp lệ và lớp giá trị không hợp lệ. Trong ví dụ với hàm [leapYear] đã đề cập ở trên, miền giá trị hợp lệ là những năm lớn hơn 0 (year > 0). Trong khi đó, miền giá trị không hợp lệ là những năm nhỏ hơn hoặc bằng 0 (year <= 0). Sau khi có lớp tương đương cho mỗi tham số đầu vào, ta có thể áp dụng các phương pháp kiểm thử lớp tương đương mạnh và yếu đã trình bày ở trên.

Lý do để ta có phân loại kiểm thử lớp tương đương đơn giản này là đa phần yêu cầu đầu vào của phần mềm không chỉ rõ miền giá trị hợp lệ của các tham số đầu vào. Chỉ khi bắt tay vào kiểm thử hoặc lập trình, ta mới có thể phát hiện những trường hợp cụ thể mà chương trình cần xử lý. Nguyên nhân thứ hai là ta cần có những xử lý kiểu hợp lệ để thông báo tới người dùng. Từ đó, chương trình cần có những xử lý để có sự tương tác tốt với người dùng và tránh các lỗi có thể xảy ra. 

Chú ý:

Trong thực tế, việc kiểm thử lớp tương đương không chỉ được áp dụng cho việc kiểm thử với các giá trị tham số đầu vào của hàm. Việc này còn được áp dụng với việc kiểm thử cho các giá trị đầu ra của hàm.

(https://www.facebook.com/thayvietkiemthu/posts/119310270701200)

Kiểm thử cặp đôi thông minh

  Kiểm thử cặp đôi thông minh (pairwise testing) là một trường hợp đặc biệt của phương pháp kiểm thử tổ hợp. Trong phương pháp kiểm thử cặp ...