MỞ ĐẦU 1. Bối cảnh nghiên cứu Trong những năm gần đây, khi công nghệ thông tin càng ngày càng phát triển, phần mềm thực sự trở thành một phần không thể thiếu trong các doanh nghiệp. Mỗi bộ phận trong mỗi doanh nghiệp đều phụ thuộc vào phần mềm để hỗ trợ việc phát triển, sản xuất, quảng cáo và tiếp thị các sản phẩm và dịch vụ của họ. Trong các giai đoạn phát triển phần mềm, giai đoạn phát hiện, xác định và sửa các lỗi phần mềm là giai đoạn không thể thiếu nhằm đảm bảo chất lượng của các sản phẩm phần mềm.
Trong một tổ chức phát triển thương mại điển hình, chi phí dành cho các công việc gỡ lỗi (debugging), kiểm thử (testing) và các hoạt động kiểm chứng phần mềm (verification activities) chiếm từ 50 đến 70% tổng chi phí phát triển [7]. Với tốc độ phát triển đến chóng mặt của lĩnh vực công nghệ thông tin và truyền thông trên cả các hệ thống phần cứng và phần mềm, khả năng xảy ra nhiều lỗi, đặc biệt là các lỗi phức tạp là rất cao. Những lỗi này có thể gây ra những hậu quả nghiêm trọng về tiền bạc, thời gian, thậm chí sinh mạng của con người. Nhìn chung, một lỗi càng sớm được phát hiện sẽ càng mất ít công sức để sửa lỗi, thậm chí có thể phải xây dựng lại toàn bộ hệ thống từ đầu.
• Theo thống kê của Standish Group, Mỹ (2000) [8]: Trên 350 công ty với hơn 8000 dự án phần mềm có: 31% dự án phần mềm bị huỷ bỏ trước khi được hoàn thành. Với các công ty lớn, chỉ có khoảng 9% tổng số các dự án hoàn thành đúng tiến độ và trong ngân sách dự án (với các công ty nhỏ, tỷ lệ này vào khoảng 16%). • Theo nghiên cứu của NIST, Mỹ (2002) [10]: Chi phí hàng năm dành cho việc phát hiện các lỗi phần mềm lên đến 59.5 tỉ đô la chiếm từ 0.6% GDP kinh tế nước Mỹ. • Theo thống kê của NASA IV&V Center (2000) [10]: Ngành công nghiệp không gian vũ trụ mất đến hàng tỉ đô la và hàng trăm sinh mạng con người trong những năm cuối thập niên 1990 vì các vấn đề liên quan đến phần mềm.
Quá trình phát triển phần mềm bao gồm rất nhiều giai đoạn: Thu thập yêu cầu, phân tích, thiết kế, xây dựng, kiểm tra, triển khai và bảo trì phần mềm. Trong các giai đoạn đó giai đoạn kiểm tra, phát hiện, xác định và sửa các lỗi phần mềm là rất quan trọng để đảm bảo chất lượng của một phần mềm. Để phát hiện ra các lỗi phần mềm, phần mềm cần được kiểm chứng (Verification) và 1 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com thẩm định (Validation) [9, 11]. Thẩm định cần có sự tham gia của khách hàng nhằm kiểm tra xem phần mềm có thực sự đáp ứng các yêu cầu của khách hàng hay không.
Kiểm chứng là kiểm tra phần mềm có được thiết kế và thực thi đúng như đặc tả hay không. Mục tiêu chính của phát triển phần mềm là phải làm sao tạo ra được những sản phầm phần mềm có chất lượng tốt nhất. Để giúp làm được điều đó kiểm chứng phần mềm là phần không thể thiếu. Kiểm chứng phần mềm giúp làm giảm thiểu lỗi phần mềm tới mức có thể chấp nhận được.
Chính vì vậy, nó có vai trò vô cùng quan trọng trong toàn bộ quy trình phát triển phần mềm và trong ngành công nghệ phần mềm hiện nay. Chính vì thế, trong công nghệ phần mềm, kiểm chứng phần mềm luôn thu hút được mối quan tâm của rất nhiều nhà nghiên cứu. Việc viết tập hợp các ca kiểm thử (test cases) là một phần quan trọng không thể thiếu trong phương pháp kiểm thử phần mềm. Tập hợp các ca kiểm thử đúng đắn giúp giảm thiểu tối đa các lỗi, giảm thời gian tìm kiếm lỗi, tạo ra được các phần mềm tốt, tính ổn định cao.
Nội dung nghiên cứu Kiểm thử là giai đoạn quan trọng trong quá trình phát triển phần mềm. Có rất nhiều nguyên nhân gây ra lỗi trong phần mềm, nó nằm ở tất cả các giai đoạn trong quy trình phát triển phần mềm, và lập trình cũng là một trong số các giai đoạn đó. Lỗi xuất hiện do lập trình gây ra là hoàn toàn dễ hiểu, trong thời kỳ đầu của ngành công nghiệp phần mềm, phát triển phần mềm cũng có nghĩa là lập trình, việc lập trình được thực hiện hoàn toàn thủ công, chính vì thế lỗi gây ra do lập trình là chủ yếu. Ngày nay, lập trình chỉ là một công đoạn trong quá trình phát triển phần mềm, được hỗ trợ bởi nhiều công cụ lập trình cao cấp, do đó việc lập trình đã trở nên nhẹ nhàng hơn, tuy nhiên không phải vì vậy mà lỗi lập trình lại mất đi.
Người ta áp dụng rất nhiều kỹ thuật trong kiểm thử nhằm mục tiêu thiết kế ra các ca kiểm thử có khả năng phát hiện ra nhiều lỗi nhất trong chương trình. Tuy nhiên, trên thực tế vẫn có thể tồn tại các nhánh không được chạy qua khi hàm hoặc một phương thức được thực thi. Những nhánh đó có thể là vô nghĩa nhưng cũng có thể là nơi tiềm ẩn rất nhiều nguyên nhân gây ra lỗi. Vì vậy, chúng ta cần có phương pháp xác định có hay không tồn tại các nhánh chưa duyệt qua trong chương trình, nếu có thì thông báo cho người phát triển kiểm tra và xử lý.
Trong nội dung luận văn sẽ tìm hiểu các tiêu chuẩn bao phủ [6] mã nguồn của bộ test cơ bản nhưng rất mạnh mẽ như tiêu chuẩn bao phủ lệnh (statement coverage), bao phủ nhánh (branch coverage), bao phủ điều kiện (condition coverage) nhằm giúp xây dựng các ca kiểm thử tốt phát hiện nhánh chưa được phủ trong mã nguồn đang xét. Bên cạnh đó trong luận văn cũng đề 2 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com xuất xây dựng một công cụ tự động kiểm tra độ phủ của bộ dữ liệu kiểm thử thỏa mãn một tiêu chuẩn dựa trên công cụ kiểm chứng Java Pathfinder. Đầu vào của công cụ là một hàm hay một phương thức cần kiểm tra, xây dựng đồ thị luồng điều khiển, tiến hành xây dựng các ca kiểm thử. Sử dụng công cụ Java Pathfinder hỗ trợ ghi lại từng dòng lệnh được chạy trong quá trình kiểm thử với bộ các ca kiểm thử đã xây dựng.
Sau đó công cụ so sánh dữ liệu ghi được với các nhánh trong đồ thị luồng điều khiển, xác định được những nhánh nào trong hàm, trong phương thức chưa được phủ, hiển thị kết quả cảnh báo cho lập trình viên. Công cụ sẽ giúp quá trình kiểm tra độ phủ trong kiểm thử đơn vị thực hiện nhanh chóng, kết quả hiển thị trực quan hơn nhằm đánh giá các ca kiểm thử và hàm đang xét.3 Cấu trúc luận văn Phần còn lại của luận văn có cấu trúc như sau: Chƣơng 2: Trình bày kiến thức về kiểm thử phần mềm, chiến lược kiểm thử đơn vị với kỹ thuật cụ thể là kiểm thử luồng điều khiển trong kiểm thử hộp trắng. Chƣơng 3: Giới thiệu về công cụ kiểm chứng JavaPathfinder, các kiến trúc chung về JPF, thành phần mở rộng của JPF và cách kiểm tra độ phủ của bộ dữ liệu kiểm thử thông qua tính năng trong lớp CoverageAnalyzer. Chƣơng 4: Đề xuất phương pháp kiểm tra độ phủ của bộ dữ liệu kiểm thử dựa trên công cụ Java Pathfinder.
Nội dung của phương pháp là xây dựng công cụ đo độ phủ ở mức kiểm thử đơn vị sử dụng khả năng lưu vết chương trình của JPF. Chƣơng 5: Thực nghiệm và đánh giá kết quả đạt được. Trong chương này chúng tôi nêu rõ cách cài đặt công cụ JPF, vận dụng tính năng của JPF và cài đặt thêm mã nguồn để xây dưng công cụ kiểm tra độ phủ. Bên cạnh đó chúng tôi sử dụng công cụ đã xây dụng để kiểm tra độ phủ của bộ test thông qua các ví dụ từ đó rút ra nhận xét đánh giá về mã nguồn cũng như các ca kiểm thử đã viết.
3 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com CHƢƠNG 2- CƠ SỞ LÝ THUYẾT VỀ KIỂM THỬ 2.1 Khái niệm kiểm thử phần mềm Kiểm thử phần mềm là quá trình thực thi hệ thống hoặc chương trình để kiểm tra xem hệ thống có đúng với đặc tả, thiết kế hay không. Kiểm thử phần mềm đồng nghĩa với việc tìm ra những lỗi tiềm ẩn chưa được phát hiện, một cách sớm nhất và đảm bảo rằng những lỗi đó đã được sửa, chứ không làm công việc chuẩn đoán nguyên nhân gây ra lỗi hay sửa lỗi đã phát hiện được[4]. Mục đích của kiểm thử phần mềm là thiết kế một hoặc chuỗi các ca kiểm thử có khả năng phát hiện được lỗi cao. Để thu được kết quả tốt, hoạt động kiểm thử cần được chuẩn bị tốt về kế hoạch, thiết kế và dữ liệu cho mỗi ca kiểm thử.
Đây chính là đầu vào cho việc kiểm thử, còn đầu ra chính là tài liệu báo cáo kiểm thử, nêu ra được các thông tin về mục đích của kiểm thử, dữ liệu đầu vào, dữ liệu đầu ra mong đợi, dữ liệu đầu vào thực tế… 2. Quy trình kiểm thử phần mềm Quy trình kiểm thử phần mềm bao gồm các bước như lập kế hoạch kiểm thử, thiết kê các trường hợp kiểm thử, bố trí nhân lực kiểm thử, đo lường, đánh giá sản phẩm để xác nhận sản phẩm có thể được đưa ra sử dụng hay chưa. Trong đó: Giai đoạn lập kế hoạch kiểm thử [2,3] bao gồm các bước như xác định hoạt động cần thực hiện, phương pháp thực hiện, mục đích kiểm thử dựa vào đặc tả yêu cầu, đặc tả chức năng…, phạm vi kiểm thử, phương pháp kiểm thử, nguồn tài nguyên cần thiết, thời gian biểu cho hoạt động kiểm thử, tài liệu tham khảo. Giai đoạn thiết kế các ca kiểm thử là giai đoạn quan trọng nhất, bao gồm các bước xác định dữ liệu đầu vào và đầu ra cho hoạt động kiểm thử cùng các câu lệnh cần thực hiện.
Trong suốt quá trình thiết kế ca kiểm thử, yêu cầu hệ thống phải được nghiên cứu một cách thận trọng, các tính năng của hệ thống phải được xác định một cách rõ ràng và các hành vi của ca kiểm thử cũng cần được định nghĩa chi tiết. Bố trí nhân lực kiểm thử: việc kiểm thử cần được tiến hành một cách độc lập giữa các nhóm kiểm thử sau đó thu thập kết quả của từng nhóm, so sánh với nhau và đưa ra kết luận cuối cùng. Việc kiểm thử thường được tiến hành ở nhiều cấp độ khác nhau như kiểm thử đơn vị, kiểm thử tích hợp hay kiểm thử hệ thống…, xuyên suốt trong vòng đời phát triển của phần mềm.