Luận văn: Phương pháp sinh dữ liệu kiểm thử phần mềm dựa trên kiểm chứng mô hình

Luận văn thạc sĩ: Nghiên cứu phương pháp sinh dữ liệu kiểm thử phần mềm hiệu quả dựa trên kỹ thuật kiểm chứng mô hình. Tối ưu hóa quy trình kiểm thử.

Chuyên ngành

Công Nghệ Thông Tin

Người đăng

Ẩn danh

Thể loại

Luận Văn Thạc Sĩ

2011

54
2
0

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI CẢM ƠN

LỜI CAM ĐOAN

MỤC LỤC

MỞ ĐẦU

1. CHƢƠNG 1: CƠ SỞ LÝ LUẬN

1.1. Tổng quan kiểm định phần mềm

1.2. Các nhóm kiểm định phần mềm

2. CHƢƠNG 2: JAVA PATH FINDER VÀ THỰC THI TƢỢNG TRƢNG

2.1. Giới thiệu về JPF

2.1.1. JPF có thể kiểm tra những chƣơng trình gì?

2.1.2. Kiến trúc mức cao của JPF

2.1.3. Khả năng mở rộng của JPF

2.1.4. Một số mở rộng của JPF

2.2. Thực thi tƣợng trƣng để sinh dữ liệu kiểm thử

2.2.1. Thực thi tƣợng trƣng là gì?

2.2.2. Thực thi tƣợng trƣng với JPF

2.2.3. Hƣớng dẫn thực thi tƣợng trƣng với JPF

3. CHƢƠNG 3: MICROSOFT Z3

3.1. Tại sao lại là Z3?

3.2. Kiến trúc của Z3

3.3. Định dạng đầu vào

3.4. Định dạng SMT-LIB

3.4.1. Các chức năng chính của SMT-LIB

3.5. Các quan hệ, phƣơng thức, và hằng số

3.5.1. Tất cả các phƣơng thức là tuyệt đối ( total)

3.5.2. Uninterpreted function và hằng số

3.5.3. Phƣơng thức đệ quy

3.6. Sô học tuyến tính thực

3.7. Số hoc tuyến tính nguyên

3.8. Trộn giữa số nguyên và số thực

3.9. Số học phi tuyến tính

3.10. Kiểu dữ liệu

3.10.1. Kiểu bản ghi

3.10.2. Kiểu liệt kê ( enumeration)

3.10.3. Kiểu dữ liệu đệ qui

3.11. Một vài ứng dụng của Z3

4. CHƢƠNG 4: TÍCH HỢP Z3 VỚI JPF

4.1. Nghiên cứu đánh giá các giải pháp

4.2. Kiến trúc hệ thống

4.3. Chuyển đổi dữ liệu

4.4. Thiết kế và cài đặt

4.5. Kết quả và đánh giá

KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN CỦA ĐỀ TÀI

TÀI LIỆU THAM KHẢO

DANH MỤC CÁC HÌNH

Tóm tắt

I. Sinh Dữ Liệu Kiểm Thử Tổng Quan và Tầm Quan Trọng

Trong bối cảnh phát triển phần mềm ngày càng phức tạp, việc đảm bảo chất lượng sản phẩm là ưu tiên hàng đầu. Kiểm thử phần mềm đóng vai trò then chốt trong việc phát hiện và loại bỏ các lỗi tiềm ẩn. Tuy nhiên, kiểm thử thủ công tốn nhiều thời gian và công sức, đồng thời khó bao phủ hết mọi trường hợp có thể xảy ra. Do đó, tự động hóa kiểm thử trở thành xu hướng tất yếu, đặc biệt là sinh dữ liệu kiểm thử một cách tự động. Sinh dữ liệu kiểm thử là quá trình tạo ra các bộ dữ liệu đầu vào một cách tự động, phục vụ cho việc kiểm tra các chức năng, hiệu năng và bảo mật của phần mềm. Các bộ dữ liệu này được thiết kế để bao phủ các kịch bản sử dụng khác nhau, từ những trường hợp thông thường đến những tình huống biên hoặc đặc biệt. Theo tài liệu gốc, việc kiểm thử phần mềm có thể được phân loại thành ba nhóm chính: phân tích mã nguồn tĩnh, kiểm thử dữ liệu động và kỹ thuật hình thức dựa trên mô hình. Phương pháp sinh dữ liệu kiểm thử, đặc biệt là dựa trên kỹ thuật kiểm chứng mô hình, thuộc nhóm thứ ba và hứa hẹn mang lại hiệu quả cao trong việc đảm bảo chất lượng phần mềm. Các kỹ thuật tự động sinh dữ liệu kiểm thử giúp giảm thiểu công sức của các chuyên gia kiểm thử, đồng thời tăng cường độ bao phủ và độ tin cậy của quá trình kiểm thử. Ngoài ra, việc tự động hóa kiểm thử cho phép thực hiện kiểm thử thường xuyên hơn, từ đó phát hiện lỗi sớm hơn trong vòng đời phát triển phần mềm.

