Tải bản đầy đủ (.pdf) (11 trang)

Phương pháp sinh dữ liệu kiểm thử tự động cho các ứng dụng java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.3 MB, 11 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

PHAN THỊ THU HÀ

PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ TỰ ĐỘNG
CHO CÁC ỨNG DỤNG JAVA

LUẬN VĂN THẠC SĨ
Ngành: Công nghệ thông tin

Hà Nội -2015


ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

PHAN THỊ THU HÀ

PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ TỰ ĐỘNG
CHO CÁC ỨNG DỤNG JAVA

Ngành: Công nghệ thông tin
Chuyên ngành: Kỹthuật phần mềm
Mã Số:60.48.01.03

LUẬN VĂN THẠC SĨ
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS. PHẠM NGỌC HÙNG

Hà Nội -2015


2


MỤC LỤC
MỤC LỤC ............................................................................................................................. i
LỜI CẢM ƠN ..................................................................................................................... iii
TÓM TẮT............................................................................................................................ iv
ABSTRACT ......................................................................................................................... v
LỜI CAM ĐOAN ................................................................................................................ vi
DANH MỤC THUẬT NGỮ VIẾT TẮT ...........................................................................vii
DANH MỤC HÌNH VẼ ................................................................................................... viii
DANH MỤC BẢNG ............................................................................................................ x
CHƯƠNG 1: GIỚI THIỆU .................................................................................................. 1
CHƯƠNG 2: CÁC KỸ THUẬT KIỂM THỬ DÒNG ĐIỀU KHIỂN ................................. 4
2.1. Tổng quan về kiểm thử hộp trắng ............................................................................. 4
2.2. Kỹ thuật kiểm thử dòng điều khiển ......................................................................... 10
2.2.1. Kiểm thử hộp trắng dòng điều khiển theo hướng động ................................... 10
2.2.2. Kiểm thử hộp trắng dòng điều khiển theo hướng tĩnh ..................................... 12
2.3. Quy trình kiểm thử hộp trắng dòng điều khiển theo hướng tĩnh .............................. 7
2.3.1. Đồ thị dòng điều khiển ...................................................................................... 7
2.3.2. Các tiêu chí phủ kiểm thử .................................................................................. 9
2.3.3. Đường kiểm thử ............................................................................................... 10
2.4. So sánh kĩ thuật kiểm thử hộp trắng dòng điều khiển theo hướng tĩnh và động .... 10

2.5. Tầm quan trọng của tự động hóa quy trình kiểm thử hộp trắng dòng điều khiểnError! Book
CHƯƠNG 3: PHƯƠNG PHÁP KIỂM THỬ DÒNG ĐIỀU KHIỂN HƯỚNG TĨNH
CHO CÁC HÀM JAVA ..................................................................................................... 15
3.1. Ý tưởng.................................................................................................................... 15
3.2. Xây dựng đồ thị dòng điều khiển từ mã nguồn....................................................... 16
3.3. Xây dựng tập đường kiểm thử ................................................................................ 20

3.3.1. Xây dựng tập đường đi độc lập........................................................................ 20
3.3.2. Xây dựng đường kiểm thử vòng lặp ................................................................ 22
i


3.4. Xây dựng hệ ràng buộc ........................................................................................... 25
3.5. Sinh tập dữ liệu kiểm thử dựa trên giải nghiệm hệ ràng buộc ................................ 27
3.5.1. Giải hệ sử dụng kỹ thuật sinh ngẫu nhiên........................................................ 27
3.5.2. Giải hệ sử dụng SMT-Solver ........................................................................... 27
CHƯƠNG 4: GIỚI THIỆU CÔNG CỤ ............................................................................. 32
4.1. Kiến trúc công cụ .................................................................................................... 32
4.2. Nền tảng chương trình............................................................................................. 33
4.2.1. Thư viện JDT ................................................................................................... 33
4.2.2. Bộ giải hệ Z3 Prover ........................................................................................ 34
4.3. Cài đặt công cụ ........................................................................................................ 36
4.3.1. Tổng quan ........................................................................................................ 36
4.2.2. Đầu vào công cụ JavaUnitCFT ........................................................................ 36
4.2.3. Đầu ra công cụ ................................................................................................. 37
CHƯƠNG 5: THỰC NGHIỆM.......................................................................................... 42
5.1. Sinh bộ dữ liệu kiểm thử cho hàm đầu vào chứa biến số nguyên ........................... 42
5.1.1. Input ................................................................................................................. 42
5.1.2. Output: ............................................................................................................. 43
5.2. Sinh bộ dữ liệu kiểm thử cho hàm đầu vào chứa biến số thực ............................... 44
5.2.1. Input ................................................................................................................. 44
5.2.2. Output .............................................................................................................. 44
5.3. Sinh bộ dữ liệu kiểm thử cho hàm đầu vào chứa vòng lặp ..................................... 47
5.3.1. Input ................................................................................................................. 47
5.3.2. Output .............................................................................................................. 47
CHƯƠNG 6: KẾT LUẬN .................................................................................................. 49
TÀI LIỆU THAM KHẢO .................................................................................................. 50


