1
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
o0o
Thạc Bình Cường
Bài giảng điện tử môn học
KIỂM THỬ VÀ BẢO ĐẢM
CHẤT LƯỢNG PHẦN MỀM
3.3. Kiểm thử
tích hợp 25
3.4. Kiểm thử phát hành 27
3.5. Kiểm thử hiệu năng 31
3.6. Kiểm thử thành phần 32
3.7. Kiểm thử giao diện 33
3.8. Thiết kế trường hợp thử (Test case design) 35
3.9. Tự động hóa kiểm thử (Test automation) 45
CHƯƠNG 4: CÁC PHƯƠNG PHÁP KIỂM THỬ 49
4.1. Phương pháp white-box: 50
4.2. Phương pháp black-box: 59
CHƯƠNG 5: KIỂM THỬ TÍCH HỢP 66
5.1. Tích hợp trên xuống. 66
5.2. Tích hợp dưới lên. 68
5.3. Kiểm thử nội quy 69
5.4. Gợi ý về việc ki
ểm thử tích hợp 71
5.5. Lập tài liệu về kiểm thử tích hợp 72
CHƯƠNG 6: KỸ NGHỆ ĐỘ TIN CẬY PHẦN MỀM 75
6.1. Giới thiệu 75
6.2. Xác nhận tính tin cậy 76
6.2.1. Sơ thảo hoạt động 78
6.2.2. Dự đoán tính tin cậy 79
6.3. Đảm bảo tính an toàn 82
6.3.1. Những luận chứng về tính an toàn 83
6.3.2. Đảm bảo quy trình 86
6.3.3. Kiểm tra tính an toàn khi thực hiện 88
6.4. Các trường hợp an toàn và tin cậy được 89
3
10.2. Kế hoạch quản trị cấu hình 176
11.2. Quản lý việc thay đổi 179
11.3. Quản lý phiên bản và bản phát hành 183
11.4. Quản lý bản phát hành 186
11.5. Xây dựng hệ thống 189
11.6. Các công cụ CASE cho quản trị cấu hình 190
PHỤ LỤC- CÁC CÂU HỎI ÔN TẬP 197
1. Chất lượng và đảm bảo chất lượng phần mềm 197
2. Các độ đ
o đặc trưng chất lượng phần mềm 198
3. Kiểm thử phần mềm 199
4. Quản lý cấu hình phần mềm 201
TÀI LIỆU THAM KHẢO 202
4
MỞ ĐẦU
Quản lý chất lượng phần mềm là vấn đề không mới nhưng theo một số đánh giá là còn
yếu của các công ty phần mềm Việt Nam. Một số công ty trong nước hiện đã đạt các chuẩn
quốc tế CMM/CMMI trong nâng cao năng lực và quản lý chất lượng phần mềm, song chỉ
đếm được trên đầu ngón tay, và hiện cũng chỉ gói gọn trong vài công ty gia công cho thị
trường nước ngoài.
Lâu nay, nói đến chấ
t lượng phần mềm, không ít người nghĩ ngay đến vấn đề là xác
định xem phần mềm đó có phát sinh lỗi hay không, có "chạy" đúng như yêu cầu hay không
và cuối cùng thường quy về vai trò của hoạt động kiểm thử phần mềm (testing) như là hoạt
động chịu trách nhiệm chính.
Với quan điểm của khách hàng, điều này có thể đúng, họ không cần quan tâm nội tình
của hoạt động phát triển phần mề
m, điều họ cần quan tâm là liệu sản phẩm cuối cùng giao
cho họ có đúng hạn hay không và làm việc đúng như họ muốn hay không.
mang tính lý thuyết nhiều. Tác giả hy vọng bạn đọc đóng góp ý kiến
để phiên bản 2 đáp
ứng tốt hơn yêu cầu của nhiều độc giả, của sinh viên và kể cả những người đang công tác
tại các phòng phát triển và đảm bảo chất lượng phần mềm.
5
CHƯƠNG 1: CÁC KHÁI NIỆM
1.1. Các định nghĩa
“Lỗi phần mềm là chuyện hiển nhiên của cuộc sống. Chúng ta dù cố gắng đến mức nào
thì thực tế là ngay cả những lập trình viên xuất sắc nhất cũng không có thể lúc nào cũng
viết được những đoạn mã không có lỗi. Tính trung bình, ngay cả một lập trình viên loại tốt
thì cũng có từ 1 đến 3 lỗi trên 100 dòng lệnh. Người ta ước lượng r
ằng việc kiểm tra để tìm
ra các lỗi này chiếm phân nửa khối lượng công việc phải làm để có được một phần mềm
hoạt động được”. (Software Testing Techniques, Second Edition, by Boris Beizer, Van
Nostrand Reinhold, 1990, ISBN 1850328803).
Trên đây là một nhận định về công việc kiểm nghiệm (testing) chương trình.
Thật vậy, ngày nay càng ngày các chương trình (các phần mềm) càng trở lên phức
tạp và đồ sộ. Việc tạo ra một sản phẩm có thể bán được trên thị trườ
ng đòi hỏi sự nổ
lực của hàng chục, hàng trăm thậm chí hàng ngàn nhân viên. Số lượng dòng mã lên
đến hàng triệu. Và để tạo ra một sản phẩm thì không phải chỉ do một tổ chức đứng ra
làm từ đầu đến cuối, mà đòi hỏi sự liên kết, tích hợp của rất nhiều sản phẩm, thư viện
lập trình, … của nhiều tổ chức khác nhau… Từ đó đòi hỏ
i việc kiểm nghiệm phần
mềm càng ngày càng trở nên rất quan trọng và rất phức tạp.
Hỏng hóc (Failure):
– Xảy ra khi sai sót được thực thi. (Khi thực thi chương trình tại các nơi
bị sai thì sẽ xảy ra trạng thái hỏng hóc).
K
ết quả không mong đợi, hậu quả (Incident)
– Là những kết quả do sai sót đem đến. Hậu quả là các triệu chứng liên
kết với một hỏng hóc và báo hiệu cho người dùng biết sự xuất hiện của
hỏng hóc.
Trường hợp thử (Test case)
– Trường hợp thử được liên kết tương ứng với hoạt động của chương
trình. Một trường hợp thử
bao một một tập các giá trị đầu vào và một
danh sách các kết quả đầu ra mong muốn.
Thẩm tra (Verification)
– Thẩm tra là tiến trình nhằm xác định đầu ra của một công đoạn trong
việc phát triển phần mềm phù hợp với công đoạn trước đó.
Xác nhận (Validation)
– Xác nhận là tiến trình nhằm chỉ ra toàn hệ thống đã phát triển xong phù
hợp với tài liệu mô tả
yêu cầu.
So sánh giữa Thẩm tra và Xác nhận:
Thẩm tra: thẩm tra quan tâm đến việc ngăn chặn lỗi giữa các công đoạn.
Xác nhận: xác nhận quan tâm đến sản phẩm cuối cùng không còn lỗi.
1.2. Vòng đời của việc kiểm nghiệm (testing life cycle):
Bảng dưới đây mô tả các công đoạn phát triển một phần mềm và cách khắc phục lỗi.
Lỗi có thể xảy ra trong tất cả
các công đoạn từ “Mô tả yêu cầu”, “Thiết kế” đến “Lập
trình”.
Từ công đoạn này chuyển sang công đoạn khác thường nảy sinh các sai sót (do dư thừa
– Mức kiểm tra hệ thống (System)
– Mức kiểm tra tích hợp (Integration)
Cách phân loại khác là dựa trên phương pháp thử nghiệm (thường dùng ở m
ức
kiểm tra đơn vị)
– Kiểm nghiệm hộp đen (Black box testing) dùng để kiểm tra chức năng.
– Kiểm nghiệm hộp trắng (White box testing) dùng để kiểm tra cấu trúc.
Hình bên dưới biểu diễn sự tương quan của “các tiêu chí chất lượng phần mềm”, “mức độ
chi tiết đơn vị” và “phương pháp kiểm nghiệm”
Mô tả yêu cầu
Thiết kế
Lập trình
Kiểm nghiệm
Cô lập lỗi
Phân loại lỗi
Lỗi
Sai sót
Sai sót
Sai sót
Lỗi
Lỗi
Hậu quả
:
- Công đoạn: Yêu cầu phần mềm(requiements); Loại kiểm nghiệm: Kiểm nghiệm
chấp nhận (acceptance test); Hồ sơ: hồ sơ kiểm nghiệm chấp nhận (acceptance test
spec).
- Công đoạn: Mô tả chi tiết phần mềm (specification); Loại kiểm nghiệm: Kiểm
nghiệm hệ thống(system test); Hồ sơ: hồ
sơ kiểm nghiệm hệ thống (system test
spec).
- Công đoạn: Hồ sơ kiến trúc (architecture spec); Loại kiểm nghiệm: Kiểm nghiệm
tích hợp (integration test); Hồ sơ: hồ sơ kiểm nghiệm tích hợp (integration test
spec).
- Công đoạn: Thiết kế chi tiết (detailed design); Loại kiểm nghiệm: Kiểm nghiệm
khối (module test); Hồ
sơ: hồ sơ kiểm nghiệm khối (module test spec).
- Công đoạn: Viết mã (implementation code); Loại kiểm nghiệm: Kiểm nghiệm
đơn vị (unit test); Hồ sơ: hồ sơ kiểm nghiệm đơn vị (unit test spec). Đơn vị (Unit)
Thành phần (Module)
Tích hợp (Integration)
Hệ thống (System)
Mức độ chi tiết
Phương pháp
White-box Black-box
Chức năng
Thân thiện người dùng
Khả năng thi hành
Thiết thực
Ổn định
m nghiệm tầm rộng:
– Kiểm nghiệm bộ phận (Module testing): kiểm nhiệm một bộ phận riêng
rẽ.
– Kiểm nghiệm tích hợp (Itegration testing): tích hợp các bộ phận và hệ
thống con.
– Kiểm nghiệm hệ thống (System testing): kiểm nghiệm toàn bộ hệ thống.
– Kiểm nghiệm chấp nhận (Acceptance testing): thực hiện bởi khách
hàng. Sai sót
requiements
specification
architecture
s
p
ec
detailed design
implementation
code
acceptance test
system test
integration test
module test
unit test
acceptance test spec
system test spec
integration test spec
module test spec
unit test spec
hợp thử nghiệm (test case) sẽ được tạo ra dựa nhiều vào bản mô tả chức năng ch
ứ không
phải dựa vào cấu trúc của chương trình.
c. Vấn đề kiểm nghiệm tại biên:
Kiểm nghiệm biên (boundary) là vấn đề được đặt ra trong cả hai loại kiểm nghiệm hộp đen
và hộp trắng. Lý do là do lỗi thường xảy ra tại vùng này.
Ví dụ
:
if x > y then S1 else S2
Với điều kiện bao phủ, chỉ cần 2 truờng hợp thử là x>y và x<=y.
Với kiểm nghiệm đường biên thì kiểm tra với các trường hợp thử là x>y, x<y, x=y
Các loại kiểm nghiệm tầm rộng:
Việc kiểm nghiệm này thực hiện trên tầm mức lớn hơn và các khía cạnh khác của phần
mềm như kiểm nghiệm hệ thống, kiểm nghiệm sự
chấp nhận (của người dùng) 11
a. Kiểm nghiệm Module (Module testing)
Mục đích: xác minh module đưa ra đã được xây dựng đúng hay chưa?
Vấn đề đặt ra: giả sử module I sử dụng các module H, K. Nhưng các module H và K chưa
sẳn sàng. Vậy cách nào để kiểm tra module I một cách độc lập?
Giải pháp đề ra là giả lập môi trường của module H và K.
Thông thường một module có thể gọi một tác vụ (hay một tiến trình) không phải của nó,
truy cập các cấu trúc dữ liệu không phải là c
ục bộ, hay được dùng bởi một module khác.
Hình sau mô tả module được đặt trong môi trường thử nghiệm.
UNDER TEST
DRIVERSTUB
CALL CALL
ACCESS TO NONLOCAL VARIABLES
12
Mục đích của kiểm nghiệm hệ thống là để đảm bảo toàn bộ hệ thống hoạt động như ý mà
khách hàng mong muốn.
Bao gồm các loại kiểm nghiệm sau:
Kiểm nghiệm chức năng (Function testing)
Kiểm tra hệ thống sau khi tích hợp có hoạt động đúng chức năng với
yêu cầu đặt ra trong bản mô tả yêu cầu hay không.
Ví dụ
: với hệ thống xử lý văn bản thì kiểm tra các chức năng tạo tài
liệu, sửa tài liệu, xoá tài liệu… có hoạt động hay không.
Kiểm nghiệm hiệu suất (Perfomance testing)
Kiểm nghiệm mức độ đáp ứng (stress testing)
Thực thi hệ thống với giả thiết là các tài nguyên hệ thống yêu cầu
không đáp ứng được về chất lượng, ổn định và số lượ
ng.
Kiểm nghiệm cấu hình (configuration tessting)
Phân tích hệ thống với các thiết lập cấu hình khác nhau.
Kiểm nghiệm ổn định (robustness tessting)
Kiểm nghiệm dưới các điều kiện không mong đợi ví dụ như người
dùng gõ lệnh sai, nguồn điện bị ngắt.
Kiểm nghiệm hồi phục (recovery testing)
Chỉ ra các kết quả trả về khi xảy ra lỗi, mất dữ liệu, thiế
t bị, dịch
vụ… hoặc xoá các dữ liệu hệ thống và xem khả năng phục hồi của
2.1. Kiểm chứng và hợp lệ hoá
Kiểm thử phần mềm là một yếu tố trong chủ điểm rộng hơn thường được tham
khảo tới như vấn đề
kiểm chứng và hợp lệ hoá (V&V). Kiểm chứng nói tới một tập
các hành động đảm bảo rằng phần mềm cài đặt đúng cho một chức năng đặc biệt.
Hợp lệ hoá nói tới một tập các hoạt động khác đảm bảo rằng phần mềm đã được xây
dựng lại theo yêu cầu của khách hàng. Bochm phát biểu điều này theo cách khác:
Kiểm chứng: “Chúng ta có làm ra sản phẩm đúng không? ”
Hợp lệ hoá: “Chúng ta có làm ra đúng sản phẩm không? ”
Định nghĩa về V&V bao quát nhiều hoạt động ta đã tham khảo tới như việc đảm bảo
chất lượng phần mềm (SQA).
Các phương pháp kỹ nghệ phần mềm cung cấp nền tảng để xây dựng nên chất lượng.
Các phương pháp phân tích, thiết kế và thực hiện (mã hoá) làm nâng cao chất lượng
bằng cách đưa ra những kỹ thuật thống nhất và k
ết quả dự kiến được. Các cuộc họp
xét duyệt kỹ thuật chính thức (thảo trình) giúp đảm bảo chất lượng của sản phẩm
được tạo ra như hệ quả của từng bước kỹ nghệ phần mềm. Qua toàn bộ tiến trình
này, việc đo đạc và kiểm soát được áp dụng cho mọi phần tử của cấu hình phần mềm.
Các chuẩn và thủ tục giúp
đảm bảo tính thống nhất và tiến trình SQA chính thức
buộc phải thi hành “ triết lý chất lượng toàn bộ ”.
Việc kiểm thử cung cấp một thành luỹ cuối cùng để có thể thẩm định về chất lượng,
lỗi có thể được phát hiện ra một cách thực tế hơn.
Nhưng không nên coi kiểm thử như một tấm lưới an toàn. Như người ta vẫn nói, “
Bạn không thể kiểm thử
được chất lượng. Nếu nó không sẵn có trước khi bạn bắt đầu
kiểm thử thì nó sẽ chẳng có khi bạn kết thúc kiểm thử.” Chất lượng được tổ hợp vào
trong phần mềm trong toàn bộ tiến trình kỹ nghệ phần mềm. Việc áp dụng đúng các
hơn là người làm ra nó? Nhưng không may, cũng những người phát triển này lại có
mối quan tâm chứng minh rằng chương trình là không có lỗi, rằng nó làm việc đúng
theo yêu cầu khách hàng, rằng nó sẽ được hoàn tất theo lịch biểu và trong phạm vi
ngân sách. Một trong nh
ững mối quan tâm này lại làm giảm bớt việc tìm ra lỗi trong
toàn bộ tiến trình kiểm thử.
Theo quan điểm tâm lý, việc phân tích và thiết kế phần mềm (cùng với mã hoá) là
nhiệm vụ xây dựng. Người kỹ sư phần mềm tạo ra một chương trình máy tính, tài liệu
về nó và các cấu trúc dữ liệu có liên quan. Giống như bất kỳ người xây dựng nào,
người kỹ sư phần mềm tự hào v
ề dinh thự đã được xây dựng và nhìn ngờ vực vào bất
15
kỳ ai định làm sập đổ nó. Khi việc kiểm thử bắt đầu, có một nỗ lực tinh vi, dứt khoát
để “đập vỡ” cái người kỹ sư phần mềm đã xây dựng. Theo quan điểm của người xây
dựng, việc kiểm thử có thể được coi như (về tâm lý) có tính phá hoại. Cho nên người
xây dựng dè dặt đề cập tới việc kiểm thử thiết kế và thực hi
ện sẽ chứng tỏ rằng
chương trình làm việc, thay vì phát hiện lỗi. Điều không may lỗi sẽ hiện hữu. Và nếu
người kỹ sư phần mềm không tìm ra chúng thì khách hàng sẽ tìm ra.
Thường có một số nhận thức sai có thể được suy diễn sai lạc từ thảo luận trên: (1)
người phát triển phần mềm không nên tiến hành kiểm thử; (2) phần mềm nên được
“tung qua tường ” cho người lạ làm việc ki
ểm thử một cách tàn bạo; (3) người kiểm
thử nên tham gia vào dự án chỉ khi bước kiểm thử sắp sửa bắt đầu. Từng phát biểu
này đều không đúng.
Người phát biểu phần mềm bao giờ cũng có trách nhiệm với việc kiểm thử riêng các
đơn vị (mô đun) chương trình, để đảm bảo rằng mỗi mô đun thực hiện đúng chức
năng nó đã được thiế
t kế. Trong nhiều trường hợp, người phát triển cũng tiến hành
dần.
Một chiến lược cho kiểm thử phần mềm cũng có thể xem xét bằng cách đi theo đường
xoắn ốc của Hình 2.2 ra ngoài. Việc kiểm thử đơn vị bắt đầu tại tâm xoáy của xoắn ốc
và tập chung vào các đơn vị của phần mềm khi được cài đặt trong chương trình gốc.
Việ
c kiểm thử tiến triển bằng cách đi ra theo đường xoắn ốc tới kiểm thử tích hợp,
nơi tập trung vào thiết kế và việc xây dựng kiến trúc phần mềm. Đi thêm một vòng
xoáy nữa trên đường xoắn ốc chúng ta gặp kiểm thử hợp lệ, nơi các yêu cầu, được
16
thiết lập như một phần của việc phân tích yêu cầu phần mềm, được hợp lệ hoá theo
phần mềm đã được xây dựng. Cuối cùng chúng ta tới kiểm thử hệ thống, nơi phần
mềm và các phần tử hệ thống khác được kiểm thử như một toàn bộ. Để kiểm thử
phần mềm máy tính, chúng ta theo đường xoáy mở rộng dần phạm vi kiểm thử
một
lần. Hình 2.3 Các bước kiểm thử phần mềm
Xem xét tiến trình này theo quan điểm thủ tục vì việc kiểm thử bên trong hoàn
cảnh kỹ nghệ phần mềm thực tại là một chuỗi gồm ba bước được thực hiện tuần tự
nhau. Các bước này được vẽ trong Hình 2.3. Ban đầu, việc kiểm thử tập trung vào
từng mô đun riêng biệt, đảm bảo rằng nó vận hành đúng đắn như
một đơn vị. Do đó
mới có tên kiểm thử đơn vị. Kiểm thử đơn vị dùng rất nhiều các kỹ thuật kiểm thử
hộp trắng, thử các đường đặc biệt trong cấu trúc điều khiển của một mô đun để đảm
bảo bao quát đầy đủ và phát hiện ra lỗi tối đa. Tiếp đó các mô đun phải được lắp
ghép hay tích hợp l
ại để tạo nên bộ trình phần mềm hoàn chỉnh. Việc kiểm thử tích
Một đáp ứng cho câu hỏi trên là: Bạn chẳng bao giờ hoàn thành việc kiểm thử,
gánh nặng đơn giản chuyển từ bạn (người phát triển) sang khách hàng của bạn. Mỗi
lúc khách hàng / người dùng thực hiện một chương trình máy tính thì chương trình
này lại được kiểm thử trên một tập d
ữ liệu mới. Sự kiện đúng mức này nhấn mạnh
tầm quan trọng của các hoạt động đảm bảo chất lượng phần mềm khác. Một đáp ứng
khác (có điều gì đó nhạo báng nhưng dẫu sao cũng chính xác) là : Bạn hoàn thành
việc kiểm thử khi bạn hết thời gian hay hết tiền.
Mặc dầu số ít người thực hành sẽ biện minh cho những đáp ứ
ng trên, người kỹ
sư phần mềm cần những tiêu chuẩn chặt chẽ hơn để xác định khi nào việc kiểm thử
đủ được tiến hành. Musa và Ackerman gợi ý một đáp ứng dựa trên tiêu chuẩn thống
kê: “ Không, chúng ta không thể tuyệt đối chắc chắn rằng phần mềm sẽ không bao
giờ hỏng, nhưng theo mô hình thống kê đúng về lý thuyết và hợp lệ về thực nghiệm
thì chúng ta đã hoàn thành ki
ểm thử đủ để nói với sự tin tưởng tới 95% rằng xác suất
của 1000 giờ vận hành CPU không hỏng trong một môi trường được xác định về xác
suất là ít nhất 0.995”
Dùng mô hình hoá thống kê và lí thuyết độ tin cậy phần mềm, các mô hình về
hỏng hóc phần mềm (được phát hiện trong khi kiểm thử) xem như một hàm của thời
gian thực hiện có thể được xây dựng ra. Một bản của mô hình sai hỏng,
được gọi là
mô hình thực hiện- thời gian Poisson lô ga rit, có dạng:
f(t)=
ln[)(
1
x
p
l
0
là tốt hơn đáng kể so với trực giác thô.
2.2. Phát triển phần mềm phòng sạch (cleanroom software development)
Cleanroom là một qui trình phát triển phần mềm hơn là một kỹ thuật kiểm thử. Cho
đến bây giờ, kỹ thuật này vẫn được xem là một cách mới của việc suy nghĩ về kiểm
thử và đảm bảo chất lượng phần mềm. Ý tưởng của cleanroom là nhằm tránh tiêu
tốn chi phí cho hoạt động phát hiện và gỡ bỏ các lỗi bằng cách viết mã lệnh chươ
ng
trình một cách chính xác ngay từ ban đầu với những phương pháp chính thống như
kỹ thuật chứng minh tính đúng đắn trước khi kiểm thử.
2.2.1. Nghệ thuật của việc gỡ rối
Kiểm thử phần mềm là một tiến trình có thể được vạch kế hoạc và xác định một cách
hệ thống. Việc thiết kế trường hợp kiểm thử có thể tiến hành mộ
t chiến lược xác định
và có kết quả được tính toán theo thời gian.
Gỡ lỗi xuất hiện như hậu quả của việc kiểm thử thành công. Tức là, khi một trường
hợp kiểm thử phát hiện ra lỗi thì việc gỡ lỗi là tiến trình sẽ nảy sinh để loại bỏ lỗi.
Mặc dầu việc gỡ lỗi có thể nên là một tiến trình có trật tự, nó phần lớn còn là ngh
ệ
thuật. Người kỹ sư phần mềm khi tính các kết quả của phép thử, thường hay phải
đương đầu với chỉ dẫn “triệu chứng” và vấn đề phần mềm. Tức là, cái biểu lộ ra bên
ngoài của lỗi và nguyên nhân bên trong của lỗi có thể có mối quan hệ không hiển
nhiên tới một lỗi khác. Tiến trình tâm trí ít hiểu biết gắn một triệu chứng với nguyên
nhân chính việc gỡ lỗ
i.
2.2.2. Tiến trình 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ư một hệ quả kiểm
thử. Tham khảo đến hình 2.12 thì tiến trình gỡ lỗi bắt đầu với việc thực hiện kiểm
thử. Kết quả được thẩm định và gặp việc thiếu sự tương ứng giữa kết quả trông đợ
chạy trên các bộ xử lý khác nhau.
o Trong khi gỡ lỗi, chúng ta gặp không ít các lỗi chạy từ việc hơi khó chịu
(như định dạng cái ra không đúng) tới các thảm hoạ (như hệ thống hỏng,
gây ra các thiệt hại kinh tế hay vật lý trầm trọng). Xem như hậu quả của
việc tăng lỗi, khối lượng sức ép để tìm ra lỗi cũng tăng thêm. Thông
thường, sức ép buộc người phát triển phần mềm phải tìm ra l
ỗi và đồng thời
đưa vào thêm hai lỗi nữa.
2.2.3. Xem xét tâm lý
Không may, dường như có một số bằng cớ là sự tinh thông gỡ lỗi thuộc bẩm sinh con
người. Một số người làm việc đó rất giỏi, số khác lại không. Mặc dù bằng cớ kinh
nghiệm về gỡ lỗi vẫn còn để mở cho nhiều cách hiểu, nhưng biến thiên lớn nhất trong
khả năng gỡ lỗi đã được báo cáo lại đối với các kỹ
sư phần mềm có cùng nền tảng
kinh nghiệm và giáo dục.
Bình luận về khía cạnh gỡ lỗi của con người, Shneiderman phát biểu:
Gỡ lỗi là một trong những phần chán nhất của lập trình. Nó có yếu tố của việc giải
quyết vấn đề hay vấn đề hóc búa, đi đôi với việc thừa nhận khó chịu rằng bạn đã sai
lầm. Hay âu lo và không sẵn lòng chấp nhận khả
năng lỗi làm tăng khó khăn cho
công việc. May mắn là có sự giảm nhẹ và bớt căng thẳng khi lỗi cuối cùng đã được
sửa lỗi.
Mặc dầu có thể khó học được việc gỡ lỗi, người ta vẫn đề nghị ra một số cách tiếp cận
tới vấn đề. Chúng ta xem xét những vấn đề này trong mục tiếp.
2.2.4. Cách tiếp cận gỡ lỗi
Bất kể tới cách tiếp cận nào được chọn gỡ lỗi có một mục tiêu quan trọng hơn cả: tìm
ra và sửa chữa nguyên nhân lỗi phần mềm. Mục tiêu này được thực hiện bằng tổ hợp
trình gốc (một cách thủ công) cho tới chỗ tìm ra nguyên nhân. Không may là khi số
dòng chương trình gốc tăng lên, số con đường lật ngược tiềm năng có thể trở nên
không quản lý nổi.
Cách tiếp cận thứ ba tới gỡ lỗi - loại bỏ nguyên nhân được biểu lộ bằng việc quy nạp
hay diễn dịch và đưa vào khái niệm về phân ho
ạch nhị phân. Dữ liệu có liên quan tới
việc xuất hiện lỗi được tổ chức để cô lập ra các nguyên nhân tiềm năng. Một “giả thiết
nguyên nhân” được nêu ra và dữ liệu trên được dùng để chứng minh hay bác bỏ giả
thiết đó. Một cách khác, ta có thể xây dựng ra một danh sách mọi nguyên nhân đặc
biệt có nhiều hứa hẹn thì dữ liệu sẽ được làm mịn thêm để cố gắng cô lập ra lỗ
i.
Từng cách tiếp cận gỡ lỗi trên đây đều có thể được bổ sung thêm bởi công cụ gỡ lỗi.
Chúng ta có thể áp dụng một phạm vi rộng các trình biên dịch gỡ lỗi, nhưng trợ giúp
gỡ lỗi động (“Bộ dò dấu vết”), các bộ sinh trường hợp kiểm thử tự động, sổ bộ nhớ và
bảng tham khảo chéo. Tuy nhiên các công cụ đều không phải là cách thay thế cho việc
đánh giá d
ựa trên tài liệu thiết kế phần mềm đầy đủ và chương trình gốc rõ ràng.
Trong nhiều trường hợp, việc gỡ lỗi phần mềm máy tính tựa như việc giải quyết vấn
đề trong thế giới kinh doanh. Brow và Sampson đã đưa ra một cách tiếp cận gỡ lỗi
tên là “Phương pháp”, đó là việc thích nghi các kỹ thuật giải quyết vấn đề quản lý.
Các tác giả này đề nghị phát triển một b
ản đặc tả về các độ lệch, mô tả cho vấn đề
bằng cách phác họa “cái gì, khi nào, ở đâu và với phạm vi nào?”
21
Mỗi một trong những vấn đề nêu trên (cái gì, khi nào, ở đâu và với phạm vi nào) đều
được chỉ ra thành những đáp ứng là hay không là để phân biệt rõ rệt giữa cái gì đã
xảy ra và cái gì đã không xảy ra. Một khi thông tin về lỗi đã được ghi lại thì người ta
xây dựng ra một giả thiết nguyên nhân dựa trên các phân biệt quan sát được từ
những đáp ứng là hay không là. Việc gỡ lỗi tiếp tục dùng cách tiếp cận qui nạ
Ta có thể làm gì để ngăn cản lỗi này ngay từ đầu? Câu hỏi này là bước đầu tiên
hướng tới việc thiết lập một cách tiếp cận đảm bảo chất lượng phần mềm thống kê.
Nếu ta sửa chương trình cũng như sản phẩm thì lỗi sẽ loại bỏ chương trình hiện tại và
có thể bị khử bỏ mọi chương trình tương lai
22
CHƯƠNG 3: KIỂM THỬ PHẦN MỀM
Mục tiêu của chương này là mô tả quá trình kiểm thử phần mềm và đưa ra các kỹ thuật
kiểm thử. Khi đọc chương này, bạn sẽ:
-
Hiểu được sự khác biệt giữa kiểm thử hợp lệ và kiểm thử khiếm khuyết.
-
Hiểu được các nguyên lý của kiểm thử hệ thống và kiểm thử bộ phận.
-
Hiểu được ba chiến lược có thể sử dụng để sinh các trường hợp kiểm thử hệ thống.
-
Hiểu được các đặc điểm bản chất của công cụ phần mềm được sử dụng để kiểm thử
tự động.
3.1. Quá trình kiểm thử
Quá trình kiểm thử phần mềm có hai mục tiêu riêng biệt:
1.
Chứng minh cho người phát triển và khách hàng thấy các yêu cầu của phần mềm.
Với phần mềm truyền thống, điều này có nghĩa là bạn có ít nhất một thử nghiệm
cho mỗi yêu cầu của người dùng và tài liệu hệ thống yêu cầu.Với các sản phẩm
phần mềm chung, điều đó có nghĩa là bạn nên thử nghiệm tất cả các đặc tính của hệ
thống sẽ
được kết hợp trong sản phẩm phát hành.
2.
Phát hiện các lỗi và khiếm khuyết trong phần mềm: phần mềm thực hiện không
đúng, không như mong đợi hoặc không làm theo như đặc tả. Kiểm tra khiếm
So sánh các kết quảVới các trường hợptrường hợpkiểm thửkiểm thửDữ liệukiểm thửCác kết quảkiểm thửBáo cáo
kiểm thử sự chỉ rõ của
đầu vào để thử nghiệm và đầu ra mong đợi từ hệ thống cộng với
một bản báo cáo sản phẩm đã được kiểm thử. Dữ liệu kiểm thử là đầu vào, được nghĩ ra để
kiểm thử hệ thống. Dữ liệu kiểm thử thỉnh thoảng có thể được tự động sinh ra. Sinh các
trường hợp kiểm thử tự động là điều không làm
được. Đầu ra của thử nghiệm chỉ có thể
được dự đoán bởi người hiểm biết về hoạt động của hệ thống.
Kiểm thử toàn diện: mọi chương trình có thể thực hiện tuần tự được kiểm tra, là điều
không thể làm được. Vì vậy, kiểm thử, phải được thực hiện trên một tập con các trường
hợp kiểm thử có th
ể xảy ra. Trong lý tưởng, các công ty phần mềm có những điều khoản
để lựa chọn tập con này hơn là giao nó cho đội phát triển. Những điều khoản này có thể
dựa trên những điều khoản kiểm thử chung, như một điều khoản là tất cả các câu lệnh
trong chương trình nên được thực thi ít nhất một lần. Một sự lựa chọn là những điều khoả
n
kiểm thử có thể sự trên kinh nghiệm sử dụng hệ thống, và có thể tập trung vào kiểm thử
các đặc trưng hoạt động của hệ thống. Ví dụ:
1.
Tất cả các đặc trưng của hệ thống được truy cập thông qua thực đơn nên được kiểm
thử.
2.
Kết hợp các chức năng (ví dụ định dạng văn bản) được truy cập thông qua cùng thực
đơn phải được kiểm thử.
3.
Khi đầu vào được đưa vào, tất cả các chức năng phải được kiểm thử với cùng một thử
nghiệm đúng đắn và thử nghiệm không đúng đắn.
Điều đó rõ ràng từ kinh nghiệm với sản phẩm phần mềm lớn như phần mềm xử lý văn
bản, hoặc bảng tính có thể so sánh các nguyên tắc thông thường được sử dụng trong lúc
kiểm thử s
ản phẩm. Khi các đặc trưng của phần mềm được sử dụng cô lập, chúng làm việc
ển phần mềm bao gồm việc tích hợp các thành
phần sử dụng lại và được lắp vào phần mềm để tạo nên các yêu cầu cụ thể. Tất cả các
kiểm thử trong trường hợp này là kiểm thử hệ thống, và không có sự tách rời trong
quá trình kiểm thử thành phần.
3.2. Kiểm thử hệ thống
Hệ thống gồm hai hoặc nhiều thành phần tích hợp nhằm thực hiện các chức năng hoặc đặc
tính của hệ thống. Sau khi tích hợp các thành phần tạo nên hệ thống, quá trình kiểm thử hệ
thống được tiến hành. Trong quá trình phát triển lặp đi lặp lại, kiểm thử hệ thống liên quan
với kiểm thử một lượng công việc ngày càng tăng để phân phối cho khách hàng; trong quá
trình thác nước, kiể
m thử hệ thống liên quan với kiểm thử toàn bộ hệ thống.
Với hầu hết các hệ thống phức tạp, kiểm thử hệ thống gồm hai giai đoạn riêng biệt:
1.
Kiểm thử tích hợp: đội kiểm thử nhận mã nguồn của hệ thống. Khi một vấn đề
được phát hiện, đội tích hợp thử tìm nguồn gốc của vấn đề và nhận biết thành phần
cần phải gỡ lỗi. Kiểm thử tích hợp hầu như liên quan với việc tìm các khiếm khuyết
của hệ thống.
2.
Kiểm thử phát hành: Một phiên bản của hệ thống có thể được phát hành tới người
dùng được kiểm thử. Đội kiểm thử tập trung vào việc hợp lệ các yêu cầu của hệ
thống và đảm bảo tính tin cậy của hệ thống. Kiểm thử phát hành thường là kiểm thử
“hộp đen”, đội kiểm thử tập trung vào mô tả các đặc tính hệ thống có thể làm được
ho
ặc không làm được. Các vấn đề được báo cáo cho đội phát triển để gỡ lỗi chương
trình. Khách hàng được bao hàm trong kiểm thử phát hành, thường được gọi là
kiểm thử chấp nhận. Nếu hệ thống phát hành đủ tốt, khách hàng có thể chấp nhận
nó để sử dụng.
được gọi là tích hợp từ dưới lên
(bottom-up). Trong thực tế, với rất nhiều hệ thống, chiến lược tích hợp là sự pha trộn
các phương pháp trên. Trong cả hai phương pháp top-down và bottom-up, bạn thường
phải thêm các mã để mô phỏng các thành phần khác và cho phép hệ thống thực hiện.
Một vấn đề chủ yếu nảy sinh trong lúc kiểm thử tích hợp là các lỗi cục bộ. Có nhiều
sự tương tác phức tạp giữa các thành ph
ần của hệ thống, và khi một đầu ra bất thường
được phát hiện, bạn có thể khó nhận ra nơi mà lỗi xuất hiện. Để việc tìm lỗi cục bộ
được dễ dàng, bạn nên thường xuyên tích hợp các thành phần của hệ thống và kiểm thử
chúng. Ban đầu, bạn nên tích hợp một hệ thống cấu hình tối thiểu và kiểm thử hệ thống
này. Sau đó bạn thêm dần các thành phầ
n vào hệ thống đó và kiểm thử sau mỗi bước
thêm vào.