1.1. Tại sao cần Sinh Dữ Liệu Kiểm Thử Tự Động

Việc kiểm thử phần mềm thủ công tốn thời gian và công sức, khó bao phủ hết các trường hợp, đặc biệt là với các phần mềm lớn và phức tạp. Tự động sinh dữ liệu kiểm thử giúp tăng tốc quá trình kiểm thử, giảm chi phí và tăng độ bao phủ. Nó còn cho phép kiểm thử thường xuyên hơn, phát hiện sớm các lỗi. Điều này đặc biệt quan trọng trong các lĩnh vực yêu cầu độ tin cậy cao như y tế, ngân hàng, hàng không. Độ bao phủ kiểm thử là một tiêu chí quan trọng, và việc tự động hóa giúp đạt được độ bao phủ cao hơn so với kiểm thử thủ công.

1.2. Các Phương Pháp Sinh Dữ Liệu Kiểm Thử Phổ Biến

Có nhiều phương pháp sinh dữ liệu kiểm thử khác nhau, bao gồm kiểm thử hộp đen (black-box testing), kiểm thử hộp trắng (white-box testing), và kiểm thử dựa trên mô hình. Kiểm thử hộp đen tập trung vào chức năng của phần mềm mà không cần biết cấu trúc bên trong. Kiểm thử hộp trắng dựa trên cấu trúc mã nguồn để tạo ra các test case. Kiểm thử dựa trên mô hình sử dụng các mô hình trừu tượng để biểu diễn hành vi của phần mềm và tạo ra các test case từ mô hình đó. Kỹ thuật kiểm chứng mô hình là một phương pháp hiệu quả trong việc sinh dữ liệu kiểm thử tự động.

II. Kỹ Thuật Kiểm Chứng Mô Hình Nền Tảng Sinh Dữ Liệu Hiệu Quả

Kiểm chứng mô hình (Model Checking) là một kỹ thuật kiểm thử phần mềm sử dụng các mô hình trừu tượng để biểu diễn hành vi của hệ thống. Các mô hình này thường được biểu diễn dưới dạng các trạng thái và chuyển đổi giữa các trạng thái. Kỹ thuật này cho phép kiểm tra xem hệ thống có đáp ứng các yêu cầu đã được chỉ định hay không. Trong quá trình kiểm chứng mô hình, các công cụ sẽ duyệt qua tất cả các trạng thái và chuyển đổi có thể xảy ra để tìm ra các lỗi hoặc vi phạm. Ưu điểm của kiểm chứng mô hình là có thể phát hiện ra các lỗi tiềm ẩn mà các phương pháp kiểm thử khác có thể bỏ sót. Theo tài liệu gốc, kỹ thuật kiểm thử phần mềm dựa trên mô hình khác biệt so với hai nhóm phân tích mã nguồn tĩnh và kiểm thử dữ liệu động ở chỗ đối tượng được kiểm thử là các mô hình được trừu tượng hóa từ hệ thống. Kiểm chứng mô hình có thể được sử dụng để sinh dữ liệu kiểm thử bằng cách tạo ra các test case từ các trạng thái và chuyển đổi trong mô hình. Các test case này được thiết kế để bao phủ các kịch bản sử dụng khác nhau và đảm bảo rằng hệ thống hoạt động đúng như mong đợi. Phương pháp này đặc biệt hữu ích cho các hệ thống phức tạp với nhiều trạng thái và chuyển đổi.

2.1. Ưu Điểm của Kiểm Chứng Mô Hình trong Kiểm Thử

Kiểm chứng mô hình có thể phát hiện ra các lỗi tiềm ẩn mà các phương pháp khác có thể bỏ sót. Nó cung cấp một cách tiếp cận có hệ thống để kiểm tra tất cả các trạng thái và chuyển đổi có thể xảy ra. Điều này đặc biệt hữu ích cho các hệ thống phức tạp. Ngoài ra, kiểm chứng mô hình có thể được tự động hóa, giúp giảm thiểu công sức và thời gian cần thiết cho việc kiểm thử. Nó cũng cho phép kiểm tra các yêu cầu một cách chính xác và có thể chứng minh rằng hệ thống đáp ứng các yêu cầu đó.

2.2. Các Công Cụ Kiểm Chứng Mô Hình Phổ Biến