ii


LỜI CẢM ƠN
Trước tiên tôi xin gửi lời cảm ơn chân thành và sâu sắc đến thầy giáo, TS. Phạm
Ngọc Hùng - người đã trực tiếp hướng dẫn, chỉ bảo, động viên, luôn tạo cho tôi những
điều kiện tốt nhấtvà truyền cho tôi cảm hứng nghiên cứu khoa học từ khi tôi bắt đầu
lựa chọn đề tài, trong suốt quá trình nghiên cứu, và cho đến bây giờ - khi tôiđã hoàn
thành luận văn này.
Tôi xin chân thành cảm ơn các thầy, cô giáo khoa Công Nghệ Thông Tin,
Trường Đại học Công nghệ, Đại học Quốc Gia Hà Nội - những người đầy tâm huyết,
đã tận tình đào tạo,cung cấp cho tôi những kiến thức chuyên môn vô cùng quý
giá.Những kiến thức ấy không chỉ tạo cho tôi một nền tảng tốt trong quá trình học tập,
nghiên cứu tại trường, mà sẽ còn là những bài học bổ ích, những kỹ năng và kinh
nghiệm đáng quý cho tôi trong suốt quá trình làm việc và nghiên cứu chuyên môn sau
này.
Cuối cùng, tôi xin chân thành cảm ơn những người thân trong gia đình và bạn bè,
đồng nghiệp đã luôn giúp đỡ, động viên tôi đặc biệt là những khi tôi gặp phải khó khăn
trong việc học tập và nghiên cứu, đã tiếp thêm động lực để tôi vững tâm hoàn thành
luận văn này.

iii


TÓM TẮT
Kiểm thử đơn vị là bước đầu tiên trong quy trình kiểm thử phần mềm. Hiện nay,
trong các công ty phần mềm, kiểm thử đơn vị thường được thực hiện bởi các lập trình
viên sau khi hoàn thành việc phát triễn mã nguồn sản phẩm, và trước khi bàn giao cho
bộ phận kiểm thử để tiến hành kiểm thử tích hợp. Do hạn chế về mặt thời gian, chi phí

và nguồn nhân lực, các lập trình viên thường chỉ sử dụng kỹ thuật kiểm thử hộp đen
mà không áp dụng các kỹ thuật kiểm thử hộp trắng khi tiến hành kiểm thử đơn vị. Kết
quả là các lỗi tiềm tàng trong mã nguồn sản phẩm hầu như không được phát hiện trước
khi việc kiểm thử tích hợp được thực hiện.
Luận văn này tập trung nghiên cứu phương pháp sinh dữ liệu kiểm thử tự động
cho các ứng dụng Java dựa trên kỹ thuật kiểm thử hộp trắng dòng điều khiển hướng
tĩnh, đồng thời cài đặt một công cụ(JavaUnitCFT)hỗ trợ cho phương pháp này.
Phương pháp được mô tả thành một quy trình với các bước chính như sau: Bước đầu
tiên, từ mã nguồn được cung cấp, ta sẽ phân tích để sinh đồ thị dòng điều khiển thỏa
mãn tiêu chí phủ kiểm thử. Sau đó, đồ thị dòng điều khiển được phân tích để xây dựng
tập đường kiểm thử. Bước tiếp theo, các đường kiểm thử chứa vòng lặp được cấu trúc
lại để sinh thêm các đường kiểm thử mới dùng kiểm thử tính đúng đắn vòng lặp. Dựa
trên tập các đường kiểm thử, ta xây dựng các hệ ràng buộc tương ứng. Cuối cùng, ta
thực hiện giải hệ ràng buộc thu được để sinh tập dữ liệu cho bộ cácca kiểm thử bằng
cách sử dụng thế mạnh của các công cụ SMT-Solver.
Một công cụ hỗ trợ phương pháp này cũng được cài đặt bằng ngôn ngữ lập trình
Java để chứng minh tính đúng đắn và khả năng ứng dụng trong thực tế của phương
pháp. Kết quả thực nghiệm cho thấy, tậpdữ liệu cho bộ ca kiểm thử sinh ra một cách tự
động với số lượng tối thiểu nhưng vẫn đảm bảo đạt độ bao phủ cao, đạt độ tin cậy cao
trong kiểm chứng tính đúng đắn của mã nguồn.
Từ khóa:Kiểm thử tự động, kiểm thử hộp trắng dòng điều khiển, đồ thị dòng điều
khiển,kiểm thử vòng lặp, độ phủ,ca kiểm thử

