Bài giảng Công nghệ phần mềm - Chương 6: Kiểm thử phần mềm
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
Bạn đang xem trước 20 trang tài liệu Bài giảng Công nghệ phần mềm - Chương 6: Kiểm thử phần mềm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
PHẦN 4: KIỂM THỬ
CHƯƠNG 6:
KIỂM THỬ PHẦN MỀM
Mục tiêu
Nội dung
Mục
tiêu
T h ự c
h i ệ n
c h ư ơ n
g t r ì n
h đ ể t
ì m l ỗ
i
Khám phá các lỗi tiềm ẩn
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
Nâng cao độ
tin cậy của
phần mềm
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
1 . G
i ớ i t
h i ệ u
4. Gỡ lỗi
2 . C á c k
ỹ t h u ậ t
k i ể m t h
ử
3. Các chiến lược kiểm thử
Nội dung
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
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.
9 Không để lỗi sai lọt vào chương trình (đơn thể, chương trình
con)
9 Không để lỗi sai lọt vào hệ thống chương trình.
9 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
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.2 Nguyên tắc:
1.3 Khái niệm các kiểm thử (test cases):
Dữ liệu Input.
Thao tác kiểm thử
Dữ liệu output của chương trình
Các kiểm thử cho White-Box: Dựa vào cấu trúc
điều khiển của CT.
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 :
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.
Tất cả các điều kiện logic đều được thực hiện.
Tất cả vòng lặp đều được thực hiện tại biên.
Kiểm tra tất cả cấu trúc dữ liệu nhằm đảm bảo tính hợp lệ.
Kiểm thử
Hộp trắng
2 . 1 .
1 K
i ể m
t h ử
đ ư
ờ n g
c ơ
b ả n
( B a
s i s
P a t
h T
e s t i
n g )
2.1.4 Kiểm thử điều kiện
(Condition Testing)
2 . 1 . 2 K
i ể m t h ử
l u ồ n g d
ữ l i ệ u
( D a t a F
l o w T e
s t i n g )
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
a. Đồ thị dòng chảy
b. Các đường độc lập cơ bản
c. Các cách tính khác của độ phức tạp chu trình
d. Các bước thực hiện để tạo kiểm thử
a. Đồ thị dòng chảy
Đồ thị dòng chảy xây dựng từ lưu đồ thuật giải hay mã CT
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)
Cạnh có hướng mô tả đường thực hiện.
Tuần tự
Rẽ nhánh Lựa chọn
while do ...while
Ví dụ:
5
1
2
3
46
7 8
9
10
11
1
2
3
4
5
6
7 8
9
10
11
Lưu đồ Đồ thị dòng chảy
Ví dụ:
1
2
34
6 5
7
8
9
while (x == 0)
{
if (y ==0)
z = 0;
else
if (k == 0)
z = 1;
else
x = 1;
}
Đồ thị dòng chảy
(DT1)
Ghi chú:
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.
Mỗi node mô tả một điều kiện đơn gọi là node vị ngữ
(Predicate)
ab
x
y
Sơ đồ dòng chảy
if (a&&b)
y;
else
x;
a
b
y
x
1
1
0
0
Phân tích
if (a)
{
if(b)
y;
else
x;
}
else
x;
Lưu đồ
!(a&&b) ≡
!a || !b
while (a || b)
x;
Phân rã Lưu đồ
Sơ đồ dòng chảy
b. Các đường độc lập cơ bản
Đườ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
đó.
Độ phức tạp chu trình được định nghĩa là
tổng số các đường độc lập cơ bản.
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:
Liệt kê:
Đường 1: 1->9
Đường 2: 1->2->3->8->1...
Đường 3: 1->2->4->5->7->8->1...
Đường 4: 1->2->4->6->7->8->1...
Tổng số đường:
V(G) = P+1 = 3 + 1 = 4
Các node phân nhánh: 2, 4, 1
1
2
34
6 5
7
8
9
c. Các cách tính khác của độ phức tạp chu trình
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.
1
2
3
4
5
6
7 8
9
10
11
Độ phức tạp chu trình còn có thể
tính theo các cách khác sau đây:
V(G)= E – N + 2;
( trong đó: E số cạnh, N số node )
V(G) = Số vùng trong lưu đồ.
Node
Cạnh
Vùng
Ví dụ: xem đồ thị dòng chảy:
Tổng số đường:
Cách 1:
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(G) = Số vùng trong lưu đồ
= 4
1
2
3
4
5
6
7 8
9
10
11
v 1
v 2
εΛ
V4
d. Các bước thực hiện để tạo kiểm thử
Thiết lập một kiểm thử cho mỗi đường độc lập cơ bản.
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
1
3
2
4
5
6
7
8
9
11
10
12
c>0
a<b+c
a=c
a=b
b=c
a2 = b2 + c2
Các node phân nhánh: 1, 2, 4, 6, 8, 9.
- Tổng số đường: V(G) = P + 1 = 6 + 1= 7
- Liệt kê các đường độc lập cơ bản:
Đường 1: 1->3->12
Đường 2: 1->2->3->12
Đường 3: 1->2->4->5->12
Đường 4: 1->2->4->6->7->12
Đường 5: 1->2->4->6->8->7->12
Đường 6: 1->2->4->6->8->9->10->12
Đường 7: 1->2->4->6->8->9->11->12
Thiết lập các kiểm thử
Kiểm thử cho đường 1: 1->3->12
– Input: a = 4, b = 2, c= 0
– Output: Lỗi
Kiểm thử cho đường 2: 1->2->3->12
– Input: a = 17, b = 5, c= 4
– Output: Lỗi
Kiểm thử cho đường 3: 1->2->4->5->12
– Input: a = 6, b = 6, c= 6
Output: Đều (Tg)
. . .
2.1.2 Kiểm thử điều kiện
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.
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ệ (, =).
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:
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.
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ệ.
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:
Đơn giản
lồng nhau
a. Vòng lặp đơn giản: với n là số lần lặp tối đa.
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:
Độ 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 :
Kiểm định độ hợp lý của các chức năng.
Phân lớp đầu vào để kiểm thử
Phân biên cho dữ liệu được truy xuất để kiểm thử
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:
Chức năng sai hay thiếu.
Lỗi giao diện
Lỗi trong cấu trúc dữ liệuhay truy xuất dữ liệu ngoài
Lỗi khởi tạo
. . .
Kiểm thử
Hộp đen
. . .
2 . 2 . 1 P
h â n c h
i a t ư ơ n
g đ ư ơ n
g
( E q u i v a
l e n c e P
a r t i t i o n
i n g )
2.2.2 Phân tích giá trị biên
(Boundary Value Analyis)
2.2.1. Phân chia tương đương
Phân các điều kiện đầu vào thành các lớp tương đương.
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
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.
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ử
Mở đầu
Kiểm thử đơn vị
Kiểm thử tích hợp
Kiểm thử chức năng
Kiểm thử hệ thống
3.1 Mở đầu
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.
Xác minh (Verification) là quá trình khẳng định chương trình
xây dựng đúng theo thiết kế.
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
Các mức
kiểm thử
K i ể
m
t h ử
đ ơ
n v
ị
Kiểm thử hệ thống
K i ể m
t h ử
t í c h
h ợ p
Kiểm thử hợp lệ
T ừ
t r ê n
x u
ố n g
Từ dưới lên
3.2 Kiểm thử đơn vị:
( Unit testing)
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
Thường dùng phương pháp
White-Box
Có thể tiến hành cùng lúc
nhiều modun.
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
--------------
--------------
--------------
--------------
--------------
--------------
-Giao diện
-cấu trúc dữ liệu địa phương
Điều kiện biên
-Đường thực hiện,
-...
Các kiểm thử
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.
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.
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)
Kiểm thử trong quá trình tích hợp là cần thiết vì:
9Dữ liệu có thể mất qua giao diện.
9Modun này có thể làm sai lạc các modun khác
9 . . .
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.
Có 2 hướng tích hợp chính:
9Từ trên xuống
9Từ dưới lên.
3.3.1 Tích hợp từ trên xuống (Top-Down Integration)
Là một cách làm tăng tiến để xây dựng kiến trúc chương trình.
Các modun được tích hợp xuống theo cấu trúc điều khiển.
Có thể đi theo chiều sâu (defth first) hay chiều rộng (breadth
first).
Đi theo chiều sâu: nhánh
9 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
Đi theo chiều rộng:
9 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
M2 M3 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:
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.
Một driver được viết để kết hợp các kiểm thử đầu vào và đầu
ra
Toàn bộ cụm được kiểm tra
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
D1 D2 D3
C
l
u
s
t
e
r
1
Cluster 2
3.3.3 Kiểm thử lại (Regression Testing)
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 đó.
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 .
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)
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.
Áp dụng phương pháp Black-Box.
Kiểm thử hợp lệ bao gồm:
9Xem xét lại cấu hình phần mềm
9Kiểm thử Alpha
9Kiểm thử Beta
1. Xem xét cấu hình phần mềm
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
Kiểm thử
hợp
lệ
Phê chuẩn
quản lý
Xét
duyệt
cấu hình
Phần mềm tích hợp
Các yêu cầu
Tư liệu người sử dụng
Tư liệu người sử dụng
Tư liệu thiết kê
Các tư liệu kiểm thử
Phần mềm hợp lệ
C ấ u
h ì n h
p h ù
h ợ p
Phát hành Phần mềm
2. Kiểm thử Alpha
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.
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
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.
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.
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)
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.
Ta thường dùng các kiểu kiểm thử hệ thống sau:
9 Kiểm tra tính phục hồi dữ liệu (Recovery Testing).
9 Kiểm tra tính bảo mật (Security Testing).
9 Kiểm tra hiệu suất (Performance Testing).
4. Gỡ lỗi
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ử.
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ử.
Tiến trình gỡ lỗi bao giờ cũng có một trong 2 kết quả
logic:
Nguyên nhân tìm ra: Sửa chữa và loại bỏ lỗi.
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, . . .
Gỡ lỗiXác định nguyên nhân
Sửa chữa Nguyên nhân hoài nghi
Trường hợp
kiểm thử
Kiểm thử phụ
Kết quả
Thực hiện
trường hợp
kiểm thử
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