Có nhiều công cụ kiểm chứng mô hình khác nhau, bao gồm SPIN, UPPAAL, NuSMV và Java PathFinder (JPF). SPIN là một công cụ mạnh mẽ để kiểm tra các hệ thống phân tán. UPPAAL là một công cụ để kiểm tra các hệ thống thời gian thực. NuSMV là một công cụ để kiểm tra các hệ thống trạng thái hữu hạn. Java PathFinder (JPF) là một công cụ kiểm tra mô hình phần mềm trạng thái tường minh cho Java.

2.3. Ứng dụng kiểm chứng mô hình trong tự động hóa

Với cách tiếp cận phân tích chương trình dựa trên mô hình sau khi trừu tượng hóa mã nguồn của chương trình được kiểm thử, việc phân tích cấu trúc logic của chương trình và tập dữ liệu ứng với mỗi điểm điều khiển trong chương trình sẽ dễ dàng hơn. Qua đó, quá trình sinh ra tập các testcase sẽ nhanh chóng và chính xác, đảm bảo các tiêu chí control flowdata coverage tốt hơn nhiều so với cách tiếp cận ở mức mã nguồn truyền thống. Hơn nữa, nếu quá trình này được thực hiện một cách tự động sẽ giảm thiểu nhiều công sức cho các chuyên gia kiểm thử chương trình.

III. Java PathFinder JPF Ứng Dụng Kiểm Chứng Mô Hình cho Java

Java PathFinder (JPF) là một công cụ kiểm chứng mô hình mã nguồn mở được phát triển bằng ngôn ngữ Java. JPF được thiết kế để kiểm tra các chương trình Java bằng cách duyệt qua tất cả các trạng thái và chuyển đổi có thể xảy ra. Công cụ này có thể phát hiện ra các lỗi như deadlock, race condition, và exception chưa được xử lý. Theo tài liệu gốc, JPF là một bộ kiểm tra mô hình phần mềm trạng thái tường minh cho Java. Về cơ bản JPF là một máy ảo thực thi chương trình Java không chỉ một lần, mà thực thi trong tất cả các nhánh, các đường đi có thể. JPF sẽ kiểm tra các vi phạm thuộc tính như khóa chết hoặc các ngoại lệ không thể bắt được xuyên suốt các đường thực thi tiềm năng. JPF cũng cung cấp một cơ chế mở rộng để cho phép thêm vào các chức năng mới mà không phải thay đổi trực tiếp cài đặt của Search hoặc VM. JPF có thể được sử dụng để sinh dữ liệu kiểm thử bằng cách tạo ra các test case từ các trạng thái và chuyển đổi trong mô hình. Các test case này được thiết kế để bao phủ các kịch bản sử dụng khác nhau và đảm bảo rằng chương trình Java hoạt động đúng như mong đợi. JPF có khả năng mở rộng cao, cho phép tích hợp các công cụ và kỹ thuật kiểm thử phần mềm khác nhau.

3.1. Kiến Trúc và Cách Thức Hoạt Động của JPF

JPF bao gồm hai thành phần chính: JVM (Java Virtual Machine) và Search. JVM là một bộ sinh trạng thái cụ thể cho Java. Search chịu trách nhiệm lựa chọn trạng thái mà JVM nên xử lý, hoặc hướng JVM sinh trạng thái tiếp theo, hoặc yêu cầu JVM quay trở lại một trạng thái trước đó. Search cũng cấu hình và đánh giá các đối tượng thuộc tính. Các cài đặt chính của Search bao gồm tìm kiếm theo độ sâu (DFSearch) và HeuristicSearch.

3.2. Các Mở Rộng Tiêu Biểu của Java PathFinder

Hiện nay đã có một số mở rộng được phát triển cho JPF UI - User Interface Model Checking. symbc - Symbolic Test Data Generation. cv - Compositional Verification Framework. numeric - Numeric Property Verification. statechart - UML State Chart Model Checking. symbc - Symbolic Test Data Generation sử dụng BytecodeFactory để ghi đè lõi JPF bytecodes nhằm sinh ra các ca kiểm thử riêng biệt. Nói tóm lại nó hoạt động bằng cách sử dụng các thuộc tính/ trường của JPF để thu thập các điều kiện đường đi PC, sau đó được đưa các PC vào một hệ thống tìm lời giải theo định dạng của hệ thống đó để đưa ra dữ liệu kiểm thử.

3.3. Giới hạn và thách thức của Java PathFinder

Việc sinh dữ liệu kiểm thử bằng JPF vẫn còn hạn chế, đặc biệt là trong các bài toán phức tạp liên quan đến số học phi tuyến hoặc các ràng buộc phức tạp. JPF hiện đang sử dụng một số công cụ tìm lời giải của Java : Choco, IAsolver. Những công cụ này được sử dụng như các thư viện. Việc sử dụng chúng làm cho JPF có rất nhiều hạn chế như: Không giải được đại số phi tuyến, các uninterpreted function, phép chia cho 0. Vì vậy việc tích hợp các công cụ giải toán mạnh mẽ khác sẽ mở rộng khả năng của JPF trong việc sinh dữ liệu kiểm thử.