iv


ABSTRACT
Testingphase has lot of significance in Software Development Life Cycle
(SDLC) due to it is the most important part in executing and fault rectification.
Because of high demand in quality, testing phase is performed quite thoroughly and

strictly. As a result, the cost of the testing phase can be up to 40% - 60% the total cost
of application development process.
To reduce the cost of the testing phase, not only the testing execution phase but
also the test case generation process should be automated as much as possible.
However, some automation testing tools just focus on executing test cases and return
the testing report instead of generating test cases automatically.
The Thesis researches a method of generating a set of test cases automatically for
Java applications based on the static white-box technique. Input by source code of the
application under test and coverage criteria, the output of this method is a minimal set
of test cases which can satisfy the provided criteria and reach the maximum coverage
level. The proposed method processes as following: Firstly, the source code is required
to be analysed in order to generate corresponding Control Flow Graph (CFG). Based
on the CFG, independent paths will be built. After that, paths containing loop is reconstructed to generatesome new paths used to test the loop. Then, each path is
analysed by using symbolic execution technique to create corresponding constraints.
Finally, the constraints aresolved to find solutions by SMT-Solver tools. A set of test
data for the test cases is generated automatically. The experimental result shows the
effectiveness of the approach with the set of test data for the minimum number of test
cases but ensures the high quality of source code.
Keywords:Automated testing, white-box testing technique, control flow testing,
test case, coverage criteria

v


LỜI CAM ĐOAN
Tôi xin cam đoan rằng luận văn thạc sĩ công nghệ thông tin “Phương pháp sinh
dữ liệu kiểm thử tự động cho các ứng dụng Java” là nghiên cứu của riêng tôi,
không sao chép lại của người khác. Trong toàn bộ nội dung của luận văn, những điều
đã được trình bày hoặc là của chính cá nhân tôi hoặc là được tổng hợp từ nhiều nguồn
tài liệu. Tất cả các nguồn tài liệu tham khảo đều có xuất xứ rõ ràng và hợp pháp.

Tôi xin hoàn toàn chịu trách nhiệm và chịu mọi hình thức kỷ luật theo quy định
cho lời cam đoan này.
Hà Nội, ngàythángnăm 2015

Phan Thị Thu Hà

vi


DANH MỤC THUẬT NGỮ VIẾT TẮT
STT

Từ viết tắt

Từ đầy đủ

Ý nghĩa

1

AST

Abstract Syntax Tree

Cây cú pháp trừu tượng

2

CFG


Control Flow Graph

Đồ thị dòng điều khiển

3

JDT

Java Development Tools

Bộ công cụ lập trình của
ngôn ngữ lập trình Java

4

CVC

Cooperating Validity Checker

5

DIMACS

Center for Discrete Mathematics
and Theoretical Computer Science

6

SMT-Solver Satisfiability
Solver


Modulo

vii

Theories


