Tuesday, February 23, 2010

Blackbox testing và Whitebox testing

Có 2 trường phái test hoạt động khác nhau về nguyên lý nhưng thực chất bổ sung cho nhau. Có thể bạn đã nghe nói nhiều về Black and White rồi nhưng trên thực tế thì nó hoạt động động như thế nào chắc có thể nhiều nhiều chưa nắm rõ lắm. Xin mạo muội viết vài dòng:
- White box tesing: là cách thức test dựa trên code của chương trình, sau đó viết các test case nhằm phủ kín (coverage) các trường hợp cần test. Có WBT có 2 loại: Control flow và Data flow

+ Control flow: nghe khá rối rắm nhưng thực ra rất đơn giản.
Các bạn biết trong các ngôn ngữ lập trình các lệnh sẽ được thực hiện theo các cách sau:
1. Tuần tự:
2. Rẽ nhánh: như if... else...
3. Vòng lặp: for, while, loop
Như vậy nếu mình lập ra các trường hợp test cho phủ kín các cấu trúc nào thì coi như đạt yêu cầu
Ví dụ.
if (x>0)
{

}
else
{

}
Cần phải có 2 test case: 1. x>0 2. x<=0 + Data flow: Tập trung vào kiểm tra giá trị của các biến trong chương trình Biến sẽ xuất hiện theo 2 dạng: khai báo và gán giá trị Biến sẽ được sử dụng theo 2 cách: predicate (kiểm tra điều kiện) và computational (tính toán) Trên thực tế, để hiện thực cách test này phải xây dựng sơ đồ Control Flow Diagram hoặc Data Flow Diagram. Việc này có thể thực hiện tự động bằng cách phần mềm hỗ trợ. Sau khi viết các test case, có thể chạy các Coverage Tool để xem độ phủ code bao nhiêu, chỗ nào cần phải viết thêm test case. Black box testing: là phương pháp test dựa trên đầu vào và đầu ra của chương trình để test mà không quan tâm tới code bên trong được viết ra sao. Phương pháp này thường dùng để test chức năng của chương trình. Có nhiều phương pháp dành cho BBT nhưng tựu trung trải qua 3 bước sau:
1. Phân chia giá trị đầu vào thành các miền giá trị khác nhau
2. Tổ hợp các miền giá trị của các đầu vào, mỗi tổ hợp là 1 test case
3. Dựa trên ràng buộc giữa các đầu vào để giảm bớt số lượng test case.

Các phương pháp phổ biến
- Equivalence Class Partition
- Boundary Value Analysis
- Category Partition
- Cause Effect Graph

Ví dụ. Kiểm tra chức năng đăng nhập
Đặc tả: nhập user name và password, nếu đúng thì báo đăng nhập thành công, nếu sai thì báo sai mật khẩu.

Input:
- username
- password
Output:
- sai username và password
- đúng username và password

Như vậy ở đặc tả này không nói rõ yêu cầu về độ dài, kiểu ký tự của 2 thông số username và password nên ta có thể chọn bất kỳ. Ở output có 2 trường hợp đầu ra nên ta cần có 2 test case
1. Sai username và password
2. Đúng username và password

Đặc tả khác: nhập user name và password, nếu đúng thì báo đăng nhập thành công, nếu sai thì báo sai mật khẩu. Username phải có độ dài từ 4-25 ký tự, nếu không sẽ hiện thông báo yêu cầu nhập lại.

Trong trường hợp này, thì giá trị đầu vào của username có được phân thành 3 miền giá trị như sau:
- (1) độ dài của chuỗi username từ 0-3
- (2) độ dài của chuỗi username từ 4-25
- (3) độ dài của chuỗi username từ >25

Như vậy ta phải có 3 test cases cho 3 trường hợp này, đồng thời trong trường hợp 3, ta cần 2 test case nhỏ nữa cho 1. đúng username 2. sai username
Số test case tổng cộng: 4
Kết luận: số lượng test case phụ thuộc rất lớn vào đặc tả (specification) phần mềm

Áp dụng phương pháp Category Partition cho ví dụ trên
-username (u), độ dài:
1 0-3: Error
2 4-25: [property hople]
3 >25: Error
-password (p):
bất kỳ
-output (o):
1 đăng nhập thành công: [if hople]
2 đăng nhập không thành công: [if hople]
Ta có tổng cộng 4 test case như sau:
u1: username = "ab"
u2po1: username = "javadevelopervietnam.org", password="Great_Course", và tồn tại user này trong hệ thống
u2po2: username = "javadevelopervietnam.org", password="Great_Course", và không tồn tại user này trong hệ thống
u3: username = "abc23593945734973454386054654"












No comments:

Post a Comment