I. Tổng Quan Nghiên Cứu Về Đặc Tả và Kiểm Thử Hà Nội
Phần mềm đóng vai trò quan trọng trong xã hội hiện đại. Quá trình phát triển phần mềm bao gồm nhiều giai đoạn, từ thu thập yêu cầu đến triển khai và bảo trì. Giai đoạn kiểm thử phần mềm là rất quan trọng để đảm bảo chất lượng. Lỗi hệ thống có thể gây hậu quả nghiêm trọng, không chỉ về kinh tế mà còn ảnh hưởng đến tính mạng con người. Việc phát hiện lỗi phần mềm càng sớm càng tốt giúp giảm thiểu thiệt hại và chi phí sửa chữa. Do đó, nhiều phương pháp đã được đề xuất để giảm lỗi phần mềm từ giai đoạn thiết kế đến cài đặt. Luận văn này tập trung vào nghiên cứu phương pháp kiểm thử ràng buộc thời gian trong chương trình tương tranh ở pha cài đặt mã nguồn chương trình.
1.1. Tầm quan trọng của đặc tả phần mềm trong quy trình
Trong nhiều hệ thống, cài đặt thực tế thường chỉ được thực hiện sau khi mô hình thiết kế đã được kiểm chứng. Tuy nhiên, việc cài đặt mã nguồn chương trình hoàn toàn có thể vi phạm các ràng buộc thiết kế. Điều này dẫn đến việc phần mềm vẫn tồn tại lỗi mặc dù thiết kế của nó đã được kiểm chứng và thẩm định một cách chi tiết. Các phương pháp kiểm chứng tại thời điểm thực thi thường chỉ phát hiện các lỗi về giá trị đầu ra mà không phát hiện các lỗi vi phạm ràng buộc thiết kế. Do đó, việc nghiên cứu các phương pháp kiểm thử ràng buộc thời gian giữa các thành phần trở nên cần thiết.
1.2. Giới thiệu về kiểm thử giai đoạn giữa và vai trò của nó
Luận văn này tập trung nghiên cứu phương pháp để kiểm thử ràng buộc thời gian chương trình tương tranh ở pha cài đặt mã nguồn chương trình. Sử dụng phương pháp lập trình hướng khía cạnh (AOP) để kiểm chứng ràng buộc thời gian giữa các thành phần trong chương trình tương tranh, cụ thể là thời gian thực thi của các phương thức trong chương trình. Các vi phạm sẽ được phát hiện tại thời điểm thực thi chương trình. Trong hướng tiếp cận này, ràng buộc về thời gian giữa các phương thức của một ứng dụng hướng đối tượng (OOP) viết bằng ngôn ngữ Java sẽ được đặc tả bằng biểu thức chính quy thời gian.
II. Thách Thức Trong Kiểm Thử Phần Mềm Tỉnh Hà Nội
Các chương trình tương tranh có hai thuộc tính cơ bản cần đảm bảo: an toàn (safety) và thực hiện được (liveness). Thuộc tính an toàn đảm bảo chương trình luôn thỏa mãn các ràng buộc của nó. Thuộc tính thực hiện được đảm bảo chương trình cuối cùng sẽ thỏa mãn các ràng buộc của nó. Sự xung đột (interference) xảy ra khi hai hoặc nhiều tiến trình đồng thời truy cập một biến chia sẻ, trong đó ít nhất một tiến trình ghi và các tiến trình khác không có cơ chế để ngăn chặn sự truy cập đồng thời này. Khi đó giá trị của biến chia sẻ và kết quả của chương trình sẽ phụ thuộc vào sự đan xen hay thứ tự thực hiện của các tiến trình.
2.1. Vấn đề đảm bảo chất lượng phần mềm tại Hà Nội
Sự xung đột còn được gọi là cạnh tranh dữ liệu (data race). Tắc nghẽn xảy ra khi hệ thống (chương trình) không thể đáp ứng được bất kỳ tín hiệu hoặc yêu cầu nào. Có hai dạng tắc nghẽn, dạng một xảy ra khi các tiến trình dừng lại và chờ đợi lẫn nhau, ví dụ một chương trình nắm giữ khóa mà các tiến trình khác mong muốn và ngược lại. Dạng hai xảy ra khi một tiến trình chờ đợi một tiến trình khác không kết thúc.
2.2. Khó khăn trong kiểm thử chương trình tương tranh
Một thuộc tính khác tương tự như khóa chết khi các tiến trình liên tục thay đổi trạng thái của nó để đáp ứng với những thay đổi của những tiến trình khác mà không đạt được mục đích cuối cùng. Sự đói (starvation) liên quan đến tranh chấp tài nguyên, vấn đề này xảy ra khi một tiến trình không thể truy cập tài nguyên chia sẻ.
2.3. Các yếu tố ảnh hưởng đến hiệu quả kiểm thử
Java là ngôn ngữ lập trình hướng đối tượng hỗ trợ lập trình tương tranh với cơ chế đồng bộ hóa giữa các tiến trình, mô phỏng bộ nhớ chia sẻ, môi trường lập trình trực quan và hệ thống thư viện phong phú với nhiều giao diện lập trình tương tranh khác nhau. Java được biết đến như một ngôn ngữ lập trình tương tranh được sử dụng rộng rãi trong công nghiệp phần mềm. Java hỗ trợ thư viện APIs bậc cao java.concurrent khiến việc cài đặt chương trình tương tranh trở nên khá dễ dàng.
III. Phương Pháp Đặc Tả Ràng Buộc Thời Gian Cho Hà Nội
Trong luận văn này, tác giả tập trung nghiên cứu phương pháp để kiểm chứng ràng buộc thời gian chương trình tương tranh ở pha cài đặt mã nguồn chương trình. Sử dụng phương pháp lập trình hướng khía cạnh (AOP) để kiểm chứng ràng buộc thời gian giữa các thành phần trong chương trình tương tranh (Hình 1.1) cụ thể là thời gian thực thi của các phương thức trong chương trình. Các vi phạm sẽ được phát hiện tại thời điểm thực thi chương trình. Trong hướng tiếp cận này, ràng buộc về thời gian giữa các phương thức của một ứng dụng hướng đối tượng (OOP) viết bằng ngôn ngữ Java sẽ được đặc tả bằng biểu thức chính quy thời gian.
3.1. Sử dụng biểu thức chính quy thời gian Timed Regular Expressions
Từ các đặc tả đầu vào này mã khía cạnh (aspect) sẽ được tự động sinh ra đan với mã của các thành phần chương trình từ đó kiểm chứng sự tuân thủ ràng buộc thời gian so với đặc tả. Khi đó, trong quá trình chạy của chương trình, các đoạn mã aspect sẽ tự động kiểm tra thời gian thực thi các thành phần trong chương trình và thông báo lỗi khi có vi phạm xảy ra. Tác giả tập trung vào việc xây dựng công cụ TVG (Timed Verify Generator) để sinh mã aspect kiểm chứng một cách tự động từ đặc tả ràng buộc thời gian.
3.2. Công cụ TѴǤ Timed Ѵeгifɣ Ǥeпeгaƚ0г và vai trò của nó
Đầu vào của công cụ TVG là các biểu thức chính quy thời gian. Và đầu ra là các đoạn mã aspect kiểm chứng. Nội dung luận văn được trình bày trong năm chương. Chương 1 giới thiệu về đề tài nghiên cứu. Chương này trình bày ngữ cảnh, các nghiên cứu liên quan, lý do lựa chọn đề tài, nội dung nghiên cứu của đề tài và cấu trúc nội dung của luận văn.
3.3. Các bước thực hiện đặc tả ràng buộc thời gian
Chương này mô tả các kiến thức cơ bản về kiểm chứng phần mềm, một số vấn đề trong chương trình tương tranh, sự tương tranh trong Java và phương pháp lập trình hướng khía cạnh. Chương 3 trình bày nội dung chính nghiên cứu của luận văn là phương pháp đặc tả và kiểm chứng các ràng buộc thời gian giữa các thành phần tuần tự và song song trong chương trình tương tranh.
IV. Kiểm Thử Giai Đoạn Giữa Ứng Dụng Thực Tế Tại Hà Nội
Kiểm thử tại thời điểm thực thi (runtime verification) là kỹ thuật kết hợp giữa kiểm chứng hình thức và thực thi chương trình để phát hiện các lỗi của hệ thống dựa trên quá trình quan sát input/output khi thực thi chương trình. Các hành vi quan sát được sẽ được theo dõi và kiểm tra có thỏa mãn với đặc tả yêu cầu của hệ thống. So sánh với phương pháp kiểm chứng tĩnh thì kiểm chứng tại thời điểm thực thi được thực hiện trong khi thực thi hệ thống. Vì vậy phương pháp này còn được gọi là kiểm thử bị động (passive testing).
4.1. Kiểm thử các ứng dụng cụ thể tại Hà Nội
Kiểm chứng tại thời điểm thực thi nhằm đảm bảo sự tuân thủ giữa cài đặt hệ thống phần mềm so với đặc tả thiết kế của nó. Các trường hợp thường lựa chọn kiểm chứng tại thời điểm thực thi. Không thể đảm bảo được tính đúng đắn giữa sự cài đặt chương trình so với đặc tả thiết kế của nó. Nhiều thông tin chỉ có sẵn hoặc thu thập được tại thời điểm thực thi chương trình. Các hành vi của hệ thống phụ thuộc vào môi trường khi nó được thực thi.
4.2. Đánh giá hiệu quả của phương pháp kiểm thử
Trong các chương trình tương tranh, có hai thuộc tính cơ bản cần đảm bảo là an toàn (safety) và thực hiện được (liveness). Thuộc tính an toàn đảm bảo chương trình luôn thỏa mãn (luôn đúng) các ràng buộc của nó. Ví dụ như ràng buộc sự xung đột (interference) giữa các tiến trình. Thuộc tính thực hiện được đảm bảo chương trình cuối cùng sẽ thỏa mãn (sẽ đúng) các ràng buộc của nó.
4.3. Các công cụ hỗ trợ kiểm thử và đặc tả
Sự xung đột (interference) xảy ra khi hai hoặc nhiều tiến trình đồng thời truy cập một biến chia sẻ, trong đó ít nhất một tiến trình ghi và các tiến trình khác không có cơ chế để ngăn chặn sự truy cập đồng thời này. Khi đó giá trị của biến chia sẻ và kết quả của chương trình sẽ phụ thuộc vào sự đan xen (interleaving) hay thứ tự thực hiện của các tiến trình. Sự xung đột còn được gọi là cạnh tranh dữ liệu (data race).
V. Kết Luận và Hướng Phát Triển Nghiên Cứu Tại Hà Nội
Chương 4 giới thiệu về công cụ và kết quả thực nghiệm của phương pháp. Chương 5 đưa ra kết luận, định hướng phát triển cho đề tài. Cuối cùng là tài liệu tham khảo được sử dụng trong luận văn. Kiểm chứng phần mềm (software verification) là tập các nguyên lý, phương pháp và công cụ để đảm bảo tính đúng đắn của các sản phẩm phần mềm. Trong mục này, luận văn sẽ giới thiệu khái quát hai phương pháp kiểm chứng phần mềm là kiểm chứng hình thức và kiểm chứng tại thời điểm thực thi chương trình.
5.1. Tóm tắt kết quả nghiên cứu về đặc tả và kiểm thử
Phương pháp kiểm chứng mô hình (model checking) được sử dụng để xác định tính hợp lệ của một hay nhiều tính chất mà người dùng quan tâm trong một mô hình phần mềm cho trước. Cho mô hình M và thuộc tính p cho trước, nó kiểm tra thuộc tính p có thỏa mãn trong mô hình M hay không, ký hiệu 𝑀 ⊨ 𝑝 [5]. Về mặt thực thi kiểm chứng mô hình sẽ duyệt qua các trạng thái, các đường thực thi có thể có trong mô hình 𝑀 để xác định tính khả thỏa của ρ. Trong đó các thuộc tính được đặc tả bằng logic thời gian LTL hoặc CTL [5].
5.2. Đề xuất hướng phát triển cho nghiên cứu khoa học
Mô hình M là một cấu trúc Kripke gồm bốn thành phần M = (S, S0, L, Г) với 𝑆 là một tập hữu hạn các trạng thái, S0 ∈ S là trạng thái đầu, 𝑅 ⊂ 𝑆 × 𝑆 là quan hệ chuyển trạng thái, 𝐿 ∶ 𝑆 → 2𝐴𝑃 là hàm gán nhãn với AΡ là tập hữu hạn các mệnh đề nguyên tử được xây dựng từ hệ thống. Một bộ kiểm chứng mô hình [21, 29] (model checker) sẽ kiểm tra tất cả các trạng thái có thể có của mô hình để tìm ra tất cả các đường thực thi có thể gây ra lỗi.