DANH MỤC HÌNH VẼ
Hình 1.1. Top 10 ngôn ngữ lập trình phổ biến giai đoạn 2002-2015 .............................. 3
Hình 2.1. Đảm bảo chất lượng phần mềm theo từng pha ................................................6
Hình 2.2. Chi phí cho việc tìm và sửa lỗi ........................................................................7
Hình 2.3. Các thành phần cơ bản của đồ thị dòng điều khiển .........................................8
Hình 2.4. Các cấu trúc điều khiển phổ biến ....................................................................9
Hình 2.5. Kiểm thử hộp trắng dòng điều khiển theo hướng động................................. 11
Hình 2.6. Ví dụ một luật chèn mã nguồn trong DMS/SRT ...........................................12
Hình 2.7. Mã nguồn hàm triangle sau khi thêm khối mã nguồn mới ............................ 12
Hình 2.8. Kiểm thử hộp trắngdòng điều khiển theo hướng tĩnh ...................................13
Hình 3.1. Quy trình kiểm thử một hàm Java theo phương pháp nghiên cứu ................15
Hình 3.2. Thuật toán sinh CFG từ mã nguồn. ............................................................... 17
Hình 3.3. Mã nguồn hàm kiemTraNamNhuan. ............................................................. 18
Hình 3.4. CFG hàm kiemTraNamNhuan tiêu chuẩn phủ câu lệnh, phủ nhánh ............18
Hình 3.5. CFG hàm kiemTraNamNhuan tiêu chuẩn phủ điều kiện con ....................... 19
Hình 3.6. CFG điều kiện kép (a>=0 || ((b>=0 && c>=0) || b+c>=0) || a+b+c>=0) ......20
Hình 3.7. Thuật toán sinh tập đường đi độc lập từ CFG ...............................................21
Hình 3.8. Thuật toán sinh đường kiểm thử vòng lặp. ....................................................23
Hình 3.9. Thuật toán sinh đường kiểm thử vòng lặp trong. ..........................................24
Hình 3.10. Thuật toán sinh đường kiểm thử vòng lặp ngoài. ........................................25
Hình 3.11. Ví dụ một hệ ràng buộc. ..............................................................................25
Hình 3.12. Thuật toán sinh hệ ràng buộc từ đường kiểm thử........................................26

Hình 3.13. Quá trình rút gọn câu lệnh. ..........................................................................27
Hình 3.14. Mô tả đầu vào, đầu ra SMT-Solver. ............................................................ 29
Hình 3.15. Ví dụ hệ ràng buộc tuân theo chuẩn SMT-Lib. ...........................................30
Hình 3.16. Quá trình chuyển một biểu thức trung tố về chuẩn SMT-Lib. ....................31
Hình 4.1. Kiến trúc chương trình JavaUnitCFT ............................................................ 32
Hình 4.2. Ví dụ minh họa AST...................................................................................... 33
Hình 4.3. Sử dụng ASTView trong Eclipse trên đoạn mã nguồn “test” ....................... 34
Hình 4.4. Cây AST của mã nguồn class “test” .............................................................. 35
viii


TÀI LIỆU THAM KHẢO
Tiếng Việt
[1]
[2]

Phạm Ngọc Hùng, Trương Anh Hoàng, Đặng Văn Hưng (2014), “Giáo trình
kiểm thử phần mềm”, Nhà xuất bản giáo dục Việt Nam.
Nguyễn Đức Anh (2015), “Xây dựng công cụ kiểm thử tự động cho các chương
trình C”, Khóa luận tốt nghiệp Trường Đại học Công Nghệ, Đại học Quốc Gia
Hà Nội.
Tiếng Anh

[3]
[4]
[5]

[6]

[7]


Manish Mishra, Shashi Mishra and Rabins Porwal (2012), “Basic Principle for
testcase Generation Automatically”, VSRD-IJCSIT, Vol. 2 (9), pp.772-781
Dorothy Graham, Erik van Veenendaal, Isabel Evans, Rex Black (2012),
“Foundations Of Software Testing”, ISTQB Certification, 3rd Edition
Danila Piatov, Andrea Janes, Alberto Sillitti and Giancarlo Succi (2012), “Using
the Eclipse C/C++ Development Tooling as a Robust, Fully Functional, Actively
Maintained, Open Source C++ Parser”,IFIP Advances in Information and
Communication Technology, Vol. 378, pp. 399-406
Arthur H. Watson and Thomas J. McCabe, “Structured Testing: A Testing
Methodology Using the Cyclomatic Complexity Metric”, NIST Special
Publication 500-235
J. C. King (1976), “Symbolic execution and program testing”, Communciations
of the ACM, vol. 19, no. 7, pp. 385–394

50



×