IV. Microsoft Z3 Công Cụ Giải Toán Mạnh Mẽ Hỗ Trợ Kiểm Thử

Z3 là một công cụ giải toán (SMT Solver) được phát triển bởi Microsoft. Z3 có khả năng giải quyết các bài toán phức tạp liên quan đến logic, số học và các ràng buộc khác. Công cụ này được sử dụng rộng rãi trong các lĩnh vực như kiểm chứng phần mềm, trí tuệ nhân tạo và lập kế hoạch. Theo tài liệu gốc, Z3 là công cụ tìm lời giải cho lý thuyết tính thỏa được (SMT- Solver). Z3 có chức năng như là một bộ kiểm tra tính thỏa mãn cho rất nhiều kiểu logic bậc nhất với lý thuyết được xây đựng trong đó. Những lý thuyết được hỗ trợ đó là: Uninterpreter function và các ký hiệu vị từ, Số thực và số nguyên( hỗ trợ giới hạn cho số học không tuyên tính), Kiểu bit- Vector, Kiểu mảng, Kiểu bản nghi, kiểu liệt và kiểu dữ liệu đệ quy. Z3 kiểm tra một tập các công thức có thỏa mãn trong lý thuyết của nó hay không. Nếu tập công thức đó là thỏa mãn, khi đó tập công thức đó là tồn tại. Z3 hỗ trợ một số định dạng đầu vào như sau: .dimacs – Định dạng DIMACS được sử dụng bởi các bộ giải quyết SAT thong thường, .simplify – Định dạng đơn giản(simplify format), .smt – Định dạng SMT-Lib, .z3 – Định dạng đầu vào do Z3 đưa ra.

4.1. Kiến Trúc và Các Thành Phần Chính của Z3

Z3 bao gồm các thành phần chính sau: Simplifier (Bộ giản hóa), Compiler (Bộ biên dịch), Congruence Closure core (Lõi kết thúc tương đẳng), Theory Combination (Phối hợp lý thuyết) và SAT Solver. Bộ giản hóa sẽ đơn giản hóa các biểu thức đầu vào. Bộ biên dịch sẽ chuyển đổi các biểu thức thành một cấu trúc dữ liệu phù hợp. Lõi kết thúc tương đẳng sẽ xử lý các đẳng thức và các biểu thức nguyên tử. Phối hợp lý thuyết sẽ kết hợp các lý thuyết khác nhau để giải quyết các bài toán phức tạp. SAT Solver sẽ tìm ra các giải pháp thỏa mãn cho các biểu thức.

4.2. Các Kiểu Dữ Liệu và Lý Thuyết Được Hỗ Trợ bởi Z3

Z3 hỗ trợ nhiều kiểu dữ liệu khác nhau, bao gồm số nguyên, số thực, boolean, mảng và kiểu dữ liệu đệ quy. Z3 cũng hỗ trợ nhiều lý thuyết khác nhau, bao gồm số học tuyến tính, số học phi tuyến, lý thuyết mảng và lý thuyết bit-vector. Sự đa dạng về kiểu dữ liệu và lý thuyết cho phép Z3 giải quyết các bài toán phức tạp trong nhiều lĩnh vực khác nhau.

4.3. Ưu điểm vượt trội và tính năng nổi bật của Z3

Z3 là một trong những công cụ mạnh mẽ nhất hiện nay, bằng chứng là hàng năm có một cuộc thi SMT-COMP. Z3 đã dành được rất nhiều giải nhất trong cuộc thi này. Việc sử dụng Z3 sẽ giúp mở rộng khả năng của JPF trong việc sinh dữ liệu kiểm thử. Mặc dù Z3 được phát triển bằng ngôn ngữ C ++, tuy nhiên Z3 hỗ trợ rất nhiều định dạng cũng như nhiều API, vì vậy việc tích hợp cũng sẽ trở lên dễ dàng hơn.

V. Tích Hợp Z3 và JPF Giải Pháp Sinh Dữ Liệu Kiểm Thử Nâng Cao

