kiểm thử phần mềm
[6] kiểm thử hộp trắng
Kiểm thử phần mềm
[6] Kỹ thuật kiểm thử hộp trắng
Hirohisa Aman
(C) 2007-2022 Hirohisa AMAN
1
phương pháp kiểm thử hộp
trắng
Thiết kế test case
dựa vào cấu trúc
nội tại bên trong
của đối tượng cần
kiểm thử.
Đảm bảo tất cả các
câu lệnh, các biểu
thức điều kiện bên
trong chương trình
đều được thực hiện
ít nhất một lần
(C) 2007-2022 Hirohisa AMAN
2
Các kỹ thuật phương pháp kiểm
thử hộp trắng
Basis Path Testing
Control-flow/Coverage Testing
Data-flow Testing
(C) 2007-2022 Hirohisa AMAN
3
Các cấp bao phủ kiểm thử
Phủ cấp 0:
thửcâu
những
có thể kiểm
1: kiểm
Bao phủ
lệnhgì(statement/
thử
được, phần
còn lại Các
để người
dùng
phát
instruction
coverage):
câu lệnh
được
hiện
báo
lại sau.
Đây là kiểm thử khơng
thực và
hiện
ít nhất
1 lần
có trách nhiệm
Phủ cấp 2: Bao phủ nhánh (branch
Phủ cấp 4: Kết hợp phủ nhánh và điều kiện
coverage):
tại các điểm
quyết định thì các
(branch & condition
coverage)
nhánh đều được thực hiện ở cả hai phía T,F
Phủ cấp 3: Bao phủ điều kiện(condition
coverage): Các điều kiện con của các điểm
quyết định được thực hiện ít nhất 1 lần
(C) 2007-2022 Hirohisa AMAN
4
Bao phủ câu lệnh
void foo(int x, int y){
int sum, n;
sum = 0;
for ( n = 0; n < x; n++ ){
sum += n;
}
if ( sum < y ){
printf("%dn", sum);
}
else{
printf("%dn", y);
}
}
[ đầu vào ]
đối số x, y
[ đầu ra ]
bản inf Giá trị đầu
ra của
(C) 2007-2022 Hirohisa AMAN
5
Source code
Thực hiện/
không thực
hiện
void foo(int x, int y){
---
int sum, n;
○
sum = 0;
○
for
sum
○
( n = 0; n < x; n++ ){
+= n;
}
if ( sum < y ){
printf("%dn", sum);
}
}
else{
else{
printf("%dn", y);
}
}
}
}
Case:
x=1, y=0
○
---
C0 =
○
☓
--------○
---------
(C) 2007-2022 Hirohisa AMAN
← sum = 0 đó là
lý do tại sao
[ Lưu ý ]
Trước, "Cần xác
định xem có được
tính là lệnh thực thi
hay không
6
C = 100% khi phủ hai case
Source code
x=1, y=0
x=1, y=1
tổng cộng
---
---
---
int sum, n;
○
○
○
sum = 0;
○
○
○
for ( n = 0; n < x; n++ ){
○
○
○
sum += n;
○
○
○
---
---
---
○
○
○
☓
-----
○
-----
○
-----
----○
---------
----☓
---------
----○
---------
void foo(int x, int y){
}
if ( sum < y ){
printf("%dn", sum);
}
}
else{
else{
printf("%dn", y);
}
}
}
}
(C) 2007-2022 Hirohisa AMAN
7
Khi vẽ lưu đồ Trường
hợp kiểm tra ① x=1, y=0
START
một số lệnh
không chạy
sum = 0
F.
sum < y
n = 0
n < x
n++
F.
T.
sumoutput
youtput
T.
sum += n
END
(C) 2007-2022 Hirohisa AMAN
8
Khi vẽ lưu đồ
Test case ② x = 1, y = 1
START
sum = 0
F.
sum < y
n = 0
n < x
n++
F.
Trong trường
hợp thử
nghiệm ở
case ①
không chạy
T.
sumoutput
youtput
T.
sum += n
END
(C) 2007-2022 Hirohisa AMAN
9
Source code
chấ
p
hàn
h
T, F
void foo(int x, int y){
---
int sum, n;
--○
sum = 0;
○
for ( n = 0; n < x; n++ ){
○
--t. f.
sum += n;
○
---
}
--○
--f.
☓
---
}
---
---
else{
--○
---
}
---
---
}
---
---
if ( sum < y ){
printf("%dn", sum);
printf("%dn", y);
---
(C) 2007-2022 Hirohisa AMAN
---
Case 1:
x=1, y=0
nhánh Tỷ lệ
bao phủ ( C.
1 )
Phương
pháp phủ
nhánh
10
Phương pháp phủ nhánhC1 = 100% khi phủ hai
case
Source code
x=1, y=0
x=1, y=1
tổng cộng
void foo(int x, int y){
---
---
---
int sum, n;
---
---
---
sum = 0;
---
---
---
for ( n = 0; n < x; n++ ){
t.
f.
t.
f.
t.
f.
sum += n;
---
---
---
}
---
---
---
f.
if ( sum < y ){
printf("%dn", sum);
t.
t.
f.
---
---
---
}
---
---
---
else{
---
---
---
---
---
---
}
---
---
---
}
---
---
---
printf("%dn", y);
(C) 2007-2022 Hirohisa AMAN
11
Khi vẽ lưu đồ Trường
hợp kiểm tra ① x=1, y=0
F.only
to
experien
ce
START
T.andF.of
experienc
e both
sum = 0
F.
sum < y
n = 0
n < x
n++
F.
T.
sumoutput
youtput
T.
sum += n
END
(C) 2007-2022 Hirohisa AMAN
12
for that
reason,
branchCov
erage rate
(C.1) 3/4
Khi vẽ lưu đồ
Test case ② x = 1, y = 1
In test case ①
did not run
"T." side cover
START
sum = 0
F.
sum < y
n = 0
n < x
n++
F.
T.
sumoutput
youtput
T.
sum += n
END
(C) 2007-2022 Hirohisa AMAN
13
Hãy xem xét một ví dụ khác
Hãy xem xét một chương trình thực
hiện kiểm tra bảo mật đơn giản đối
với mật khẩu
[ Kiểm tra mục ]
Độ dài mật khẩu là 6 Có nhiều hơn các
chữ cái khơng?
Mật khẩu của bạn có giống với tên người
dùng của bạn không?
(C) 2007-2022 Hirohisa AMAN
14
bao phủ nhánh 75 % ( =3/4 )
test case
START
(user name, password)
① ("taro","")
② ("taro","foobar")
③ ("taro","taro")
②
T.
password length
>= 6
①
③
F.
F.
Nooutput
password
!=User name
②
T.
OKoutput
END
(C) 2007-2022 Hirohisa AMAN
15
[ Bài tập 1 ]
Tính phạm vi hướng dẫn và phạm vi
chi nhánh
Tôi đã chạy hai
trường hợp thử
nghiệm cho đoạn
mã bên phải
(n, giới hạn)
= (2, 1), (-2, 0)
C1 và C0 là bao
nhiêu
if ( n < 0 ){
n *= -1;
}
sum = 0;
for (i= 0;i
sum +=i;
if ( sum > limit ){
sum = 0;
}
}
printf("%dn", sum);
(C) 2007-2022 Hirohisa AMAN
16
[Bài tập 1]Đáp án: 100% for ①
and ②
test case
START
(n, limit)=
①(2, 1)
② (-2, 0)
i = 0
F.
n < 0
① ②
i < n
T.
n *= -1
①
F.
T.
sum += i
①
sumoutput
sum = 0
i++
F.
sum > limit
T.
②
①
sum = 0
END
(C) 2007-2022 Hirohisa AMAN
17
[ Bài tập 2 ]
Tính phủ sóng nhánh
(lưu ý) trả lại việc thi hành án
Khi đó , tại hàm thời gian
đến mức phải cẩn thận
intis_prime(int n){
int k;
is_prime (1);
if ( n < 2 ){
return 0;
is_prime (2);
}
Tính C1 với hai test for ( k = 2; k < n; k+
+ ){
case trên
if ( n % k == 0 ){
return 0;
}
}
return 1;
}
(C) 2007-2022 Hirohisa AMAN
18
Test case
Bài tập 2 lưu ý cho
Source code
n=1
điều kiện
thực hiện
n=2
điều kiện
thực hiện
---
---
---
return 0;
---
---
---
}
---
---
---
return 0;
---
---
---
}
---
---
---
}
---
---
---
19
---
int k;
tổng cộng
if ( n < 2 ){
for ( k = 2; k < n; k+
+ ){
if ( n % k == 0 ){
return 1;
(C) 2007-2022 Hirohisa AMAN
---
---
nhánh Tỷ lệ bao phủ ( C.
1 )
[ Bài tập 2 ]
Source code
n=1
điều kiện
thực hiện
int k;
○
if ( n < 2 ){
○
return 0;
○
}
if ( n % k == 0 ){
return 1;
---
---
☓
---
---
---
---
☓
○
☓
☓
☓
☓
}
}
t.
-----
☓
-----
(C) 2007-2022 Hirohisa AMAN
tổng cộng
○
○
---
for ( k = 2; k < n; k+
+ ){
return 0;
---
n=2
điều kiện
thực hiện
○
f.
f.
--TF
f.
---
---
---
---
---
---
---
---
20