Chương 1: Tổng quan về đề tài Chương 2: Cơ sở lý thuyết Trang 4 Chương 3: Giải pháp kiểm tra chương trình chưa hoàn chỉnh Chương 4: Hiện thực ứng dụng kiểm tra mô hình cho các chương trình chưa hoàn chỉnh. Chương 5: Kết quả thực nghiệm và đánh giá Chương 6: Kết luận và hướng phát triển Trang 5 CHƯƠNG 2. CƠ SỞ LÝ THUYẾT Trong chương này, học viên sẽ trình bày sơ lược các lý thuyết đã được nghiên cứu và áp dụng trong luận văn.1 Kiểm tra hệ thống (system verification) Ngày nay, các hệ thống công nghệ thông tin và truyền thông (hệ thống ICT – ICT systems [23]) ngày càng được sử dụng phổ biến. Với sự phát triển của công nghệ và internet, các hệ thống này ngày càng phức tạp và xuất hiện ở mọi lĩnh vực của đời sống.
Theo số liệu thống kê năm 1995 [23], mỗi người tiếp xúc trung bình với 25 thiết bị ICT mỗi ngày. Các dịch vụ như chuyển tiền điện tử hay mua sắm từ xa đã dần trở thành hiện thực và ngày càng phổ biến. Số tiền hàng ngày được sử dụng qua kênh Internet lên đến 1012 triệu đô la Mỹ. Khoảng 20% chi phí sản xuất các sản phẩm vận tải hiện đại như xe hơi, tàu cao tốc, máy bay là dành cho hệ thống xử lý thông tin.
Các hệ thống ICT phổ biến và có mặt ở tất cả mọi nơi. Chúng điều khiển thị trường chứng khoán, đóng vai trò trung tâm chuyển mạch điện thoại, đóng vai trò trọng yếu trong công nghệ internet, và đóng nhiều vai trò quan trọng trong các hệ thống y khoa. Sự phổ biến của các hệ thống này càng làm tăng tính ảnh hưởng của chúng tới các hoạt động của xã hội con người. Để đánh giá các hệ thống này, ngoài các tiêu chí về hiệu suất như thời gian xử lý nhanh, khả năng xử lý với lượng dữ liệu lớn, một trong những tiêu chí quan trọng cần được xem xét là hệ thống có chứa lỗi hay không.
Xét trên tầm ảnh hưởng của các hệ thống ICT, mặc dù các lỗi trong phần cứng và phần mềm có thể không làm nguy hại tới cuộc sống của con người, tuy nhiên chúng sẽ gây những hậu quả xấu về tài chính cho các nhà sản xuất. Hệ thống ICT hoạt động đúng là điều kiện cần thiết cho sự tồn tại của một công ty. Trong lịch sử đã có nhiều thiệt hại tài chính to lớn gây ra bởi các lỗi xuất hiện trong các hệ thống này. Một lỗi trong phép chia với số thực trong bộ xử lý Intel Pentium II ở đầu thập niên 90 gây thiệt hại 475 triệu đô la Mỹ để thay thế các bộ xử lý bị lỗi, đồng thời gây ảnh hưởng nặng nề đến danh tiếng của Intel.
Trục trặc trong hệ thống xử lý hành lý xách tay làm sân bay Denver phải dời ngày mở cửa sau 9 tháng Trang 6 với thiệt hại ước tính 1.1 triệu đô la Mỹ mỗi ngày. Một công ty hàng không lớn cũng có thể bị phá sản nếu gặp lỗi trong hệ thống đặt vé trực tuyến. Đó là một số thí dụ về thiệt hại nặng nề gây ra bởi việc các hệ thống ICT có tồn tại lỗi. Trong nhiều trường hợp, những lỗi hệ thống có thể gây nên những thảm họa lớn.
Một lỗi tai hại trong phần mềm điểu khiển phóng tên lửa Ariane-5 và máy bay Airbus đã gây nên những thảm họa to lớn làm chấn động toàn thế giới cho đến ngày nay. Người ta cũng dùng các phần mềm trong việc điều khiển hoạt động của các hệ thống cần an toàn tuyệt đối như điều khiển nhà máy điện nguyên tử, nhà máy điện hạt nhân, hệ thống quản lý và cảnh báo giao thông, hệ thống cảnh báo bão và sóng thần… Rõ ràng rằng, lỗi xảy ra trong các phần mềm này có thể gây ra những hậu quả to lớn khó lường. Thí dụ như lỗi phần mềm trong bộ phận điều khiển của máy chữa bệnh bằng tia bức xạ Thera-25 đã làm chết sáu bệnh nhân ung thư từ năm 1985 đến 1987 mà nguyên nhân là bởi những bệnh nhân này đã bị điều trị quá liều bức xạ. Từ việc ứng dụng ngày càng rộng rãi các hệ thống xử lý thông tin, ta có thể nói rằng: Tính ổn định là vấn đề cốt yếu trong quá trình thiết kế hệ thống.
Tầm quan trọng, cũng như tính phức tạp của các hệ thống ICT ngày càng phát triển nhanh chóng. Các hệ thống ICT hiện nay không còn là một cá thể độc lập nữa mà thường được nhúng trong một môi trường lớn hơn, có kết nối và tương tác với nhiều thành phần và hệ thống khác nhau. Điều đó đồng nghĩa với việc chúng càng dễ xảy ra lỗi, bởi số lượng lỗi có thể bùng nổ rất nhanh chóng so với số thành phần trong hệ thống. Điều đó đặt ra nhu cầu thiết yếu trong việc kiểm tra hệ thống một cách toàn diện.
Các kỹ thuật kiểm tra hệ thống (system verification) ngày càng được áp dụng nhiều vào việc thiết kế hệ thống ICT. Về cơ bản, kiểm tra hệ thống là việc xác minh thiết kế hoặc sản phẩm được xem xét có các thuộc tính cần thiết hay không. Các thuộc tính cần kiểm chứng thường được định nghĩa từ bản đặc tả hệ thống. Tài liệu này sẽ mô tả hệ thống sẽ phải làm gì, và không nên làm gì và đó là nền tảng cho mọi hoạt động kiểm tra.
Một lỗi sẽ được tìm thấy khi hệ thống không đáp ứng một trong các tính chất được đặc tả. Hệ thống sẽ được xem là “đúng” khi Trang 7 nó thỏa mãn mọi tính chất rút ra từ bản đặc tả. Lược đồ của quá trình kiểm tra được minh họa như Hình 2.1: Lược đồ của quá trình kiểm tra Quá trình kiểm tra một hệ thống sẽ bao gồm kiểm tra phần cứng và kiểm tra phần mềm. Trong luận văn này chủ yếu đề cập đến các kiến thức về kiểm tra phần mềm.1 Kiểm thử phần mềm (software testing) Kiểm thử phần mềm (software testing) [7] là hoạt động khảo sát thực tiễn sản phẩm hay dịch vụ phần mềm trong đúng môi trường chúng dự định sẽ được triển khai nhằm cung cấp cho người có lợi ích liên quan những thông tin về chất lượng của sản phẩm hay dịch vụ phần mềm ấy.
Mục đích của kiểm thử phần mềm là tìm ra các lỗi hay khiếm khuyết phần mềm nhằm đảm bảo hiệu quả hoạt động tối ưu của chúng trong nhiều ngành khác nhau. Tùy thuộc vào phương pháp kiểm thử được sử dụng, quá trình kiểm thử phần mềm có thể được thực thi tại bất kỳ giai đoạn nào trong quy trình phát triển 1 Hình vẽ lấy từ [23], trang 8 Trang 8 phần mềm. Tuy nhiên, hầu hết các công việc kiểm thử đều được thực hiện sau khi các yêu cầu đều đã được định nghĩa, phân tích và hiện thực (coding). Có 2 phương pháp kiểm thử chính là: kiểm thử tĩnh (static testing) và kiểm thử động (dynamic testing).
Kiểm thử tĩnh là phương pháp kiểm thử phần mềm đòi hỏi phải duyệt lại các yêu cầu và các đặc tả bằng tay, thông qua việc sử dụng giấy, bút để kiểm tra logic, lần từng chi tiết mà không cần thực thi chương trình. Kiểm thử động là phương pháp kiểm thử thông qua việc thực thi chương trình trên một máy tính cụ thể nhằm kiểm tra các kết quả đầu ra cũng như tác động thực tế của chương trình. Trong kiểm thử động, phần mềm phải thực sự được biên dịch/thông dịch và thực thi trên môi trường thực tế. Quy trình kiểm thử động bao gồm việc thực thi phần mềm, nhập các giá trị đầu vào và kiểm tra xem liệu đầu ra có như mong đợi hay không.
Các phương pháp kiểm thử động phổ biến bao gồm: kiểm thử đơn vị (unit tests), kiểm thử tích hợp (intergration tests), kiểm thử hệ thống (system tests) và kiểm thử chấp nhận sản phẩm (acceptance tests). Trong kiểm thử phần mềm, có ba chiến lược kiểm thử thông dụng nhất là kiểm thử hộp đen (black-box testing), kiểm thử hộp trắng (white-box testing), và kiểm thử hộp xám (gray-box testing). Kiểm thử hộp đen là kiểu kiểm thử dựa vào các đặc tả đầu vào và đầu ra của chương trình mà hoàn toàn không quan tâm đến cấu trúc bên trong của nó trong khi kiểm thử hộp trắng là kiểu kiểm thử dựa vào cấu trúc logic và thuật toán bên trong của chương trình. Kiểm thử hộp xám đòi hỏi phải có sự truy cập tới cấu trúc dữ liệu và giải thuật bên trong cho những mục đích thiết kế các test cases, nhưng là kiểm thử ở mức người sử dụng (hay mức hộp đen).2 Kiểm tra phần mềm (software verification) Kiểm thử phần mềm là một khâu cần thiết để nâng cao chất lượng của hệ thống.
Tuy nhiên, các phương pháp kiểm thử truyền thống đều có nhược điểm chung là chi phí khá cao (do cần tiêu tốn nhiều nhân lực cho công việc kiểm thử) và không an toàn (do trong hầu hết các trường hợp, các kiểm thử viên phải thực thi phần mềm cần kiểm thử trên hệ thống thực để quan sát các kết quả trả về). Do đó, Trang 9 một xu hướng nhằm kiểm định chất lượng sản phẩm phần mềm được quan tâm phát triển trong thời gian gần đây là kiểm tra phần mềm. Kiểm tra phần mềm (software verification) [1][2] là quá trình xem xét một hệ thống phần mềm có thực hiện đúng các chức năng được mong đợi hay không. Mục tiêu của quá trình này nhằm đảm bảo phần mềm được tạo ra thỏa mãn tất cả các yêu cầu ban đầu của hệ thống.
Các kỹ thuật kiểm tra phần mềm có thể được gom thành hai hướng tiếp cận chính là kiểm tra động (dynamic verification) và kiểm tra tĩnh (static verification).3 Kiểm tra động (dynamic verification) Kiểm tra động là việc thực thi chương trình và so sánh kết quả trả về với lời giải để đưa ra kết luận là kết quả đó đúng hay sai. Quá trình kiểm tra động thực chất chính là quá trình thực hiện kiểm thử mà trong đó, các bộ dữ liệu đầu vào sẽ lần lượt được thực thi với chương trình cần kiểm tra và thực hiện so sánh kết quả thực thi với lời giải mẫu. Quá trình kiểm tra động được minh họa bằng sơ đồ ở Hình 2. INPUT EXECUTING OUTPUT COMPARING RESULT PROGRAM SOLUTION Hình 2.2: Minh họa quá trình Kiểm tra động 2.4 Kiểm tra tĩnh (static verification) Kiểm tra tĩnh là tập các quá trình phân tích mã nguồn nhằm xác định chương trình được kiểm tra có thỏa mãn yêu cầu đặt ra hay không mà không thực sự thực thi đoạn chương trình đó.
Quá trình kiểm tra tĩnh được minh họa bằng sơ đồ ở Hình 2. Trang 10 VERIFYING PROGRAM RESULT (USING PROVERS/MODEL CHECKERS) REQUIREMENT Hình 2.