Việc tích hợp Z3JPF hứa hẹn mang lại một giải pháp mạnh mẽ cho việc sinh dữ liệu kiểm thử tự động cho các chương trình Java. Bằng cách sử dụng khả năng giải toán mạnh mẽ của Z3, JPF có thể giải quyết các bài toán phức tạp hơn và tạo ra các test case bao phủ các kịch bản sử dụng khác nhau. Theo tài liệu gốc, ý tưởng của việc thiết kế hệ thống là sẽ xây dựng một wrapper, wrapper này là giao diện để liên kết giữa JPF và Z3. Wrapper sẽ tương tác với z3 tương tự như Choco hay Iasolver. Các ràng buộc từ JPF, bằng cách sử dụng wrapper sẽ chuyển sang định dạng SMT- LIB. Sau đó sẽ thực hiện việc gọi Z3 thông qua dòng lệnh, xử lý dữ liệu trả về để sao cho lấy được kết qua đúng với định dạng của JPF. Điều này cho phép kiểm thử phần mềm một cách hiệu quả hơn và đảm bảo chất lượng sản phẩm.

5.1. Các Bước Triển Khai Tích Hợp Z3 và JPF

Việc tích hợp Z3 và JPF bao gồm các bước sau: Xây dựng một wrapper để giao tiếp giữa JPF và Z3. Chuyển đổi các ràng buộc từ JPF sang định dạng SMT-LIB của Z3. Gọi Z3 để giải quyết các ràng buộc và tạo ra các test case. Chuyển đổi các test case từ Z3 sang định dạng mà JPF có thể sử dụng. Sử dụng JPF để thực thi các test case và kiểm tra chương trình Java.

5.2. Định Dạng SMT LIB Cầu Nối Trao Đổi Dữ Liệu Z3 và JPF

Việc giao tiếp giữa JPF và Z3 có thể thực hiện thông qua socket hoặc thực thi bằng dòng lệnh (command line). Định dạng SMT-LIB được sử dụng để trao đổi dữ liệu giữa hai công cụ. Một SMT-LIB sẽ có dạng như sau: (benchmark Ten :logic kieu cua logic vi du so hoc tuyên tinh la: QF_LIA :extrafuns: Khai bao bien :formula Dinh nghia bieu thuc o day ) Trong đó formula chính là biểu thức cần phải chuyển ràng buộc của JPF sang.

5.3. Thách thức khi tích hợp và hướng giải quyết

Một trong những thách thức chính trong việc tích hợp JPF và Z3 là chuyển đổi các ràng buộc từ định dạng của JPF sang định dạng SMT-LIB của Z3 và ngược lại. Việc chuyển đổi này đòi hỏi phải hiểu rõ cấu trúc dữ liệu của cả hai công cụ. Ngoài ra, việc tích hợp cũng đòi hỏi phải xử lý các lỗi và ngoại lệ có thể xảy ra trong quá trình giao tiếp giữa hai công cụ. Ta thiết kế một lớp ProblemZ3 ( tương tự như cách JPF tích hợp với các công cụ tìm lời giải: Choco, IASolver, CVC3) có nhiệm vụ chuyển ràng buộc sang dạng biểu thức ở trên.

VI. Kết Luận và Hướng Phát Triển Tương Lai của Đề Tài

Đề tài đã nghiên cứu và triển khai thành công việc tích hợp Z3 và JPF trong việc sinh dữ liệu kiểm thử cho các chương trình Java. Kết quả ban đầu cho thấy sự tích hợp này hứa hẹn mang lại hiệu quả cao trong việc giải quyết các bài toán phức tạp và tạo ra các test case bao phủ các kịch bản sử dụng khác nhau. Tuy nhiên, vẫn còn nhiều hướng phát triển tiềm năng cho đề tài, bao gồm: Nghiên cứu và triển khai các thuật toán tối ưu hóa để tăng tốc quá trình giải toán của Z3. Phát triển các công cụ hỗ trợ để đơn giản hóa việc chuyển đổi các ràng buộc giữa JPF và Z3. Nghiên cứu và tích hợp các kỹ thuật kiểm thử phần mềm khác nhau để tạo ra một hệ thống kiểm thử tự động toàn diện.

6.1. Các Hướng Nghiên Cứu và Phát Triển Tiềm Năng

Nghiên cứu và phát triển các thuật toán tối ưu hóa để tăng tốc quá trình giải toán của Z3. Phát triển các công cụ hỗ trợ để đơn giản hóa việc chuyển đổi các ràng buộc giữa JPF và Z3. Nghiên cứu và tích hợp các kỹ thuật kiểm thử phần mềm khác nhau để tạo ra một hệ thống kiểm thử tự động toàn diện. Mở rộng khả năng của JPF để hỗ trợ nhiều kiểu dữ liệu và lý thuyết hơn. Phát triển các công cụ trực quan hóa để giúp các nhà phát triển hiểu rõ hơn về quá trình kiểm thử.

6.2. Ứng Dụng Thực Tế và Triển Vọng Phát Triển

