Kiểm tra và các chiến luợc kiểm tra phần mềm
Xác minh và thẩm định một hệ phần mềm là một quá trình liên tục xuyên suốt mọi giai đoạn của quá trình phần mềm. Xác minh và thẩm định là từ chung cho các quá trình kiểm tra để đảm bảo rằng phần mềm thỏa mãn các yêu cầu của chúng và các yêu ...
Xác minh và thẩm định một hệ phần mềm là một quá trình liên tục xuyên suốt mọi giai đoạn của quá trình phần mềm. Xác minh và thẩm định là từ chung cho các quá trình kiểm tra để đảm bảo rằng phần mềm thỏa mãn các yêu cầu của chúng và các yêu cầu đó thỏa mãn các nhu cầu của người sắm phần mềm.
Xác minh và thẩm định là một quá trình kéo dài suốt vòng đời. Nó bắt đầu khi duyệt xét yêu cầu. Xác minh và thẩm định có hai mục tiêu:
i) Phát hiện các khuyết tật trong hệ thống.
ii) Đánh giá xem hệ thống liệu có dùng được hay không?
Sự khác nhau giữa xác minh và thẩm định là:
i) Thẩm định: Xem xét cái được xây dựng có làsảnphẩmđúngkhông? Tức là kiểm tra xem chương trình có được như mong đợi của người dùng hay không.
ii) Xác minh: Xem xét cái được xây dựng có đúnglàsảnphẩmkhông? Như thế, xác minh là kiểm tra chương trình có phù hợp với đặc tả hay không.
Như trên, kiểm tra là một quá trình của tìm kiếm lỗi. Một kiểm tra tốt có khả năng cao tìm kiếm các lỗi chưa được phát hiện. Một kiểm tra thành công là kiểm tra tìm ra các lỗi mới, một kiểm tra tồi là kiểm tra mà không tìm được lỗi.
Có hai kiểu lỗi trong ứng dụng và các kiểm tra tốt sẽ xác định cả hai loại đó. Cụ
thể:
Không làm những điều cần phải làm: lỗi bỏ sót thường xuất hiện đối với ứng dụng mới được phát triển.
Làm những điều không cần làm: lỗi của lệnh đã cư trú trước trong các ứng dụng bảo trì.
Các kiểm tra có mặt tại các mức khác nhau và được tiến hành bởi các cá nhân khác nhau trong quá trình phát triển ứng dụng. Các kiểm tra được tiến hành bởi đội ngũ dự án và kiểm tra được tiến hành bởi các cơ quan bên ngoài để chấp nhận ứng dụng.
Các kiểm tra của đội dự án được gọi là kiểm tra phát triển (Development test). Kiểm tra phát triển bao gồm kiểm tra đơn vị, kiểm tra hệ thống con, kiểm tra tích hợp và các kiểm tra hệ thống.
Kiểm tra đơn vị (Unit test) được tiến hành cho mỗi đơn vị mã nhỏ nhất.
Kiểm tra tích hợp (Subsystem integration test) kiểm tra mặt logic và xử lý cho phù hợp của các khối, kiểm tra việc truyền tin giữa chúng.
Kiểm tra hệ thống (System test) đánh giá các đặc tả chức năng có được đáp ứng, các thao tác giao diện người có giống thiết kế không, và các công việc của ứng dụng trong môi trường thao tác mong muốn, đối với các ràng buộc.
Các kiểm tra bởi các cơ quan bên ngoài được gọi là đảm bảo chất lượng
(Quality assurance-QA) và kiểm tra chấp nhận (Acceptance test). Người ngoài có thể là người sử dụng hoặc đại diện người dùng, nó tạo một mục đích, đánh giá khách quan về ứng dụng và cơ quan bên ngoài được coi là có mục đích hơn các thành viên nhóm.
Kiểm tra đảm bảo chất lượng tương tự các kiểm tra hệ thống về mặt mục đích và tiến hành, nhưng nó khác là họ nằm ngoài sự điều khiển của dự án trưởng. Các báo cáo kiểm tra đảm bảo chất lượng được gửi thường xuyên tới nhóm phát triển và quản lý dự án. Các kiểm tra viên đảm bảo chất lượng lập kế hoạch cho chiến lược của mình và tiến hành kiểm tra để đảm bảo các ứng dụng thực hiện tất cả các chức năng cần thiết. Kiểm tra đảm bảo chất lượng là kiểm tra cuối cùng được làm trước khi ứng dụng được đưa sản xuất đại trà.
Quan hệ giữa các mức kiểm tra và các giai đoạn trong vòng đời của chương trình được trình bày như sau:
Mỗi mức kiểm tra đòi hỏi xác định chiến lược kiểm tra. Chiến lược kiểm tra hộp trắng hoặc kiểm tra hộp đen.
Dữ liệu vào được tạo theo thiết kế để sinh ra các dữ liệu ra khác nhau mà không chú ý tới các chức năng logic thực hiện thế nào. Các kết quả được dự đoán và so sánh với các kết quả thực tế để đánh giá mức độ thành công.
Chiến lược White-box mở hộp và nhìn vào các logic đặc tả của ứng dụng để kiểm tra nó làm thế nào. Kiểm tra sử dụng các đặc tả logic để tạo ra các xử lý khác nhau và dự đoán các kết quả ra. Các kết quả trung gian và đầu ra cuối cùng có thể dự đoán và định lượng nhờ kiểm tra white-box.
Chiến lược kiểm tra top–down hay bottom–up: xác định các kiểm tra và phát triển mã sẽ được tiến hành như thế nào:
Kiểm tra top–down cho rằng mã điều khiển tới hạn và các chức năng sẽ được phát triển và kiểm tra đầu tiên. Tiếp theo là các chức năng thứ cấp và các hàm hỗ trợ. Lý thuyết là càng có nhiều module tới hạn được kiểm tra, thì càng ổn định về chương trình.
Kiểm tra bottom–up cho rằng càng ít thay đổi trong các module khả năng sinh lỗi càng ít. Toàn bộ các module được mã và đơn vị được kiểm tra. Sau đó kiểm tra được tiến hành ở mức độ tích hợp.
Các chiến lược kiểm tra không loại trừ lẫn nhau, chúng có thể được sử dụng đơn lẻ hoặc đồng thời. Lý tưởng là kiểm tra cho một ứng dụng bao gồm nhiều chiến lược để phát hiện được hết các lỗi.
Sau khi chiến lược đã được xác định, nó được áp dụng để tạo các trường hợp kiểm tra cụ thể. Test case: là các giao dịch riêng biệt hoặc các bản ghi dữ liệu tạo các logic được kiểm tra. Cho mọi trường hợp kiểm tra tất cả các kết quả của xử lý được dự đoán. Đối với ứng dụng on-line và off-line tài liệu hoá, test scripts các hội thoại tạo ra giữa người dùng và ứng dụng và các thay đổi từ hội thoại. Test plan: tư liệu hoá các chiến lược, kiểu, các trường hợp và mô tả cho kiểm tra vài khối ứng dụng. Tất cả các kế hoạch tạo thành kế hoạch tổng thể cho ứng dụng.
Kiểm tra được lặp lại cho đến khi không còn lỗi, hoặc đạt được mức độ chấp
nhận.
Bước đầu tiên của xử lý kiểm tra, đầu vào kiểm tra, cấu hình và mã ứng dụng được đòi hỏi để tạo các kiểm tra.
Bước thứ hai là so sánh các kết quả kiểm tra với kết quả dự tính và định lượng sự khác biệt.
Bước tiếp theo là loại trừ các lỗi, hoặc gỡ rối mã. Khi việc mã hoá lại hoàn thành, kiểm tra lại được tiến hành.
Quá trình tiến hành kiểm tra bắt đầu từ khi thiết kế. Cộng tác viên thực hiện việc kiểm tra nên có khả năng của phân tích viên và lập trình viên để có thể hiểu các đòi hỏi của ứng dụng và kiểu cách tiến hành kiểm tra. Chương trình càng lớn và phức tạp thì càng cần người có kinh nghiệm, đôi khi cần có một đội ngũ kiểm tra. Đội ngũ kiểm tra sử dụng yêu cầu chức năng từ giai đoạn phân tích và đặc tả chương trình, đặc tả thiết kế từ giai đoạn thiết kế như là đầu vào để phát triển chiến lược kiểm tra hệ thống. Khi chiến lược đã được hoàn tất, các buổi thảo luận được tiến hành để kiểm tra lại chiến lược và thông báo tới toàn thể đội. Các nhiệm vụ tại các mức sẽ được ấn định. Thời gian được ước lượng. Đội ngũ kiểm tra làm việc độc lập và song song với đội ngũ lập trình. Họ làm việc với quản trị CSDL để phát triển cơ sở dữ liệu mà có thể
hỗ trợ tất cả các mức kiểm tra. Đối với kiểm tra đơn vị, đội kiểm tra kiểm tra kết quả, các chấp nhận các module và chương trình cho kiểm tra tích hợp (integration test). Đội ngũ kiểm tra tiến hành và định lượng các kiểm tra tích hợp và kiểm tra hệ thống.
Như đã nói ở trên, có hai kiểu chiến lược kiểm tra. Kiểu thứ nhất liên quan logic được kiểm tra thế nào trong ứng dụng. Chiến lược kiểm tra logic có thể là black- box hoặc white-box. Chiến lược kiểm tra black-box cho ràng module của chương trình hoặc hệ thống liên quan tới đầu vào và đầu ra. Các chi tiết logic chi tiết được che dấu và không cần phân tích. Chiến lược black-box có tính hướng dữ liệu. White-box hướng tới việc cho rằng logic đặc trưng là quan trọng và cần phải kiểm tra. White-box đánh giá một vài hoặc tất cả mặt logic để kiểm tra được tính đúng đắn của chức năng. White-box hướng về logic - giải thuật.
Kiểu thứ hai liên quan tới việc kiểm tra được tiến hành thế nào, không quan tâm chiến lược kiểm tra logic. Nó là top-down hoặc bottom-up. Top-down coi chương trình chính là quan trọng nhất nên cần phải phát triển và kiểm tra trước và tiếp tục trong quá trình phát triển. Bottom-up cho rằng các module và chương trình riêng sẽ được phát triển hoàn toàn như standalone. Vậy chúng được kiểm tra riêng rẽ sau đó được kết hợp thành kiểm tra tổ hợp.
Kiểm tra Black-box
Kiểm tra hộp đen, black-box, coi xử lý kết quả như là minh chứng bởi dữ liệu. Khái niệm kiểm tra là black-box không quan tâm logic. Khuynh hướng này hiệu quả đối với các modul chức năng đơn và các hệ thống cấp cao. Ba phương pháp chính là:
Phân hoạch cân bằng: Mục đích của phương pháp này là tối thiểu các trường hợp kiểm tra cho trước, các mục dữ liệu vào được chia thành các nhóm dữ liệu có vai trò cân bằng nhau, mỗi nhóm đại diện cho một tập dữ liệu. Nguyên tắc là bằng cách kiểm tra triệt để một mục của mỗi tập hợp, chúng ta có thể chấp nhận tất cả các mục tương đương khác của tập hợp đó cũng sẽ được kiểm tra một cách kỹ càng.
Phântíchcựcbiên:Phân tích giá trị cực biên là một dạng nghiêm ngặt của phân hoạch cân bằng có sử dụng các giá trị biên hơn là bất cứ giá trị nào trong tập cân bằng. Ví dụ: miền giá trị của tháng là 1 – 12 và ngoài là 0 và
13. Thì 4 kiểm tra ứng với bốn trường hợp sẽ được kiểm tra phân tích cực biên thường xuyên được dùng tại các mức modul để xác định các mục dữ liệu đặc trưng cho testing.
Đoánlỗi:Dựa trên cơ sở trực giác và kinh nghiệm, các chuyên gia có thể dễ dàng kiểm tra các điều kiện lỗi bằng cách đoán cái nào dễ xảy ra nhất. Ví dụ, chia 0, nếu modul có phép chia, nên dùng phép chia 0. Vì dựa trên trực giác, nên phép thử này khó tìm hết các lỗi.
Một nhược điểm của phân hoạch cân bằng và phân tích cực biên là tổ hợp của các miền hợp không được xác định. Để bổ sung, người ta dùng sơ đồ nguyên nhân – kết quả (Cause – Effect Graphing). Sơ đồ nguyên nhân – kết quả chỉ ra các đầu ra và thông tin di chuyển như là hệ quả và các đầu vào gây ra hệ quả trên. Các ký hiệu
graphic xác định tương tác, lựa chọn, logic và các điều kiện tương đương. Một vòng đại diện một dãy các thao tác không có điểm quyết định hoặc điều khiển. Mỗi dòng biểu diễn một lớp cân bằng của dữ liệu và các điều kiện sử dụng nó. Mỗi lần graph được thực hiện thì ít nhất một giá trị có nghĩa và một không có nghĩa cho mỗi tập được thử.
White-box testing
Có ba loại kiểm tra hộp trắng là kiểm tra logic -logic test, chứng minh toán học
-mathematical proof và Cleanroom testing.
1 . Logic test
Logic test có thể được chi tiết đến mức lệnh. Trong khi thực hiện của mọi lệnh là mục đích đáng khen ngợi, nó có thể không kiểm tra tất cả các điều kiện thuộc chương trình. Ví dụ, ít nhất 2 kiểm tra cho một kiểm tra 2 điều kiện (1 đúng và 1 sai). Cố gắng kiểm tra tất cả các điều kiện lẽ dĩ nhiên là không thể thực hiện được về thực tiễn. Ví dụ trong 1 module có 10 thao tác qua 4 vòng lặp thì có 5,5 triệu trường hợp kiểm tra. Do đó phải có phương pháp lựa chọn.
Logic kiểm tra nhìn vào mỗi quyết định trong module và sản sinh các dữ liệu để tạo tất cả các kết quả ra có thể. Có một vấn đề với logic test tại mức này là chúng không test tình trạng của module đối với đặc tả. Nếu kiểm tra được phát triển dựa trên đặc tả, mà đặc tả được dịch khác nhau bởi người lập trình thì kiểm tra sẽ không đúng. Giải pháp là đòi hỏi đặc tả chương trình đủ chi tiết và logic. Điều này có thể phù hợp với ngôn ngữ thế hệ 1 và 2.
Các kiểm tra nhiều điều kiện tạo mỗi kết quả ra của tiêu chuẩn đa quyết định và nhiều điểm vào module. Các kiểm tra đòi hỏi việc phân tích xác định được bên quyết định đa tiêu chuẩn. Nếu các biên được xác định không chính xác, thì kiểm tra không hiệu quả. Khi được thiết kế phù hợp, test logic đa điều kiện có thể tối thiểu hoá các trường hợp kiểm tra để kiểm tra nhiều nhất các điều kiện. Sự sử dụng kỹ thuật này đòi hỏi luyện tập và kỹ năng.
2 . Chứng minh bằng toán h ọ c
Một phương pháp theo cách tiếp cận giảm thiếu sót về 0 là áp dụng suy diễn toán học cho đòi hỏi logic, chứng minh tính đúng đắn của chương trình. Phương pháp này đòi hỏi đặc tả ngôn ngữ dạng hình thức. Kỹ thuật chứng minh tính đúng đắn của chương trình được đề cập ở 6.4.
3 . Cleanroom testing
Cleanroom testing là mở rộng của phương pháp chứng minh bằng toán học. Lý thuyết của kỹ thuật này là bằng cách ngăn chặn các lỗi tại các đầu vào của quá trình xử lý, giá thành sẽ giảm, độ tin cậy tăng lên và tiệm cận tới không có lỗi.
Phương pháp này được phát triển tại IBM đầu những năm 1980 bởi Mills, Dyer, Linger. Các đặc tả hình thức được dùng và việc kiểm tra thủ công được tiến hành bởi các đội kiểm tra. Các chương trình khó đọc sẽ được viết lại và kiểm tra hoàn toàn trên giấy.
Cleanroom testing là kỹ thuật kiểm tra toán học hình thức và hội ý
(walkthrough). Mục đích là phân tích mọi module thành các chức năng và liên kết. Các phép kiểm tra chức năng dùng kỹ thuật toán học, các kiểm tra liên kết sử dụng thuyết tập hợp.
Sau khi thực hiện kiểm tra (verification), đội kiểm tra độc lập sẽ dịch và thực hiện mã. Dữ liệu kiểm tra được dịch bởi các phân tích đặc tả chức năng và được thực hiện thể hiện các tỷ lệ xác suất của dữ liệu được giả định cho hệ thống thực. Thêm vào các dữ liệu chuẩn thì các loại lỗi nghiêm trọng được tạo để kiểm tra ứng dụng.
Bất lợi của phương pháp này bắt buộc là đòi hỏi kỹ năng cao về: toán, thống kê, logic và ngôn ngữ đặc tả hình thức.
Kiểm tra top-down
Phương pháp kiểm tra top-down cần một mã ngoài, được hiểu như là một bộ khung để gắn các chức năng gốc, các modul, và các phần khác của ứng dụng. Bộ khung này thường bắt đầu với ngôn ngữ điều khiển công việc và logic chính của ứng dụng. Logic chính được kiểm tra và lập khung theo các hệ thống phân rã. Đầu tiên chỉ có các thủ tục thiết yếu và các logic điều khiển được kiểm tra.
Khi các module thiết yếu nhất đã được kiểm tra và chạy tốt thì mã của các modul ít quan trọng hơn sẽ được gắn vào khung và tiếp tục kiểm tra. Về lý thuyết thì, top-down sẽ tìm thấy các lỗi thiết kế sớm hơn trong kiểm tra thao tác (testing process) hơn các khuynh hướng khác. Phương pháp này ít hiệu quả trong việc cải thiện chất lượng của các phần mềm chuyển giao vì bản chất tương tác của kiểm tra.
Kiểm tra top-down dễ dàng hỗ trợ giao diện người dùng và thiết kế màn hình. Trong các ứng dụng tương tác, thường là bộ điều khiển màn hình được kiểm tra đầu tiên. Người dùng có thể kiểm tra sự điều khiển thông qua màn hình với các phát triển tạo mẫu.
Kiểm tra bottom-up
Nguyên tắc của bottom-up là kiểm tra mọi thay đổi tại module có thể ảnh hưởng tới chức năng của nó. Trong kiểm tra bottom-up, toàn bộ khối là đơn vị để đánh giá. Tất cả các module được mã hoá và kiểm tra riêng rẽ.
Các trường hợp kiểm tra: các trường hợp kiểm tra là dữ liệu vào được tạo để thể hiện từng khối và toàn bộ hệ thống thoả mãn tất cả các yêu cầu thiết kế.
Mỗi trường hợp kiểm tra nên được phát triển để kiểm tra nghiệm các đòi hỏi thiết kế đặc trưng, thiết kế chức năng, hoặc mã đã được thoả mãn. Hơn nữa các trường hợp kiểm tra cần dự đoán các output.
Mỗi đơn nguyên của ứng dụng (Ví dụ: module, subroutine, program, utility,...) phải được kiểm tra với ít nhất hai trường hợp kiểm tra: một trường hợp chạy tốt và một trường hợp không chạy. Trong trường hợp chạy sai hệ phải đưa được thông báo, quay lại (rollback) được trạng thái ban đầu của giao dịch.
Để chắc chắn rằng các trường hợp được toàn diện nhất, người ta thường dùng ma trận. Chúng được dùng cho:
Kiểm tra đơn khối để định nhánh logic, điều kiện logic, các phần dữ liệu hoặc biên dữ liệu để kiểm tra trên cơ sở đặc tả chương trình.
Kiểm tra tổ hợp để định ra yêu cầu về dữ liệu và quan hệ trong số các tương tác.
Kiểm tra hệ thống để xác định yêu cầu về người dùng và hệ thống từ các yêu cầu chức năng và các yêu cầu chấp nhận.
Phối hợp các kiểm tra trong một chiến lược: mục đích của các nhà kiểm tra là tìm ra sự cân bằng của các chiến lược cho phép họ chứng minh được ứng dụng chạy tốt mà tối thiểu hoá chi phí máy tính và nhân lực. Sử dụng duy nhất một chiến lược là rất nguy hiểm. Không có cái nào là duy nhất đúng. Nếu chỉ có white-box thì tài nguyên nhân lực và máy là rất tốn kém, nếu chỉ có black-box các vấn đề logic đặc trưng có thể chưa được khám phá.