Nội dungTổng quan về lỗi phần mềm Thực hành kiểm thử Kiểm thử tĩnh Tổng quan về thiết kế trường hợp kiểm thử Kỹ thuật kiểm thử 1 2 3 4 5 6 Kiểm thử phần mềm... 1 Lỗi giao diện người dù
Trang 1KỸ THUẬT KIỂM THỬ
1 Các nguyên lý 2 Vòng đời
4 Kiểm thử chức năng
3 Kỹ thuật kiểm thử
5 Kiểm thử cấu trúc 6 Quản lý chất lượng
KIỂM THỬ VÀ ĐẢM BẢO CHẤT LƯỢNG PHẦN MỀM Chương 3
Trang 2Nội dung
Tổng quan về lỗi phần mềm
Thực hành kiểm thử
Kiểm thử tĩnh Tổng quan về thiết kế trường hợp kiểm thử
Kỹ thuật kiểm thử
1 2 3
4 5 6
Kiểm thử phần mềm
Trang 3 Một lỗi phần mềm là sự không trùng khớp giữa chương trình và đặc tả của nó, nếu đặc tả phần mềm tồn tại và được cho là đúng Đặc tả sai phần mềm sai
Một lồi phần mềm hiện diện khi chương trình
không làm cái mà người sử dụng đầu cuối mong muốn nó làm.
Lỗi phần mềm (Bug)
Trang 41) Lỗi giao diện người dùng - User interface errors
2) Lỗi xử lý - Error handling
3) Lỗi liên quan tới ranh giới/biên - Boundary-related errors
4) Lỗi tính toán - Calculation errors
5) Lỗi các trạng thái đầu và sau - Initial and later states
6) Lỗi luồn kiểm soát - Control flow errors
7) Lỗi trong xử lý hoặc dịch dữ liệu - Errors in handling or interpreting data
8) Tranh đoạt điều khiển - Race conditions
9) Điều kiện tải - Load conditions
10) Phần cứng – Hardware
11) Kiểm soát phiên bản và mã nguồn – Source and version control
12) Tài liệu – Document
13) Các lỗi kiểm thử – Testing errors
Các nhóm lỗi phần mềm phổ biến
Trang 5 Có nhiều cách để làm cho chương trình làm việc một cách khó khăn,
người ta quy chúng vào một nhóm lỗi có tên là “Lỗi giao diện người dùng”
Lỗi giao diện người dùng chia thành nhiều nhóm nho
- Functionality: chương trình không làm những thứ như nó nên làm, hoặc làm một cách khổ sở
hay không hoàn chỉnh.
- Communication: Làm thế nào để tìm ra cách sử dụng chương trình? Nó có chính xác không?
Có gì đó nhầm lẫn, sai lệch không?
- Command structure: Có dễ bị lạc trong chương trình không? Có lệnh nào dễ bị nhầm lẫn
không? Có lỗi nào làm bạn lãng phí thời gian không? Vì sao?
- Missing commands: chương trình thiếu lệnh, cứng nhắc và khó điều chỉnh đề phù hợp với
từng đối tượng người sử dụng VD phím tắt
- Performance:chương trình chạy bị chậm hơn mong đợi người dùng
- Output: không có đủ thông tin đầu ra mong muốn VD người sử dụng muốn xuất đầu ra qua
thiết bị đầu cuối, tệp, máy in.
1) User interface errors
Trang 6 Không lường trước hết các sai sót của chương trình và bảo vệ chương trình trước các sai sót này
Thiếu thông báo lỗi hoặc điều kiện sinh ra lỗi.
Giải quyết lỗi được phát hiện không hợp lý
Vd trong việc bảo vệ chống lại dữ liệu bị corrupt, kiểm tra dữ liệu đầu vào người dùng, kiểm soát phiên bản, bo qua lỗi tràn bộ nhớ, so sánh dữ liệu, không phục lỗi, phục hồi khi có lỗi phần cứng
2) Error handling
Trang 7 Bất kỳ thành phần nào của chương trình được mô tả có sự xuất hiện của miền giá trị: từ nhiều hơn đến ít hơn, từ lớn nhất tới nho nhất, từ sớm nhất tới muộn nhất, đầu tiên tới cuối cùng, ngắn nhất tới dài nhất đều cần kiểm tra ranh giới miền giá trị Chương trình thường chạy đúng và ổn định với các giá trị nằm trong miền xác định và hay bị gặp lỗi/ sự cố tại các giá trị nằm ngoài biên của miền xác định
Tìm kiếm lỗi ranh giới: vòng lặp, không gian bộ nhớ, thời gian, xử lý sai các
trường hợp nằm ngoài ranh giới
VD
- Số lượng sinh viên tối thiểu của 1 lớp tín chỉ là 15 tối đa là 40 sinh viên
- Dung lượng bộ nhớ chiếm dụng của chương trình khi thực thi tối thiểu là 2MB tối đa là 50MB
- …
Trang 8 Hiểu sai công thức
Sai số tính toán
Tính toán sai do sai thuật toán
Sử dụng sai công thức
Sử dụng sai kiểu dữ liệu cho công thức tính toán
4) Calculation errors
Trang 9 Nhiều chương trình chỉ sai ở lần chạy đầu tiên, ở
những lần chạy sau các thông tin khởi tạo đã được lưu trữ lại nên việc chạy chương trình không gặp lại lỗi này nữa.
Tìm kiếm lỗi: thiết lập chỉ mục dữ liệu bằng không, khởi tạo biến kiểm soát vòng lặp, khởi tạo lại 1 con tro, …
VD Lỗi do lần đầu chạy file chưa được khởi tạo,
5) Initial and later states
Trang 10 Luồng kiểm soát của một chương trình miêu tả cái mà chương trình sẽ làm tiếp theo trong những hoàn cảnh cụ thể Lỗi luồng kiểm soát xẩy ra khi chương trình thực hiện sai việc làm tiếp
theo.
Lỗi này thường xuất hiện do giả định trạng thái trả ra sai, xử lý ngoại lệ dựa trên cách thoát, tràn trên tràn dưới bộ đệm, thất bại trong việc chặn và bo chặn ngắt, các so sánh, lỗi kiểu dữ liệu, thiếu hoặc sai các mặc định - default
Vd Lỗi luồng kiểm soát xẩy ra do câu lệnh rẽ nhánh.
6) Control flow errors
Trang 11 Một modun có thể truyền dữ liệu tới modun
hoặc chương trình khác Một tập dữ liệu có thể được truyền đi và nhận lại nhiều lần Trong quá trình này tập dữ liệu có thể bị corrupt (hong)
hoặc dịch sai Những thay đổi cuối cùng tới dữ liệu có thể bị mất hoặc thất lạc tới một vài phần khác của hệ thống.
7) Errors in handling or interpreting data
Trang 12 Khi làm việc với dữ liệu chia sẻ, dù ở dạng tệp, cơ sở dữ liệu, các kết nối mạng, bộ nhớ dùng chung hay ở những dạng khác của truyền thông liên tiến trình, có một số lỗi dễ tạo ra làm tổn thương tới tính bảo mật của hệ thống, đặc biệt là trong các hệ thống đa xử lý.
Ví dụ, nếu bạn mở một tệp và sau đó đọc nó, mặc dù ứng dụng của bạn không làm gì giữa hai hoạt động, vài quy trình khác có thể thay thế tệp sau khi tệp đã được mở và trước khi được đọc Nếu hai tiến trình khác nhau (trong cùng hoặc khác ứng dụng) đang ghi lên chung một tệp, sẽ không có cách nào để biết cái nào ghi trước, cái nào sẽ ghi đè lên dữ liệu được ghi bởi tiến trình kia Tình huống này gây ra lỗ hổng về bảo mật
Trang 13 Chương trình có thể hoạt động sai khi bị quá tải, nó có thể bị lỗi khi chạy trong một thời gian quá dài hoặc thực thi
quá trọng tải cho phép, chiếm dụng quá vùng nhớ cho
phép, thất bại khi cố chia sẻ vùng nhớ hoặc thời gian sử dụng CPU với chương trình khác hoặc giữa hai tiến trình con của nó
Ghi nhớ rằng tất cả mọi chương trình đều có giới hạn Vấn
đề là nó có đáp ứng được các giới hạn đã đề ra hoặc cách
xử lý thất bại khi vượt quá giới hạn cho phép
9) Load conditions
Trang 14 Vd chương trình gửi dữ liệu tới các thiết bị rồì
lờ đi các mã lỗi phản hồi lại, và cố gắng sử dụng thiết bị phần cứng đang bận hoặc không tồn tại gây ra lỗi về phần cứng.
Hoặc trong trường hợp khác, nếu phần cứng
hong, phần mềm cũng bị hong nếu nó không
nhận ra và khôi phục lại từ phần cứng hong.
Trang 15 Cần kiểm soát phiên bản và toàn vẹn mã
nguồn, tránh trường hợp kiểm thử đi kiểm thử lại một phần mã nguồn phiên bản cũ
QA đưa ra những quy định chặt chẽ về toàn
vẹn mã nguồn và kiểm soát phiên bản mã
Trang 16 Các tài liệu cũng là một phần của sản phẩm phần mềm Tài liệu nghèo nàn, kém chất
lượng có thể làm người sử dụng tin là sản
phẩm làm việc không chính xác
Trang 17 Các lỗi được tạo ra bởi kiểm thử viên là một trong các lỗi phổ biến nhất được pha kiểm thử, chẳng qua là do người kiểm thử không báo cáo lại chi
tiết các ca kiểm thử đó Nhưng kiểm thử viên nên ghi nhớ một số lỗi trong những lỗi bạn mắc phải khi sử dụng chương trình hoặc việc bạn gặp quá nhiều lỗi kiểm thử khi kiểm thử có thể phản ánh các vấn đề trong giao diện người sử dụng đây có thể tiềm ẩn lỗi trong thiết kế Khi đó các lỗi của bạn chính là các dữ liệu kiểm thử cho chương
trình
13) Testing errors
Trang 18 Khi có lỗi/ vấn đề được tìm thấy qua hoạt động kiểm thử, nó cần được báo cáo lại một cách rõ ràng, dễ hiểu để người khác có thể đọc và fix nó viết bug report
Làm thế nào để viết bug report hiệu quả
- Mô tả làm thế nào để sinh ra vấn đề Các lập trình viên bỏ qua các
báo cáo của các vấn đề mà bản thân họ không thể nhìn thấy
- Phân tích lỗi để có thể miêu tả nó bên trong một số lượng bước tối
thiểu, bỏ qua các bước không cần thiết
- Viết một báo cáo hoàn chỉnh, dễ hiểu sao cho lập trình viên không bị
hiểu lầm hay bực mình
- Viết báo cáo ngay khi nhìn thấy
Vòng đời của bug và nội dung bug
report
Trang 19Vòng đời
của bug
Trang 20 Program, release, version:
thông tin về chương trình,
phiên bản code hay bản
Attachment- tài liệu đính
kèm: print out, memory
dump, memo describing,…
Nội dung của bug
report
Trang 21 Bó buộc mạnh bạo
Cách tiếp cận gỡ lỗi
Trang 22Bó buộc mạnh bạo
Phương pháp thông dụng nhất và kém hiệu quả nhất để cô lập nguyên nhân của lỗi phần mềm.
Áp dụng phương pháp gỡ lỗi bó buộc mạnh bạo khi tất cả các phương pháp khác đều thất bại
Triết lý “cứ để máy tính tìm ra lỗi”, cho xổ ra nội dung bộ nhớ, gọi tới chương trình lưu dấu vết khi chạy và nạp chương trình với lệnh WRITE Hy vọng tr tìm ra được nguyên nhân trong
lượng lớn thông tin đưa ra
VẤN ĐỀ: chương trình có lỗi nhưng kết quả cuối cùng có thể không lỗi
Có thể lãng phí thời gian và công sức
Trang 23Lật ngược
Cách tiếp cận khá thông dụng có thể được
dùng trong những chương trình nho
Bắt đầu tại chỗ chúng được phát hiện ra, lật ngược theo những chương trình gốc (một
cách thủ công) cho tới chỗ tìm ra nguyên
nhân
VẤN ĐỀ: chương trình gốc lớn, số con đường lật ngược nhiều
Trang 24Loại bỏ nguyên nhân
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 bo giả thiết đó
Một cách khác, 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
Trang 25Nội dung
Tổng quan về lỗi phần mềm
Thực hành kiểm thử
Kiểm thử tĩnh Tổng quan về thiết kế trường hợp kiểm thử
Kỹ thuật kiểm thử
1 2 3
4 5 6
Kiểm thử phần mềm
Trang 26Vai trò con người trong việc kiểm thử
Trang 27Quy trình kiểm thử tổng quát
Trang 28Thiết kế trường hợp kiểm thử dựa
trên các yêu cầu:
Các trường hợp thử nghiệm được thiết kế để kiểm thử các yêu cầu hệ thống
Được sử dụng trong hầu hết các bước kiểm thử hệ thống bởi vì các yêu cầu hệ thống
thường được thực hiện bởi một vài thành
phần
Với mỗi yêu cầu, xác định các trường hợp thử nghiệm để có thể chứng to được hệ thống có yêu cầu đó
Trang 29Thiết kế kiểm thử dựa trên phân
hoạch
Xác định các phân hoạch đầu vào và phân hoạch đầu ra và thiết kể thử nghiệm
Hệ thống thực hiện với đầu vào từ tất cả các
phân hoạch và sinh ra đầu ra trong tất cả các
phân hoạch
Các phân hoạch là các nhóm dữ liệu có chung đặc tính như tất cả các số đều âm, tất cả tên đều có đều có độ dài nho hơn 30 ký tự, tất cả các sự kiện phát sinh từ việc chọn các mục trên thực
đơn…
Trang 30Thiết kế kiểm thử dựa trên cấu trúc
Sử dụng những hiểu biết về cấu trúc chương trình để thiết kế các thử nghiệm thực hiện tất
cả các phần của chương trình
Nên kiểm tra thực thi mỗi câu lệnh ít nhất một lần
Kiểm thử cấu trúc giúp cho việc xác định các trường hợp thử nghiệm.
Trang 31Các phương pháp kiểm thử
Phân loại dựa vào việc chạy chương trình:
kiểm thử tĩnh là các kỹ thuật đánh giá, định
hướng kiểm tra các tài liệu và mã nguồn mà không cần chạy chương trình Kiểm thử động
là phương pháp thông qua việc chạy chương trình để kiểm tra đánh giá
Phân loại theo cách tiếp cận hộp: kiểm thử
hộp trắng và kiểm thử hộp đen, kiểm thử hộp xám
Trang 32Các kỹ thuật kiểm thử
Kiểm thử tĩnh (Không thực thi chương trình)
• Danh sách các kiểm tra tài liệu, đặc tả,
mã nguồn, vv
Kiểm thử chức năng (Hộp đen)
• Dựa trên hành vi/ chức năng phần mềm
Kiểm thử cấu trúc (Hộp trắng)
• Dựa trên cấu trúc phần mềm
Trang 33Một vài kỹ thuật kiểm thử
Structural
Behavioural
Functional Non-functional
Reviews
Walkthroughs
Desk-checking
Data Flow
Data Flow
Arcs
Equivalence Partitioning
Equivalence Partitioning
Boundary Value Analysis
Boundary Value Analysis
Cause-Effect Graphing Random
Usability Performance
Static Analysis Inspection
Control Flow
Control Flow
Trang 35Phương pháp kiểm thử tĩnh
Xem xét đặc tả
Xem xét mã nguồn
Trang 36Duyệt đặc tả mức cao
Duyệt đặc tả mức cao
- Quan sát ở mức tổng thể
- Đóng vai người khách hàng
• Hiểu xem họ thực sự cần gì
• Khách hàng không nói những gì là hiển nhiên
– Ví dụ: an ninh, dễ sử dụng, v.v.
- Đối chiếu với đặc tả
• Làm rõ những gì mình không hiểu
– Không hiểu được là lỗi của đặc tả
Trang 37Duyệt đặc tả mức cao
Đối chiếu chuẩn mực hiện hành
- Thuật ngữ, qui ước
- Chuẩn mực quốc tế,
- Chuẩn do địa phương ban hành
- Chuẩn về an ninh
- Chuẩn về dễ sử dụng
-
Trang 38Duyệt đặc tả mức cao
So sánh với các sản phẩm cạnh tranh
- Chức năng
- Công nghệ
- Đơn giản, dễ sử dụng
- An ninh, bảo mật
- Độ tin cậy
-
Trang 39- Ngôn ngữ diễn đạt
- Tính khả kiểm thử
Trang 40Khảo sát mã nguồn
Phản biện hình thức
Ích lợi
Trang 41Phản biện chéo
Kiểm tra lẫn nhau, phi hình thức
Qui trình tương tự phản biện hình thức,
nhưng đơn giản hóa bớt
- Tác giả trình bày cho một nhóm nhỏ (5 lập trình,
kiểm thử viên khác) đã xem mã nguồn trước
Thanh tra
- Người trình bày không phải là tác giả nói và nhận
xét về mã nguồn, những người khác cũng phản biện
Trang 42 Đảm bảo tính nhất quán, dễ hiểu của mã
nguồn do nhiều người cùng viết, sửa
Trang 43Danh sách kiểm tra mã nguồn
Kiểm tra theo danh sách để không bo sót
- Lỗi tham chiếu dữ liệu
- Lỗi mô tả dữ liệu
- Lỗi tính toán
- Lỗi điều khiển
- Lỗi truyền tham số
-
Trang 44Ví dụ danh sách kiểm tra
Structure
- ❏ ❏ Does the code completely and correctly implement the design?
- ❏ ❏ Does the code conform to any pertinent coding standards?
- ❏ ❏ Is the code well-structured, consistent in style, and consistently formatted?
- ❏ ❏ Are there any uncalled or unneeded procedures or any unreachable code?
- ❏ ❏ Are there any leftover stubs or test routines in the code?
- ❏ ❏ Can any code be replaced by calls to external reusable components or library functions?
- ❏ ❏ Are there any blocks of repeated code that could be condensed into a single procedure?
- ❏ ❏ Is storage use efficient?
- ❏ ❏ Are symbolic used rather than “magic number” constants or string constants?
- ❏ ❏ Are any modules excessively complex and should be restructured or split into multiple routines?
Trang 45Ví dụ danh sách kiểm tra
- ❏ ❏ Do all assigned variables have proper type consistency or casting?
- ❏ ❏ Are there any redundant or unused variables?
Arithmetic Operations
- ❏ ❏ Does the code avoid comparing floating-point numbers for equality?
- ❏ ❏ Does the code systematically prevent rounding errors?
- ❏ ❏ Does the code avoid additions and subtractions on numbers with greatly different magnitudes?
- ❏ ❏ Are divisors tested for zero or noise?
Trang 46Ví dụ danh sách kiểm tra
Loops and Branches
- ❏ ❏ Are all loops, branches, and logic constructs complete, correct, and properly nested?
- ❏ ❏ Are the most common cases tested first in IF- -ELSEIF chains?
- ❏ ❏ Are all cases covered in an IF- -ELSEIF or CASE block, including ELSE or DEFAULT clauses?
- ❏ ❏ Does every case statement have a default?
- ❏ ❏ Are loop termination conditions obvious and invariably achievable?
- ❏ ❏ Are indexes or subscripts properly initialized, just prior to the loop?
- ❏ ❏ Can any statements that are enclosed within loops be placed outside the loops?
- ❏ ❏ Does the code in the loop avoid manipulating the index variable or using it upon exit from the loop?