Giải pháp sinh dữ liệu kiểm thử tự động dựa trên Z3 và JPF có thể được ứng dụng trong nhiều lĩnh vực khác nhau, bao gồm phát triển phần mềm, kiểm thử phần mềm, và bảo trì phần mềm. Giải pháp này có thể giúp các nhà phát triển tạo ra các sản phẩm phần mềm chất lượng cao hơn và giảm chi phí phát triển và bảo trì. Triển vọng phát triển của đề tài là rất lớn, đặc biệt là trong bối cảnh tự động hóa ngày càng được áp dụng rộng rãi trong ngành công nghiệp phần mềm.

24/09/2025

Trích đoạn nội dung tài liệu

Mở đầu: Giới thiệu về đề tài, tính cấp thiết cũng nhƣ mục tiêu của đề tài Chƣơng 1: Cơ sở lý luận Chƣơng 2: JPF và Thực thi tƣợng trƣng Nội dung: Giới thiêu JPF là gì? Kiến trúc của JPF, cách mở rộng, phát triển trên JPF. Ngoài ra còn một phần rất quan trọng đó là giới thiệu về thực thi tƣợng trƣng để sinh dữ liệu kiểm thử cho chƣơng trình trong JPF. Mở rộng này sẽ cho phép sinh tự động dữ liệu kiểm thử chƣơng trình Java. Chƣơng 3: Microsoft Z3 Nội dung: Giới thiệu về lý thuyết tính thỏa đƣợc SMT, Z3, các lý thuyết đƣợc hỗ trợ trên Z3, các API của Z3 để tích hợp với JPF, các ứng dụng của Z3.

Chƣơng 4: Tích hợp JPF với Z3 Nội dung: Nghiên cứu, đánh giá các giải pháp. Sau khi đã có giải pháp tiến hành thiết kế kiến trúc hệ thống, sau đó chi tiết hóa sang mức gói, mức lớp cuối cùng là cài đặt và đánh giá kết quả. Kết luận và hƣớng phát triển của luận văn Trình bày kết quả sau khi nghiên cứu, triển khai và hƣớng phát triển tiếp theo. TIEU LUAN MOI download : skknchat@gmail.com 10 CHƢƠNG 1- CƠ SỞ LÝ LUẬN 1.1 Tổng quan kiểm định phần mềm Nhƣ chúng ta đã biết, việc kiểm thử phần mềm là một khâu không thể thiếu trong các bƣớc phát triển phần mềm, đặc biệt các phần mềm lớn, nhiều module do nhiều ngƣời phát triển, dễ sinh ra các lỗi tiềm ẩn mà nhà phát triển không thể lƣờng trƣớc.

Trong lĩnh vực kiểm định chất lƣợng phần mềm hiện nay trên thế giới, hiện có nhiều kỹ thuật nhƣng tựu chung có thể phân theo ba nhóm chính: Phân tích mã nguồn tĩnh (static code analysis), kiểm thử dữ liệu động (dynamic data testing) và kỹ thuật hình thức dựa trên mô hình (model-based verification). Hai nhóm đầu tập trung vào việc nâng cao chất lƣợng phần mềm tại mức mã nguồn, trong khi nhóm cuối cùng xử lý phần mềm tại mức trừu tƣợng cao hơn – mô hình.2 Các nhóm kiểm định phần mềm Phân tích mã nguồn tĩnh là kỹ thuật phát hiện lỗi chƣơng trình mà không yêu cầu chạy chƣơng trình đó. Không giống nhƣ kỹ thuật kiểm thử dữ liệu động đòi hỏi phải chạy chƣơng trình với dữ liệu đầu vào thật, kỹ thuật phân tích mã nguồn tĩnh chỉ xem xét mã nguồn của chƣơng trình. Kỹ thuật kiểm thử phần mềm dựa trên mô hình: khác với hai nhóm ở trên ở điểm đối tƣợng đƣợc kiểm thử là các mô hình đƣợc trừu tƣợng hóa từ hệ thống đƣợc xem xét.

Quá trình trừu tƣợng hóa là việc lƣợc bỏ những chi tiết của hệ thống trong khi chỉ giữ lại những thông tin/khía cạnh quan trọng cần đƣợc lƣu tâm. Kỹ thuật trừu tƣợng hóa đơn giản hóa hệ thống đƣợc xem xét và do đó giảm không gian tìm kiếm và thời gian phân tích chƣơng trình đi nhiều lần so với lúc thực hiện công việc phân tích đó trên mã nguồn. Khi xây dựng xong phần mềm, chúng ta phải sử dụng các testcase (trƣờng hợp kiểm thử) cho việc kiểm thử. Chất lƣợng của việc kiểm thử phụ thuộc rất lớn vào tập hợp các testcase mà chúng ta sử dụng.

