6. Kết quả nghiên cứu, đóng góp khoa học của luận án
1.2.4. Phân nhóm các mô hình đánh giá độ tin cậy phần mềm
Hiện có rất nhiều cách thức phân loại mô hình đánh giá độ tin cậy phần mềm, phụ thuộc vào nhiều tiêu chí phân loại. Một mô hình có thể có nhiều đặc tính, do đó có thể thuộc các nhóm khác nhau khi phân chia theo các cách khác nhau. Chúng tôi giới thiệu một số cách phân loại phổ biến.
1.2.4.1. Phƣơng pháp phân nhóm của Phạm Hoàng
Phạm Hoàng [26] chia các mô hình đánh giá độ tin cậy thành hai nhóm chính: xác định (static) và xác suất (probability).
Các mô hình xác định làm việc với các số đo về toán hạng và toán tử của chương trình, ví dụ như là số lỗi, số dòng mã, vv... Số đo của các mô hình này hoàn toàn dựa trên phân tích tĩnh, không liên quan tới các thao tác ngẫu nhiên. Các mô hình xác suất tìm hiểu các thất bại và lỗi của hệ thống dưới góc nhìn
như là các sự kiện xác suất, bao gồm các nhóm: - Mô hình hạt giống lỗi (Error seeding).
- Tỉ lệ thất bại (Failure rate).
- Dọc theo đường cong (Curve fitting).
- Tăng trưởng độ tin cậy (Reliability growth). - Cấu trúc Markov (Markov structure).
- Dãy thời gian (Time series).
9
1.2.4.2. Phƣơng pháp phân nhóm của Lyu
Michael R. Lyu [66] đưa ra cách phân loại theo ý tưởng của Musa và Okumoto dựa trên năm đặc điểm của mô hình:
Miền thời gian (Time domain)
Nhóm (Category): số lượng thất bại của hệ thống là hữu hạn hay vô hạn. Kiểu (Type): thời điểm xảy ra lỗi thuộc phân phối Poisson hay nhị thức. Lớp (Class): (chỉ với nhóm hữu hạn) tần suất lỗi là hàm của thời gian. Họ (Family): tần suất lỗi là hàm của số lượng lỗi dự kiến.
1.2.4.3. Phƣơng pháp phân nhóm của Chengjie
Chengjie X.C. [94] chia các mô hình vào ba nhóm: Nhóm Bayesian: mô hình L-V [8].
Nhóm xác suất:
- Nhóm nhỏ Markov: mô hình Jelinski và Moranda, v.v...
- Nhóm nhỏ Poisson không đồng nhất: mô hình Goel và Okumoto, mô hình Duane, mô hình Pham, v.v...
Nhóm tĩnh: mô hình lỗi hạt giống [25].
1.2.4.4. Phƣơng pháp phân nhóm theo mô hình cây phân cấp
Chúng tôi đề xuất phương pháp phân nhóm được trình bày như Hình 1.1 dựa trên dữ liệu được sử dụng trong quá trình xây dựng mô hình.
Các mô hình đánh giá độ tin cậy thông qua tài nguyên dự án: độ tin cậy của hệ thống được đánh giá từ các thông số về mặt tài nguyên của dự án như số lượng mã nguồn, các biểu đồ biểu diễn, v.v..
Các mô hình đánh giá độ tin cậy thông qua phân tích đặc tính của quá trình phát hiện lỗi: độ tin cậy của hệ thống được tính toán dựa trên các đặc tính của quá trình phát hiện lỗi trong toàn bộ vòng đời của phần mềm.
Các mô hình đánh giá độ tin cậy thông qua phân tích sự phân phối ngẫu nhiên của quá trình phát hiện lỗi. Trong suốt vòng đời phần mềm, các lỗi sẽ được phát hiện tại các thời điểm rời rạc khác nhau. Do đó, quá trình các thời điểm xảy ra lỗi được xem xét như là một quá trình ngẫu nhiên. Từ đó sử dụng các mô hình ngẫu nhiên toán học để mô hình quá trình đó. Nhóm này chia thành hai nhóm nhỏ dựa trên quá trình ngẫu nhiên được sử dụng:
- Nhóm các mô hình dựa trên tiến trình Markov
- Nhóm các mô hình dựa trên tiến trình Poisson không đồng nhất.
1.3. Các hƣớng tiếp cận đánh giá độ tin cậy hệ thống phần mềm
Ở các mục trước, chúng tôi đã giới thiệu những lý thuyết cơ bản được sử dụng trong nghiên cứu về mô hình hóa độ tin cậy phần mềm, gồm các kiến thức toán học sử
10
dụng trong mô hình hóa và khái niệm, tính chất của độ tin cậy phần mềm. Áp dụng các kiến thức cơ bản đó, trong mục này, chúng tôi trình bày các cách tiếp cận khác nhau trong mô hình độ tin cậy phần mềm.
Hình 1.1. Phân loại các mô hình độ tin cậy phần mềm theo cây phân cấp
Dựa trên phân phối của quá trình phát hiện lỗi
NHPP
Không hoàn hảo dạng S
Tỉ lệ
Hình dạng S
Chữa lỗi không hoàn hảo Tiến trình Markov Mô hình độ tin cậy phần mềm Ohba dạng S Yamada dạng S Yamada 1 Yamada 2 Goel-Okumoto Markov Jelinski-Moranda Schick-Wolverton Halstead McCabe Mills Tohma PNZ Pham tỉ lệ Pham Zhang Pham r.buộc t.số Goel-Okumoto NHPP Ohba tỉ lệ Yamada-Osaki Cai
Sch-Wol cải tiến
Moranda tỉ lệ xác định
Musa
Nakagawa
Dựa trên tài nguyên dự án
Dựa trên đặc tính quá trình phát hiện lỗi
11
1.3.1. Nhóm mô hình đánh giá độ tin cậy dựa trên phân tích tài nguyên dự án phát triển phần mềm án phát triển phần mềm
Trong quá trình xây dựng phần mềm, dự án phát triển bao gồm một số tài nguyên như chi phí, nhân công, mã nguồn, v.v... Halstead [26] và McCabe [85] giới thiệu các mô hình tính toán độ tin cậy phần mềm dựa trên tài nguyên mã nguồn của dự án.
1.3.1.1. Độ đo Halstead
Lý thuyết Halstead [26] về độ đo phần mềm có thể coi là lý thuyết tốt nhất để đánh giá về độ phức tạp của phần mềm. Lý thuyết này dựa trên khái niệm về "toán tử (operator)" và "toán hạng (operand)", do đó độ đo này sẽ lệ thuộc vào ngôn ngữ lập trình. Halstead sử dụng các mô tả sau cho ngôn ngữ lập trình C:
Toán tử: bao gồm toán tử phép tính số học (’+’), toán tử so sánh(’<’), toán tử gán (’+=’), toán tử dịch bit (’>>’), toán tử logic (’&&’), toán tử từ khóa điều khiển (’while’), toán tử khai báo kiểu (’double’), lời gọi hàm, tham chiếu phần tử của tập hợp/bản ghi/mảng, vv...
Toán hạng: bao gồm tên biến, tên hằng, nhãn, tên hàm, v.v..
Bên cạnh đó, Halstead sử dụng các kí hiệu sau khi thực hiện các phép tính toán thông số của chương trình:
: số lượng toán tử khác nhau xuất hiện trong chương trình. : số lượng toán hạng khác nhau xuất hiện trong chương trình.
: tổng số lượng toán tử trong chương trình (một toán tử có thể xuất hiện nhiều lần).
: tổng số lượng toán hạng trong chương trình (một toán hạng có thể xuất hiện nhiều lần).
Sau khi thu thập từ thực tế các thông số trên, Halstead cung cấp các công thức giúp ước lượng được các thông số dẫn xuất sau:
1. : độ dài chương trình. "Độ dài Halstead (Halstead Program Length)" của chương trình mô tả kích thước của một chương trình trừu tượng thu được bằng cách chỉ giữ lại các toán tử và toán hạng và loại bỏ tất cả các thành tố khác. được ước lượng bởi công thức:
(1.9)
2. : kích thước chương trình. "Kích thước Halstead (Halstead Program Volume)" của chương trình ước lượng số bit cần dùng để lưu trữ chương trình trừu tượng độ dài nếu các toán tử và toán hạng được mã hóa nhị phân. được ước lượng bởi công thức:
(1.10) 3. : mức độ chương trình. "Mức độ Halstead (Halstead Program Level)" của
chương trình mô tả tỉ lệ giữa kích thước chương trình hiện tại và chương trình cài đặt "nhỏ gọn nhất" của cùng thuật toán. Một cài đặt dài sẽ có mức độ thấp hơn một cài đặt ngắn. được ước lượng bởi công thức:
12
(1.11)
4. : độ khó chương trình. "Độ khó Halstead (Halstead Program Difficulty)" của chương trình là nghịch đảo của mức độ chương trình: cài đặt dài hơn sẽ có độ khó lớn hơn. Độ khó tăng lên khi số lượng toán tử khác nhau tăng hoặc tỉ lệ xuất hiện trung bình của toán hạng tăng. được ước lượng bởi công thức:
(1.12)
5. : sức gia công chương trình. "Sức gia công Halstead (Halstead Program Effort)" của chương trình tỉ lệ thuận với độ khó và kích thước chương trình:
(1.13)
6. : độ thông minh chương trình. "Độ thông minh nội dung Halstead (Halstead Intelligent Content)" của chương trình mô tả sự độc lập của thuật toán với ngôn ngữ lập trình và được ước lượng bởi công thức:
(1.14)
Từ đó có hai công thức Halstead1 và Halstead2 ước tính số lượng lỗi của chương trình:
̂
(1.15)
̂
(1.16)
1.3.1.2. Độ đo độ phức tạp xoay vòng của McCabe
Bảng 1.1. Độ phức tạp McCabe của một số cấu trúc cơ bản
Cấu trúc Lƣu đồ Độ phức tạp xoay vòng
Tuần tự
If .. then ..
else
While .. do
13
"Độ đo độ phức tạp xoay vòng McCabe (McCabe’s Cyclomatic Complexity Metric)" [85] là độ đo dựa trên đồ thị luồng điều khiển tương ứng của chương trình. Độ phức tạp mang tính xoay vòng cung cấp định lượng về độ phức tạp của chương trình bằng cách đánh giá các điểm rẽ nhánh của đồ thị luồng điều khiển, tương ứng với nó là các điểm rẽ nhánh trong mã nguồn. Ban đầu, một thủ tục rỗng với đồ thị luồng điều khiển nối thẳng từ điểm vào đến điểm kết thúc sẽ có độ phức tạp xoay vòng bằng 1. Độ đo này sẽ tăng lên 1 mỗi khi các từ khóa sau xuất hiện: If, Repeat, While, For, Or, And.
Theo Berger [1], "số xoay vòng (cyclomatic number)" của đồ thị có hướng bao gồm thành phần liên thông mạnh được định nghĩa là:
(1.17) với và . Chúng ta hoàn toàn có thể chứng minh được chính bằng số lượng tối đa chu trình độc lập tuyến tính của : kích thước của tập các chu trình tạo nên cơ sở của tất cả các chu trình trên . McCabe gợi ý rằng chương trình có độ đo McCabe cao sẽ tạo ra khó khăn trong sản xuất cũng như bảo hành và đưa ra cận trên tốt nhất của chương trình Fortran là 10. Khi ứng dụng khái niệm số đo xoay vòng vào lưu đồ của một chương trình, McCabe đưa ra một số chú ý sau:
Đồ thị luồng điều khiển chương trình không phải là một đồ thị có hướng liên thông mạnh: cần thêm một cạnh ảo nối từ đầu ra out tới đầu vào in.
Thông thường đồ thị luồng điều khiển khi thêm cạnh ảo ở trên vào sẽ có một thành phần liên thông.
(1.18) Số 2 trong công thức (1.18) có được do và một cạnh ảo được thêm vào. Một số lưu đồ cơ bản và số xoay vòng tương ứng được trình bày trong Bảng 1.1. Độ phức tạp xoay vòng đánh giá mức độ khó khăn khi tiến hành kiểm thử tất cả các đường đi trên đồ thị luồng điều khiển, từ đó cung cấp các thông tin hữu ích trong đáp ứng các yêu cầu và mô tả của phần mềm. Tuy nhiên, theo Friedman [63], độ đo McCabe sẽ không hữu ích nếu nhà phát triển và kiểm thử muốn phát hiện và loại bỏ tất cả các lỗi của phần mềm.
1.3.2. Nhóm mô hình đánh giá độ tin cậy dựa trên phân tích đặc tính của quá trình phát hiện lỗi trong quá trình phát triển phần mềm quá trình phát hiện lỗi trong quá trình phát triển phần mềm
Cách tiếp cận sử dụng các tài nguyên dự án như đã đề cập ở tiểu mục trước gặp nhiều nhược điểm. Rõ ràng, tài nguyên "tĩnh" của dự án không phản ánh nhiều tính chất của dự án, khi phần mềm ngày càng phức tạp và được xây dựng thông qua nhiều kiến trúc và pha khác nhau. Kiểm thử là một pha chính trong vòng đời phát triển phần mềm. Mills[25], Cai [50] và Tohma [99] giới thiệu các mô hình áp dụng trên dữ liệu thực tế về quá trình kiểm thử, từ đó tính toán được các giá trị độ đo liên quan tới độ tin cậy phần mềm.
1.3.2.1. Mô hình hạt giống lỗi của Mills
Mills [25] đưa ra một thủ tục nhằm ước tính số lỗi trong chương trình bằng cách chèn thêm các "lỗi hạt giống (error seeding)" vào phần mềm. Từ dữ liệu thu được
14
khi chữa lỗi, bao gồm cả lỗi có sẵn và lỗi hạt giống, số lượng chưa biết các lỗi sẵn có sẽ được tính toán ra. Giả sử lỗi có sẵn và lỗi hạt giống có khả năng bị phát hiện ra là như nhau, từ tỉ lệ lỗi hạt giống trên tổng lỗi được phát hiện trong quá trình chữa lỗi ta có tổng số lỗi có sẵn là:
(1.19) với : số lỗi có sẵn. : số lỗi hạt giống.
: tổng số lỗi phát hiện khi chữa lỗi. : số lỗi có sẵn bị phát hiện khi chữa lỗi.
1.3.2.2. Mô hình Cai
Cai [50] đã cải tiến mô hình Mills bằng cách chia hệ thống thành hai phần: phần 0 và phần 1. Mô hình này được dùng để đánh giá số lượng khuyết tật còn lại của hệ thống. Cai sử dụng các giả thiết:
1. Hệ thống tồn tại khuyết tật: phần 0 chứa N0 và phần 1 chứa N1 khuyết tật, khi đó có N = N0 + N1.
2. Các khuyết tật có xác suất bị phát hiện là như nhau. 3. Khuyết tật bị gỡ bỏ ngay sau khi phát hiện.
4. Mỗi lần chỉ loại bỏ một khuyết tật và không có khuyết tật nào được thêm vào. 5. Đã loại bỏ được khuyết tật tồn tại trong tổng số .
Cho biểu diễn thời điểm khuyết tật thứ bị gỡ bỏ. là biến ngẫu nhiên thỏa mãn:
Gọi là số lượng khuyết tật trong phần trong khoảng thời gian với
, . Giả sử là giá trị quan sát của và . Khi đó có:
∑ (1.20) ∑ (1.21) với . Gọi là xác suất một khuyết tật trong phần được phát hiện trong khoảng thời gian với , . Từ đó có:
∑
(1.22)
15
∑
(1.23)
và được ước tính thông qua sử dụng phương pháp hợp lý cực đại:
∏ ( ∑ ∑ ) (1.24) Ta có loga tự nhiên hàm hợp lý: ∑ ( ( ∑ ) , (1.25)
Lấy đạo hàm bậc nhất theo các biến và và xét bằng 0, từ đó ta có công thức ước lượng của N0 và N1:
∑ ( ̂ ∑ ̂ ̂ ) ∑ ̂ ∑ ∑ ̂ ̂ (1.26) ∑ ( ̂ ∑ ̂ ̂ ) ∑ ̂ ∑ ∑ ̂ ̂ (1.27) Tổng số lỗi của hệ thống sẽ là: ̂ ̂ ̂ (1.28)
Cai xây dựng công thức (1.28) nhằm ước lượng được tổng số lỗi của hệ thống thông qua việc giải hệ hai phương trình độc lập tuyến tính (1.27) và (1.28) khi có bảng phân bố giá trị của .
1.3.2.3. Mô hình Tohma
Tohma [99] giới thiệu mô hình nhằm ước lượng số lượng lỗi khởi thủy của chương trình tại thời điểm bắt đầu tiến trình kiểm thử dựa trên phân phối "siêu hình học (hypergeometric)". Như đã biết, nếu từ một giỏ gồm quả bóng trắng lấy ra quả, số lượng bóng trắng trong mỗi lần lấy ra là biến ngẫu nhiên tuân theo phân phối siêu hình học. Khi đó xác suất để nhận giá trị nguyên dương là:
16 ( ) ( ) ( ) (1.29) trong đó: ∑ (1.30)
là giá trị quan sát của . Chú ý rằng là số bóng trắng ở mỗi lần lấy, do đó
sẽ là tổng số bóng trắng trong các lần lấy từ trước đến giờ và cũng chính là số bóng đỏ ở thời điểm hiện tại, tức sẽ là số bóng trắng còn lại. Ngoài ra giá trị kì vọng của là:
̂ (1.31) Ước tính giá trị và thông qua sử dụng hai phương pháp:
Phương pháp hợp lý cực đại, hàm hợp lý dựa trên phân phối siêu hình học là:
∏ (1.32) ∑ (1.33) với là tổng số mẫu theo dõi. Khi đó hệ phương trình tương ứng sẽ là:
{ ∑ ( ) ( ) ( ) ∑ ( ) ( ) ( ) (1.34)
Phương pháp cực tiểu hóa bình phương, hàm đánh giá là:
∑ * + (1.35) Từ đó có hệ phương trình tương ứng: { ∑ * + ∑ * + (1.36) và nghiệm là:
17 { ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ (1.37)
Thực tế, việc giải đúng các hệ phương trình trên là phức tạp, do đó Tohma đề xuất áp dụng một số phương pháp giải gần đúng sử dụng các công thức xấp xỉ sau:
1. Vi phân của tổ hợp được xấp xỉ bởi:
( ) [( * ( *] (1.38) 2. Công thức xấp xỉ Stirling: √ (1.39)
3. Sử dụng phân phối nhị phân:
( * ( * [ ]
(1.40) 4. Sử dụng phân phối thường:
√
( *
(1.41)
Ứng dụng thực tế vào mô hình độ tin cậy hệ thống phần mềm, Tohma sử dụng các giả thiết:
Chương trình chứa lỗi khi bắt đầu pha kiểm thử.
Các bộ kiểm thử trong một khoảng thời gian (1 tuần hoặc 1 ngày) được gọi là các trường hợp kiểm thử (test instance) và được đánh dấu bằng với . Khi đó mỗi phép thử lấy ra quả bóng tương đương với một trường hợp kiểm thử được thực thi trên phần mềm. Rõ ràng khi đó là