Professional Documents
Culture Documents
Chương 3
1
Nội dung
2
Tổng quan
3
Kiểm thử cấu trúc
4
Kiểm thử cấu trúc
5
Định nghĩa đồ thị chương trình
“Cho một chương trình trong ngôn ngữ mệnh lệnh, đồ thị
chương trình của nó là một đồ thị có nhãn, có hướng
trong đó
- Đỉnh là các nhóm lệnh hoặc một phần của một lệnh
- Cạnh là luồng điều khiển”
6
Các thành phần của đồ thị
7
Đồ thị chương trình
8
Ví dụ các khối cơ bản
FindMean (FILE ScoreFile)
{ float SumOfScores = 0.0;
int NumberOfScores = 0;
1
float Mean=0.0; float Score;
Read(ScoreFile, Score);
2 while (! EOF(ScoreFile) {
3 (Score > 0.0 ) {
if
SumOfScores = SumOfScores + Score;
4
NumberOfScores++;
}
5
Read(ScoreFile, Score); 6
}
/* Compute the mean and print the result */
7 if (NumberOfScores > 0) {
Mean = SumOfScores / NumberOfScores;
printf(“ The mean score is %f\n”, Mean); 8
} else
printf (“No scores found in file\n”); 9
} 9
Sơ đồ khối
Start
F
2
T
3
T F
4 5
7
T F
8 9
Exit
10
Đồ thị chương trình
11
Đồ thị chương trình và đường đi?
1. x = z+5
2. z = 4*3 - y
3. if(x > z) goto A;
4. for( u=0; u < x; u++) {
5. z = z+1;
6. };
7. A: y = z + k
12
Các đường kiểm thử
1. x = z+5 1
2. z = 4*3 - y
3. if(x > z) goto A; x = z+5 Một số đường kiểm thử:
4. for( u=0; u < x; u++) z = 4*3 -y 1, 2, 3, 4, 6, 7
{ 1, 2, 3, 4, 5, 4, 6, 7
5. z = z+1; 1, 2, 6, 7
6. }; x>z 2
7. A: y = z + k t
f 6
R1
R2
3
y = z+k
5 t f
u=0
z = z+1
u++ R3 7
4
u<x
14
Độ đo kiểm thử
16
Độ đo kiểm thử cấp 1 (C1)
Mỗi câu lệnh được thực hiện ít nhất một lần
sau khi chạy bộ kiểm thử.
17
Độ đo kiểm thử cấp 2 (C2)
Mỗi điểm quyết định trong đồ thị dòng điều khiển đều được
thực hiện ít nhất một lần cho cả hai nhánh đúng và sai
18
Độ đo kiểm thử cấp 3 (C3)
Với các điều kiện phức tạp (chứa nhiều điều kiện cơ bản), mỗi điều
kiện con cần thực hiện ít nhất một lần cho cả hai nhánh đúng và sai.
19
Quy trình kiểm thử đơn vị
dựa trên độ đo
20
Ví dụ các ca kiểm thử để đạt C1
21
Ví dụ các ca kiểm thử để đạt C2
22
Ví dụ các ca kiểm thử để đạt C3
23
Kiểm thử vòng lặp
24
Chương trình chỉ có lệnh lặp
đơn giản
Cần số ca kiểm thử tương ứng với các trường hợp:
26
Ví dụ
27
Nội dung
28
Ý tưởng của kiểm thử luồng dữ
liệu
Kiểm thử luồng dữ liệu liên quan đến việc chọn
đường đi với mục tiêu bao phủ các cặp gán
(definition) và dùng (use) dữ liệu, được gọi là
các tiêu chuẩn luồng dữ liệu
Qui trình tổng quát của kiểm thử luồng dữ liệu
là:
—Vẽ đồ thị luồng dữ liệu cho chương trình
—Chọn tiêu chuẩn kiểm thử luồng dữ liệu
—Xác định các đường đi trong đồ thị để thỏa mãn tiêu chuẩn
lựa chọn (all-defs, all-uses, all-P-uses/some-C-uses, v.v..)
—Tạo các ca kiểm thử cho các đường đi đã xác định
Đỉnh gán
read (z)
x = 0
y = 0
if (z 0) {
x = sqrt (z)
if (0 x && x 5)
y = f (x)
else
y = h (z)
}
y = g (x, y)
print (y)
Ví dụ liên kết def-use
def-use cho biến z. read (z)
x=0
y=0
if (z 0)
{
x = sqrt (z)
if (0 x && x 5)
y = f (x)
else
y = h (z)
}
y = g (x, y)
print (y)
Ví dụ liên kết def-use
Variable Defined at Used at Comment
locks 9 Declaration
locks 22 READ
locks 23 Predicate use
locks 26 Computation Use
stocks 9 READ
stocks 27 Computation Use
num_locks 26 Assignment
num_locks 26 Computation Use
num_locks 33 WRITE
Tiêu chuẩn bao phủ kiểm thử
DU-Path
Ý tưởng
—Sử dụng thông tin def-use và tiêu chuẩn cụ thể để nhận
được các đường đi cụ thể trong đồ thị CFG
• Từ đó xác định các ca kiểm thử
Chúng ta giả sử T là tập các đường đi đầy đủ
và khả thi trong CFG của chương trình P và V
là tập tất cả các biến trong P
Tiêu chuẩn bao phủ DU-Path
All-P-Uses/Some-C-Uses
—Với mọi v, T gồm các đường đi dc-path từ mọi đỉnh gán
của v đến mọi đỉnh p-use của v và nếu một định nghĩa
của v không có p-use thì tồn tại một đường đi dc-path
đến ít nhất một c-use
All-C-Uses/Some-P-Uses
—Với mọi v, T gồm các đường đi dc-path từ mọi đỉnh gán
của v đến mọi đỉnh c-use của v và nếu một định nghĩa
của v không có c-use thì tồn tại một đường đi dc-path
đến ít nhất một p-use
Tiêu chuẩn bao phủ DU-Path
All-DU-Paths
—Với mọi v, T gồm các đường đi dc-path từ mọi đỉnh gán
của v đến mọi đỉnh dùng của v và đến đỉnh tiếp theo của
mỗi USE(v, n) và các đường đi này hoặc là lặp một lần
hoặc không lặp
Ví dụ All-DU-Paths: pow(x,y)
1. void pow (int x, y) /* pow(x,y) tính x mũ y với x, y là số
2. { nguyên
3. float z;
INPUT: giá trị của x và y.
OUTPUT: in x mũ y ra màn hình.
4. int p;
*/
5. if (y < 0)
6. p = 0 – y;
7. else p = y;
8. z = 1.0;
9. while (p != 0)
10. {
b g
11. z = z * x;
a d f i
12. p = p – 1; 1 5 8 9 14 16 17
13. }
14.if (y < 0) c e h
15. z = 1.0 / z;
16.printf(z);
17.}
All-DU-Paths vơi biến x
2 i=0; ti=0;
tv=0, sum=0
7 ti++;
tv > 0 4 (value[i] >= MIN &&
value[i] <= MAX)
T
F T
F
9 av = (double) sum/tv tv++;
av = (double) -999 sum= sum+value[i]
8 5
10 return(av) i++
6
Đường đi
c-use toàn cục cho biến tv: đỉnh 9 (tv được
gán ở đỉnh 2 và 5)
Các đường đi def-clear cho biến tv: 2-3-4-5,
2-3-4-6
Đường đi đơn giản: 2-3-4-5 và 3-4-6-3
Đường đi thỏa mãn All-defs cho biến tv:
—1-2-3-4-5-6-3-7-9-10,
—Và với p-uses 1-2-3-7-8-10 và 1-2-3-4-5-6-3-7-9-10
Đường đi
All-p-uses/some-c-uses cho i:
—1-2-3-4-5-6-3-7-9-10
All-c-uses/some-p-uses cho AS:
—1-2-3-4-5-6-3-7-9-10
All-uses:
—Hợp của all-c-uses và all-p-uses
All-du-paths choh tv:
—1-2-3-4-5-6-3-7-8-10 …. 1-2-3-7-9-10
Tổng kết
55