Hai tiêu chí chính của việc đánh giá chất lƣợng kiểm thử đó là hiệu quả cho chất lƣợng phần mềm đƣợc kiểm thử là độ phủ dòng chảy (control flow coverage) và độ phủ dữ liệu (data coverage). Tiêu chí thứ nhất tập trung vào việc kiểm thử tất cả các điểm điều khiển trên chƣơng trình (ví dụ: các nhánh rẽ khả đạt trong cấu trúc chƣơng trình – reachable control points). Trong khi tiêu chí thứ hai tập trung vào tập dữ liệu kiểm thử ứng với mỗi điểm điều khiển trong cấu trúc chƣơng trình. Bằng kỹ thuật phân tích chƣơng trình dựa trên mô hình sau khi trừu tƣợng hóa mã nguồn của chƣơng trình đƣợc kiểm thử, việc phân tích cấu trúc logic của chƣơng trình và tập dữ liệu ứng với mỗi điểm điều khiển trong chƣơng trình sẽ dễ dàng hơn.

Qua đó, quá TIEU LUAN MOI download : skknchat@gmail.com 11 trình sinh ra tập các testcase sẽ nhanh chóng và chính xác, đảm bảo các tiêu chí control flow và data coverage tốt hơn nhiều so với cách tiếp cận ở mức mã nguồn truyền thống. Hơn nữa, nếu quá trình này đƣợc thực hiện một cách tự động sẽ giảm thiểu nhiều công sức cho các chuyên gia kiểm thử chƣơng trình. Với cách tiếp cận nhƣ vậy, phần mềm có thể đƣợc kiểm thử một cách tự động bằng máy, đem lại kết quả chuẩn hơn, xét đƣợc nhiều trƣờng hợp hơn, đặt biệt là các lỗi logic, tiết kiệm chi phí sản xuất. Đánh giá tập dữ liệu kiểm thử: Ngoại trừ những chƣơng trình đơn giản, sẽ là không thực tế nếu kiểm chứng phần mềm trên tập tất cả dữ liệu đầu vào có thể.

Ngay cả khi chỉ tính tổ hợp của các dữ liệu đầu vào hoặc tổ hợp của các hàm, số lƣợng đầu vào và số lƣợng các trạng thái cũng là quá lớn. Khi hệ thống có bộ nhớ lớn, các dữ liệu đầu vào, đầu ra sẽ đƣợc log lại để theo dõi trạng thái. Trong khi không có một công cụ để tạo ra một thiết kế phần mềm chuẩn, hoàn chỉnh và chắc chắn thì việc kiểm thử là một khâu không thể thiếu để có thể đánh giá đƣợc chất lƣợng phần mềm. Vì thế ngƣời ta phải tìm cách chọn đƣợc một tập dữ liệu nhỏ mà có thể kiểm thử mang lại đƣợc độ tin cậy cao với mỗi hệ thống.

Độ phủ hay mức độ đầy đủ bằng trực quan đánh giá đƣợc phạm vi hay mức độ kiểm thử. Nếu kiểm thử không đầy đủ đƣợc hết mọi khía cạnh của phần mềm đồng nghĩa với việc chúng ta bỏ sót nhiều lỗi. Các tấn suất của các trƣờng hợp cũng không giống nhau. Khái niệm ca kiểm thử đơn giản là kiểm chứng các trạng thái đƣa ra thể hiện cho hoạt động của hệ thống.

Chúng ta có thể tạo ra ca kiểm thử đề đạt đƣợc trạng thái có thể bằng cách đƣa vào các biến đặc biệt, trạng thái để điều khiển hệ thống. TIEU LUAN MOI download : skknchat@gmail.com 12 CHƢƠNG 2- JAVA PATH FINDER VÀ THỰC THI TƯỢNG TRƯNG Trong chƣơng này sẽ bao gồm hai phần chính. Phần 1 giới thiệu về JPF, một dự án mã nguồn mở đƣợc viết bằng ngôn ngữ java để kiểm chứng mô hình. Phần 2 giới thiệu một mở rộng của JPF đó là thực thi tƣợng trƣng trong việc sinh tự động dữ liệu để kiểm thử chƣơng trình Java.1 Giới thiệu về JPF JPF là một bộ kiểm tra mô hình phần mềm trạng thái tƣờng minh cho Java [5].

