PHẦN 4: KIỂM THỬ
CHƯƠNG 6:
KIỂM THỬ PHẦN MỀM
Mục tiêu
Nội dung
l ỗ i
ì m
t
ể
h đ
ì n
r
t
g
h ư ơ n
c
n
ệ
h i
T h ự c
Nâng cao độ tin cậy của phần mềm
Khám phá các lỗi tiềm ẩn
Mục tiêu
Tạo các kiểm thửvới khả năng cao tìm kiếm ra các lỗi tiềm ẩn
Phần mềm, Mô hình phần mềm, danh sách các yêu cầu
Kết quả tiếp nhận
Phần mềm đã được khẳng định về chất lượng.
Kết quả chuyển giao
NỘI DUNG:
1. Giới thiệu 2. Các kỹ thuật kiểm thử 3. Các chiến lược kiểm thử 4. Gỡ lỗi
u
t h ử
k i ể m
1 . G i ớ i t h i ệ C á c k ỹ t h u ậ t
2 .
Nội dung
3. Các chiến lược kiểm thử
4. Gỡlỗi
1. Giới thiệu
1.1 Mở đầu 1.2 Nguyên tắc 1.3 Khái niệm các kiểm thử (test cases)
1.1 Mở đầu
(cid:131)
Lỗi có thể xảy ra trong tất cả các giai đoạn: Xác định, phát triển, khai thác. Ngăn chặn sai sót từ đầu là việc làm đáng quan tâm. (cid:57) Không để lỗi sai lọt vào chương trình (đơn thể, chương trình
con)
(cid:131)
(cid:131)
(cid:57) Không để lỗi sai lọt vào hệ thống chương trình. (cid:57) Không để lỗi sai lọt vào giai đoạn khai thác Kiểm thử là quá trình tìm lỗi; là đánh giá cuối cùng về giai đoạn phát triển PM trước khi khai thác. Kiểm thử là một họat động rất khó được chấp nhận, đặc biệt là không phải là thành phần trong nhóm xây dựng phần mềm
1.2 Nguyên tắc:
(cid:131) (cid:131) (cid:131)
(cid:131)
(cid:131) (cid:131)
Kiểm thử nên hướng về yêu cầu khách hàng. Nên lập kế hoạch trước một thời gian dài. Áp dụng nguyên lý Pareto: 80% lỗi có nguyên nhân từ 20% lỗi của các modun nhỏ hơn. Quá trình kiểm thử tiến hành từ các thành phần nhỏ đến các thành phần lớn hơn. Kiểm thử theo kiểu vét cạn là không khả thi. Nên có thành phần thứ 3 độc lập với người dùng và bộ phận phát triển PM
1.3 Khái niệm các kiểm thử (test cases):
Thao tác kiểm thử
(cid:131) Dữ liệu Input. (cid:131) (cid:131) Dữ liệu output của chương trình
(cid:131) Các kiểm thử cho White-Box: Dựa vào cấu trúc
điều khiển của CT.
(cid:131) Các kiểm thử cho Black-Box: Dựa vào yêu cầu
chức năng phần mềm.
2. Các kỹ thuật kiểm thử
2.1 Kiểm thử hộp trắng 2.2 Kiểm thử hộp đen
2.1 Kiểm thử hộp trắng (White -box testing) Mục tiêu:
Sử dụng các cấu trúc điều khiển để tạo ra các kiểm thử với mục tiêu :
(cid:145) Bảo đảm mọi đường thực hiện độc lập trong một modun được
thực hiện ít nhất 1 lần.
(cid:145) Tất cả các điều kiện logic đều được thực hiện. (cid:145) Tất cả vòng lặp đều được thực hiện tại biên. (cid:145) Kiểm tra tất cả cấu trúc dữ liệu nhằm đảm bảo tính hợp lệ.
n
ả
ơ b g )
g c s ti n
n e
a
i ệ u
ờ ư ử đ 2 . 1 . 1 K i ể m t h a t h T s i s P ( B t h ử l u ồ n g d ữ l i n g ) 2 . 1 . 2 K i ể m
( D a t a F l o w T e s t
2.1.4 Kiểm thử điều kiện (Condition Testing)
Kiểm thử Hộp trắng 2.1.3 Kiểm thử vòng lặp (Loop Testing)
2.1.1 Kiểm thử đường độc lập cơ bản
Các cách tính khác của độ phức tạp chu trình
a. Đồ thị dòng chảy b. Các đường độc lập cơ bản c. d. Các bước thực hiện để tạo kiểm thử
a. Đồ thị dòng chảy (cid:145) Đồ thị dòng chảy xây dựng từ lưu đồ thuật giải hay mã CT (cid:145) Mỗi nút hình tròn biểu diễn một hay nhiều câu lệnh.
(Mỗi điều kiện là phân nhánh hoặc hợp nhánh phải đưa thành node)
(cid:145) Cạnh có hướng mô tả đường thực hiện.
Rẽ nhánh
Lựa chọn
Tuần tự
while
do ...while
Ví dụ:
1
1
2
2 3
3 4 6
4 6 7 8 5
7 8 5
9
10 9
10
11
11
Đồ thị dòng chảy Lưu đồ
Ví dụ:
while (x == 0)
1
{
if (y ==0)
2
z = 0;
4 3
else
if (k == 0)
6 5
z = 1;
else
7
x = 1;
8
}
9
Đồ thị dòng chảy
(DT1)
Ghi chú: (cid:145) Phải phân rã tất cả các điều kiện phức thành các điều kiện
đơn.
(cid:145) Mỗi node mô tả một điều kiện đơn gọi là node vị ngữ
(Predicate)
Phân tích
if (a)
Lưu đồ
{
0 a
if(b)
y;
1 !(a&&b) ≡ !a || !b 0 x b
else
1
if (a&&b)
x;
y;
}
else
else
y
x;
x;
a
b
x
Sơ đồ dòng chảy
y
while (a || b)
Phân rã
x;
Sơ đồ dòng chảy
Lưu đồ
b. Các đường độc lập cơ bản
(cid:145)Đường độc lập cơ bản là các đường từ node bắt đầu đến node kết thúc sao cho đường đang xét ít nhất đi qua 1 cạnh chưa được duyệt qua bởi các đường liệt kê trước đó.
(cid:145)Độ phức tạp chu trình được định nghĩa là
tổng số các đường độc lập cơ bản.
(cid:145)Gọi V(G) là độ phức tạp chu trình, V(G) có
thể tính được bằng công thức sau đây:
V(G) = P +1; với P là số node vị ngữ
Ví dụ: xem đồ thị dòng chảy:
1
2
Liệt kê: (cid:145) Đường 1: 1->9 (cid:145) Đường 2: 1->2->3->8->1... (cid:145) Đường 3: 1->2->4->5->7->8->1... (cid:145) Đường 4: 1->2->4->6->7->8->1...
4 3
Tổng số đường:
6 5
V(G) = P+1 = 3 + 1 = 4 Các node phân nhánh: 2, 4, 1
7
8
9
c. Các cách tính khác của độ phức tạp chu trình
Node
Cạnh
1
Vùng
2
(cid:145) Các cạnh của đồ thị dòng chảy sẽ tạo ra biên của nhiều vùng (Region) của đồ thị.Vùng ở ngoài đồ thị cũng được xem là một vùng.
3
6 4
7 8 5
9
(cid:145) Độ phức tạp chu trình còn có thể tính theo các cách khác sau đây: (cid:153) V(G)= E – N + 2; ( trong đó: E số cạnh, N số node ) (cid:153) V(G) = Số vùng trong lưu đồ.
10
11
Ví dụ: xem đồ thị dòng chảy:
1
v 1
V4
2
Tổng số đường: Cách 1:
3
6 4
V(G) = P+1 = 3 + 1 = 4 Các node phân nhánh: 6, 3, 1 Cách 2:
εΛ
V(G)= E – N + 2 = 13 – 11+2 = 4
Cách 3:
v 2
7 8 5
V(G) = Số vùng trong lưu đồ
9
= 4
10
11
d. Các bước thực hiện để tạo kiểm thử
(cid:145) Thiết lập một kiểm thử cho mỗi đường độc lập cơ bản. (cid:145) Dựa vào thuật giải để tìm ra một dữ liệu input, sau đó tính dữ liệu output xem có đáp ứng mong đợi của thuật giải
Ví dụ: Xét đồ thị dòng chảy sau
a=c
5
a
4
a=b
7 2
c>0
b=c
6
1 8
a2 = b2 + c2
10 3 9
12
Các node phân nhánh: 1, 2, 4, 6, 8, 9.
11
- Tổng số đường: V(G) = P + 1 = 6 + 1= 7
- Liệt kê các đường độc lập cơ bản: (cid:145) Đường 1: 1->3->12 (cid:145) Đường 2: 1->2->3->12 (cid:145) Đường 3: 1->2->4->5->12 (cid:145) Đường 4: 1->2->4->6->7->12 (cid:145) Đường 5: 1->2->4->6->8->7->12 (cid:145) Đường 6: 1->2->4->6->8->9->10->12 (cid:145) Đường 7: 1->2->4->6->8->9->11->12
Thiết lập các kiểm thử
(cid:145) Kiểm thử cho đường 1: 1->3->12
– Input: a = 4, b = 2, c= 0 – Output: Lỗi
(cid:145) Kiểm thử cho đường 2: 1->2->3->12
– Input: a = 17, b = 5, c= 4 – Output: Lỗi
(cid:145) Kiểm thử cho đường 3: 1->2->4->5->12
– Input: a = 6, b = 6, c= 6
(cid:145) Output: Đều (Tg) (cid:145) . . .
2.1.2 Kiểm thử điều kiện (cid:131) Phương pháp tạo các kiểm thử dựa vào các điều kiện logic của
chương trình.
(cid:131) Một điều kiện đơn giản là một điều kiện Boolean (true/falsse)
hay điều kiện quan hệ (<, >, <=, >=).
(cid:131) Một điều kiện phức tạp bao gồm các điều kiện đơn giản nối
kết bằng các toán tử quan hệ (&&, ||, !,. . .)
Các chiến lược kiểm thử điều kiện bao gồm:
(cid:131) Kiểm nhánh: Phân rã các điều kiện tổng hợp thành các điều kiện đơn giản và thực hiện kiểm thử trên các nhánh đơn giản này ít nhất 1 lần.
(cid:131) Kiểm lĩnh vực: Các kiểm thử dựa vào điều kiện quan hệ
và tóan tử quan hệ.
(cid:131) Kiểm nhánh và quan hệ: Thực hiện trên các điều kiện tổng hợp. Tất cả các tổ hợp có thể có từ các điều kiện đơn giản đều được kiểm thử
2.1.3 Kiểm thử luồng dữ liệu
Phương pháp tạo các kiểm thử dựa vào vị trí khai báo và qua trình sử dụng biến trong chương trình, gọi là chuỗi khai báo sử dụng của biến. Mỗi chuỗi cần được duyệt qua và kiểm thử ít nhất 1 lần. Phương pháp này không đảm bảo mọi nhánh thực hiện chương trình nhưng thích hợp để kiểm tra độ chính xác của dữ liệu khi thực hiện.
2.1.4 Kiểm thử vòng lặp Xét các loại vòng lặp: (cid:131) Đơn giản (cid:131) lồng nhau
a. Vòng lặp đơn giản: với n là số lần lặp tối đa.
(cid:131)
(cid:131)
(cid:131)
(cid:131)
(cid:131)
Thực hiện các bước: Bỏ qua không thực hiện Thực hiện vòng lặp 1 lần Thực hiện vòng lặp 2 lần Thực hiện vòng lặp m lần (m < n) Thực hiện vòng lặp tại biên lặp trên, qua n-1, n, n+1 lần thực hiện.
b. Vòng lặp lồng nhau:
(cid:131)
(cid:131)
(cid:131)
Độ phức tạp của các vòng lặp lông nhau có thể rất lớn, có thể không kiểm thử hiệu quả được. Hướng giải quyết sẽ là: Bắt đầu từ vòng lặp bên trong nhất, tất cả các vòng lặp ngoài đặt biến điều khiển ở mức thấp nhất. Thực hiện kiểm thử vòng lặp đơn giản cho vòng lặp trong nhất này. Thực hiện tiếp tục dần ra ngoài cho đến hết vòng lặp.
2.2 Kiểm thử hộp đen (black- box testing)
Kiểm thử hộp đen tập trung vào các chức năng hệ thống (không quan tâm đến cáu trúc bên trong), tạo ra các kiểm thử với mục tiêu :
(cid:145) Kiểm định độ hợp lý của các chức năng. (cid:145) Phân lớp đầu vào để kiểm thử (cid:145) Phân biên cho dữ liệu được truy xuất để kiểm thử (cid:145) Kiểm định lưu lượng và mật độ dữ liệu hệ thống.
Các lỗi thường được phát hiện: (cid:145) Chức năng sai hay thiếu. (cid:145) Lỗi giao diện (cid:145) Lỗi trong cấu trúc dữ liệuhay truy xuất dữ liệu ngoài (cid:145) Lỗi khởi tạo (cid:145) . . .
t ư ơ n g đ ư ơ n g i o n i n g )
t
i
t
2 . 2 . 1 P h â n c h i a ( E q u i v a l e n c e P a r
. . .
Kiểm thử Hộp đen 2.2.2 Phân tích giá trị biên (Boundary Value Analyis)
2.2.1. Phân chia tương đương (cid:131) Phân các điều kiện đầu vào thành các lớp tương đương. (cid:131) Chỉ cần kiểm thử trên mỗi lớp tương đương
2.2.2. Phân tích giá trị biên (cid:131) Các lỗi xảy ra thường nằm tại các biên của các khoảng dữ liệu
đầu vào.
(cid:131) Dữ liệu đầu vào là khoảng số thì kiểm thử thực hiện tại các giá
trị gần biên dưới, biên trên
3. Các chiến lược kiểm thử
(cid:145) Mở đầu (cid:145) Kiểm thử đơn vị (cid:145) Kiểm thử tích hợp (cid:145) Kiểm thử chức năng (cid:145) Kiểm thử hệ thống
3.1 Mở đầu (cid:131) Quá trình phát triển PM đi từ trên xuống, trong khi đó chiến
lược kiểm thử PM đi từ dưới lên. Bắt đầu từ các modun tạo mã đến quá trình tích hợp theo thiết kế, xác minh và khẳng định tính hợp lệ của PM với các yêu cầu đặt ra.
(cid:131) Xác minh (Verification) là quá trình khẳng định chương trình
xây dựng đúng theo thiết kế.
(cid:131) Hợp lệ (Validation) là quá trình khẳng định PM xây dựng thỏa
mãn mọi yêu cầu đặt ra.
Phân tích toàn bộ hệ thống
Kiểm thử toàn bộ hệ thống
Phân tích Yêu cầu
Kiểm thử hợp lệ
Thiết kế phần mềm
Kiểm thử tích hợp
Mã hóa
Kiểm thử đơn vị
Quan hệ giữa các giai đọan phát triển và kiểm thử PM
g
n
ố
u
n x
ừ tr ê
T
Kiể m th ử đơ n vị
h h ợ p
c
t í
K i ể m t h ử
Từ dưới lên
Kiể
m thử
hệthống
Các mức kiểm thử Kiểm thử hợp lệ
3.2 Kiểm thử đơn vị: ( Unit testing)
-Giao diện
-cấu trúc dữ liệu địa phương
Điều kiện biên
(cid:131) Tiến hành cho mỗi đơn vị nhỏ nhất của PM, đó là các modun mã nguồn đã được dịch thành công
(cid:131) Thường dùng phương pháp
-Đường thực hiện,
White-Box
-...
(cid:131) Có thể tiến hành cùng lúc
nhiều modun.
(cid:131) Kiểm thử theo trình tự: giao diện, cấu trúc dữ liệu địa phương, điều kiện biên, đường thực hiện, ...
Modun -------------- -------------- -------------- -------------- -------------- --------------
Các kiểm thử
(cid:131) Mỗi modun mã nguồn không phải là chương trình hoàn chỉnh và đôi khi phải gọi các modun chưa được kiểm nghiệm khác. Do đó phải xây dựng các driver hoặc stub. (cid:131) Driver (chương trình điều khiển) là chương trình chính có nhiệm vụ nhận dữ liệu kiểm thử, chuyến dữ liệu đó xuống cho modun để kiểm tra và in ra kết quả kiểm tra tương ứng.
(cid:131) Stub thay thế các modun được gọi là modun đang kiểm
tra
3.3 Kiểm thử tích hợp (Integration testing) (cid:131) Kiểm thử trong quá trình tích hợp là cần thiết vì:
(cid:57) Dữ liệu có thể mất qua giao diện. (cid:57) Modun này có thể làm sai lạc các modun khác (cid:57) . . .
(cid:131) Kiểm thử tích hợp là kỹ thuật thực hiện một cách có hệ thống lắp ghép cấu trúc chương trình, đồng thời thực hiện các kiểm thử phát hiện lỗi giao diện. (cid:131) Có 2 hướng tích hợp chính:
(cid:57) Từ trên xuống (cid:57) Từ dưới lên.
3.3.1 Tích hợp từ trên xuống (Top-Down Integration) (cid:131) Là một cách làm tăng tiến để xây dựng kiến trúc chương trình. (cid:131) Các modun được tích hợp xuống theo cấu trúc điều khiển. (cid:131) Có thể đi theo chiều sâu (defth first) hay chiều rộng (breadth
first).
(cid:131) Đi theo chiều sâu: nhánh
(cid:57) Tại mỗi nhánh, các modun con lần lượt ghép nối, những nhánh chưa được ghép nối hay modun thấp hơn sẽ được thay bằng các modun giả lập. Sau khi thực hiện xong tại 1 nhánh, các modun giả lập dần được thay đổi ở mức thấp và ở các nhánh khác
(cid:131) Đi theo chiều rộng:
(cid:57) Tích hợp theo từng mức. Tất các các modun tại một mức sẽ dần được
tích hợp. Các modun ơ mức thấp thay bằng modun giả lập.
Quá trình tích hợp bao gồm các bước: 1. Modun chính được dùng làm điều khiển kiểm thử, các modun
giả lập nối trực tiếp vào modun này
2. Tùy vào cách tích hợp, từng modun giả lập sẽ được thay bằng
modun thật.
3. Kiểm thử được thực hiện với từng modun thay thế 4. Khi kết thúc một kiểm thử, một modun khác lại được thay thế
bằng modun thật.
5. Kiểm thử lại có thể được thực hiện nhằm bảo đảm quá trình tích hợp modun mới không làm ảnh hưởng kết quả kiểm thử cũ.
Tích hợp từ trên xuống (theo chiều sâu)
M1
M3 M2 M4
M5 M6 M7
M8 M9
3.3.2 Tích hợp từ dưới lên (Bottom-Up Integration)
Bắt đầu từ các modun ở mức thấp nhất, sau đó các modun được tích hợp dần lên. Quá trình tích hợp gồm các bước:
(cid:131) Các modun thấp được tích hợp thành các cụm (cluster) thực
hiện một phần chức năng cụ thể của PM.
(cid:131) Một driver được viết để kết hợp các kiểm thử đầu vào và đầu
ra
(cid:131) Toàn bộ cụm được kiểm tra (cid:131) Các driver bị loại bỏ, các cụm được kết hợp tiếp lên để hình
thành cấu trúc chương trình. Quá trình kiểm thử này dễ dàng thực hiện hơn, nhưng lại tốn nhiều sức để viết các driver
Tích hợp từ dưới lên
M0
Ma Mb
l
1 r e t s u C
D1 D2 D3
Cluster 2
3.3.3 Kiểm thử lại (Regression Testing) (cid:131) Khi một modun mới được thêm vào, phần mềm sẽ thay đổi.Những luồng dữ liệu mới, những điều khiển mới. . .được thêm vào có thể thay đổi những gì thực hiện trước đó.
(cid:131) Kiểm thử lại là hoạt động nhằm đảm bảo những thay đổi do
trong quá trình tích hợp .
(cid:131) Kiểm thử lại chỉ lấy một phần của bộ kiểm thử trước đó để thực hiện, chẳng hạn một số mẫu chức năng hệ thống, các kiểm thử trên các chức năng có thể bị thay đổi,...
3.3 Kiểm thử hợp lệ (chức năng) (cid:131) Kiểm thử các chức năng phần mềm có phù hợp với các yêu cầu chức năng trong hồ sơ phân tích yêu cầu.
(cid:131) Áp dụng phương pháp Black-Box. (cid:131) Kiểm thử hợp lệ bao gồm:
(cid:57)Xem xét lại cấu hình phần mềm (cid:57)Kiểm thử Alpha (cid:57)Kiểm thử Beta
1. Xem xét cấu hình phần mềm
(cid:145) Nhằm đảm bảo các chức năng phần mềm được phát triển một cách đúng đắn và phù hợp với các đặc tả phân tích, thiết kế phần mềm
Phần mềm tích hợp
Các yêu cầu
Tư liệu người sử dụng
Phần mềm hợp lệ
Kiểm thử hợp lệ
h ợ p
ù
h
h p
Phát hành Phần mềm
u h ì n
C ấ
Tư liệu người sử dụng
Tư liệu thiết kê
Phê chuẩn quản lý
Các tư liệu kiểm thử
Xét duyệt cấu hình
2. Kiểm thử Alpha
(cid:145) Kiểm thử Alpha được khách hàng tiến hành tại cơ quan của nhà phát triển phần mềm. Phần mềm được khách hàng sử dụng qua sự sắp đặt tự nhiên của nhà phát triển, lỗi phần mềm và các vấn đề sử dụng sẽ được ghi lại.
(cid:145) Kiểm thử Alpha được tiến hành trong một môi trường có
kiểm soát
3. Kiểm thử Beta
(cid:145) Tiến hành ngoài nơi sản xuất phần mềm. Khách hàng sẽ thực hiện tại một hay nhiều cơ quan của khách hàng và nhà phát triển không có mặt.
(cid:145) Do đó, kiểm thử beta là việc thực hiện phần mềm trong
môi trường mà nhà phát triển không kiểm sóat được.
(cid:145) Khách hàng sẽ ghi lại tất cả các lỗi của phần mềm, các vấn đề sử dụng và chuyển lại cho nhà phát triển giải quyết.
3.4 Kiểm thử hệ thống (System testing)
(cid:131) Phần mềm là một yếu tố của một hệ thống dựa trên máy tính, chảng hạn phần cứng, cơ sở dữ liệu, tài liệu, . . .Cuối cùng phần mềm sẽ được tổ hợp với các yếu tố hệ thống khác để tạo hệ thống dựa trên máy tính, nên sẽ phải tiến hành các kiểm thử trên hệ thống.
(cid:131) Ta thường dùng các kiểu kiểm thử hệ thống sau: (cid:57) Kiểm tra tính phục hồi dữ liệu (Recovery Testing). (cid:57) Kiểm tra tính bảo mật (Security Testing). (cid:57) Kiểm tra hiệu suất (Performance Testing).
4. Gỡ lỗi
(cid:145) Gỡ lỗi không phải là kiểm thử, nhưng bao giờ cũng xuất
hiện như là một hệ quả của kiểm thử.
(cid:145) Tiến trình gỡ lỗi bắt đầu với thực hiện một trường hợp kiểm thử, thực hiện các kỹ thuật kiểm thử, các chiên lược kiểm thử, cho ra kết quả kiểm thử.
(cid:145) Tiến trình gỡ lỗi bao giờ cũng có một trong 2 kết quả
logic:
(cid:145) Nguyên nhân tìm ra: Sửa chữa và loại bỏ lỗi. (cid:145) Nguyên nhân không tìm ra: Người thực hiện đặt giả thiết các nguyên nhân, thiết kế trường hợp kiểm thử, tiến hành thực hiện kiểm thử, tiến hành lặp lại các bước gỡ lỗi, . . .
Thực hiện trường hợp kiểm thử Trường hợp kiểm thử
Kiểm thử phụ
Sửa chữa Nguyên nhân hoài nghi
Kết quả
Gỡ lỗi Xác định nguyên nhân
Bài tập
Đề 1: Cho đoan trình:
if(a||b) x; else y; - Tạo sơ đồ dòng chảy. - Thiết lập các kiểm thủ cho các đươnf độc lập cơ bản
Đề 2: Cho đoạn trình:
while (a&&b)
x;
- Tạo sơ đồ dòng chảy tương ứng - Thiết lập các kiểm thử cho các đường độc lập cơ bản