Hiểu một cách cơ bản JPF là một máy ảo thực thi chƣơng trình Java không chỉ một lần (giống nhƣ các máy ảo thông thƣờng), mà thực thi trong tất cả các nhánh, các đƣờng đi có thể. JPF sẽ kiểm tra các vi phạm thuộc tính nhƣ khóa chết hoặc các ngoại lệ không thể bắt đƣợc xuyên xuốt các đƣờng thực thi tiềm năng. Hình 2-1 mô tả mô hình hoạt động của JPF.1: Mô hình hoạt động của JPF Về lý thuyết điều này là rất khả thi, tuy nhiên với việc tăng kích cỡ của ứng dụng, phần mềm kiểm chứng mô hình phải đối mặt với nhiều thách thức. JPF cũng không là ngoại lệ.

Câu trả lời của chúng ta đó là tăng sự linh hoạt của JPF để thích nghi với một ứng dụng cụ thể. Chúng ta có thể coi JPF nhƣ là một Framework và từ đó phát triển mở rộng để có thể giải quyết đƣợc bài toán cụ thể mà chúng ta muốn. TIEU LUAN MOI download : skknchat@gmail.1 JPF có thể kiểm tra những chƣơng trình gì? JPF có thể kiểm tra tất cả các chƣơng trình Java. JPF có thể tìm ra các khóa chết hoặc ngoại lệ.

Ngoài ra chúng ta có thể tự phát triển mở rộng để kiểm tra các thuộc tính khác. Để hiểu rõ hơn về JPF chúng ta có thể xét ví dụ sau: Tạo một lớp là Rand.java nhƣ bên dƣới, sau đó chúng ta sẽ dùng JPF để kiểm tra xem có lỗi không.Random; public class Rand { public static void main (String[] args) { Random random = new Random(42); // (1) int a = random.println("a=" + a); int b = random.2: Sơ đồ trạng thái trong quá trình kiểm thử TIEU LUAN MOI download : skknchat@gmail.com 14 Hoạt động của lớp trên đó là khởi tạo 2 biến a và b một cách ngẫu nhiên trong các khoang tƣơng ứng la [0,2] và [0,3]. Sau đó có một biến c có giá trị đƣợc xác định bằng công thức c = a/(b+a-2). Nếu ta chạy chƣơng trình java này thông thƣờng thì có thể thấy kết quả là: a = 1, b =0, và c = -1.

Nhƣ vậy chƣơng trình là không có lỗi. Tuy nhiên nếu ta sử dụng JPF để kiểm tra chƣơng trình trên thì sẽ thấy nhƣ hình vẽ bên dƣới: Nhìn hình vẽ trên ta có thể thấy nếu chạy chƣơng trình java bình thƣờng thì ta chỉ có thể nhân đƣợc 1 trong 6 kết quả trên, do vậy khả năng lớn là không phát hiện đƣợc ra lỗi ( Đƣờng bôi đỏ là ví dụ). Tuy nhiên JPF sẽ tìm ra tất cả các đƣờng đi của chƣơng trình sau đó kiểm tra chúng. Ta sẽ thấy có 2 trƣờng hợp lỗi gây ra bởi phép chia cho 0.2 Kiến trúc mức cao của JPF Hình 2.3: Kiến trúc mức cao TIEU LUAN MOI download : skknchat@gmail.com 15 Hình 2-3 biểu diễn sơ đồ kiến trúc mức cao của JPF.

JPF đƣợc thiết kế thành 2 thành phần chính đó là: JVM, và Search. JVM là một bộ sinh trạng thái cụ thể Java. Bằng việc thực hiện các chỉ thị Java bytecode. Search chịu trách nhiệm lựa chọn trạng thái mà JVM nên xử lý, hoặc hƣớng JVM sinh trạng thái tiếp theo, hoặc yêu cầu JVM quay trở lại một trạng thái trƣớc đó.

Nói một các khác Search có thể coi nhƣ các driver cho các đối tƣợng JVM. Search cũng cấu hình và đánh giá các đối tƣợng thuộc tính. Các cài đặt chính của Search bao gồm tìm kiếm theo độ sâu (DFSearch) và HeuristicSearch. Một cài đặt Search sẽ cung cấp một phƣơng thức Search đơn giản bao gồm một vòng lặp chính sẽ duyệt qua tất cả các không gian trạng thái liên quan cho đến khi nó duyệt xong tất cả hoặc tìm ra một vi phạm thuộc tính (property violation).3 Khả năng mở rộng của JPF Hình 2.4: Mẫu Listener TIEU LUAN MOI download : skknchat@gmail.com 16 JPF có thể đƣợc coi nhƣ là một Framework mà tại đó bất kỳ nhà phát triển nào đều có thể mở rộng để phục vụ cho một mục đích cụ thể.

JPF cung cấp một cơ chế mở rộng để cho phép thêm vào các chức năng mới mà không phải thay đổi trực tiếp cài đặt của Search hoặc VM. Yêu cầu về khả năng mở rộng có thể đạt đƣợc bằng cách sử dụng mẫu Listerner trên hình 2-4.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