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

NGHIÊN CỨU MỘT SỐ KỸ THUẬT SINH TEST CASE TỐT TRONG KIỂM THỬ PHẦN MỀM

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 (1.55 MB, 73 trang )

1

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
THÔNG TIN VÀ TRUYỀN THÔNG

BÁO CÁO TỔNG KẾT
ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP ĐẠI HỌC

NGHIÊN CỨU MỘT SỐ KỸ THUẬT SINH TEST CASE TỐT
TRONG KIỂM THỬ PHẦN MỀM
ĐH 2014-TN08-03

Chủ nhiệm đề tài: ThS. Tô Hữu Nguyên

THÁI NGUYÊN, THÁNG 9 NĂM 2017


2

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
THÔNG TIN VÀ TRUYỀN THÔNG

BÁO CÁO TỔNG KẾT
ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP ĐẠI HỌC

NGHIÊN CỨU MỘT SỐ KỸ THUẬT SINH TEST CASE TỐT
TRONG KIỂM THỬ PHẦN MỀM
ĐH 2014-TN08-03


Xác nhận của tổ chức chủ trì
(ký, họ tên, đóng dấu)

Chủ nhiệm đề tài
(ký, họ tên)

THÁI NGUYÊN, THÁNG 9 NĂM 2017


3

DANH SÁCH THÀNH VIÊN THAM GIA NGHIÊN CỨU

TT

1

Họ và tên

Nguyễn Hồng Tân

Học hàm,
học vị

Thạc sĩ

Đơn vị công tác

Bộ Môn: Công nghệ
phần mềm - Khoa

CNTT

2

Hà Thị Thanh

Thạc sĩ

Bộ Môn: Công nghệ
phần mềm - Khoa
CNTT

Nội dung công việc
tham gia thực hiện
trong đề tài
Nghiên cứu, đánh giá
tổng quan các kỹ thuật,
các công cụ sinh dữ liệu
kiểm thử tự động hiện
nay
Nghiên cứu về các thách
thức của kiểm thử phần
mềm, kỹ thuật thực thi
t

ng tr ng


4


MỤC LỤC
MỞ ĐẦU .................................................................................................................................... 1
Chương 1. TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ SINH
DỮ LIỆU KIỂM THỬ.............................................................................................................. 4
1.1. Kiểm thử phần mềm ............................................................................................................ 4
1.2. Kiểm thử đơn vị ................................................................................................................... 5
Chương 2. JAVA PATHFINDER VÀ THỰC THI TƯỢNG TRƯNG ................................ 9
2.1. Java pathfinder ..................................................................................................................... 9
2.1.1. Giới thiệu về JPF .............................................................................................................. 9
2.1.2. Khả năng kiểm tra của JPF ............................................................................................10
2.1.3. Kiến trúc mức cao của JPF .............................................................................................11
2.1.4. Khả năng mở rộng của JPF .............................................................................................13
2.1.5. Một số mở rộng của JPF .................................................................................................14
2.2. Thực thi t ng tr ng ..........................................................................................................15
2.2.1. Những khái niệm cơ bản .................................................................................................15
2.2.2. Thực thi t ng tr ng tĩnh ................................................................................................16
2.2.3. Thực thi t ng tr ng động ..............................................................................................20
2.2.4. Xây dựng ràng buộc ........................................................................................................27
2.2.5. L u trữ giá trị t ng tr ng ..............................................................................................29
2.3. SE với các kiểu dữ liệu nguyên thủy .................................................................................30
2.4. SE với đối t ng ................................................................................................................34
2.5. SE với các lời gọi ph ơng thức .........................................................................................38
2.6. Những thách thức và một vài giải pháp. ............................................................................39
2.6.1. Bùng nổ đ ờng đi ...........................................................................................................39
2.6.2. Giải các ràng buộc ..........................................................................................................41
2.6.3. Mô hình hóa bộ nhớ. .......................................................................................................43
2.6.4. Giải quyết vấn đề t ơng tranh ........................................................................................44
Chương 3 THỰC THI TƯỢNG TRƯNG TRÊN KIỂU DỮ LIỆU XÂU ..........................44
3.1. Ràng buộc hỗn h p và giải ràng buộc xâu. .......................................................................45
3.1.1. Đồ thị xâu........................................................................................................................46

3.1.2. Xây dựng lại ràng buộc ...................................................................................................47
3.1.3. Tiền xử lý ........................................................................................................................48
3.1.4. Sinh các ràng buộc xâu. ..................................................................................................49
3.2.Giải ràng buộc xâu dựa trên ph ơng pháp BitVector .........................................................53
3.3.Cài đặt và đanh giá kêt quả. ................................................................................................54
KẾT LUẬN VÀ KIẾN NGHỊ ................................................................................................57
TÀI LIỆU THAM KHẢO ......................................................................................................58


5

DANH MỤC HÌNH VẼ
Hình 1.1. Ph ơng thức kiểm thử trên VSUnit ................................................................ 5
Hình 1.2. Ph ơng thức LuhnAlgorithm .......................................................................... 7
Hình 1.3. Ph ơng thức test cho LuhnAlgorithm ............................................................. 7
Hình 2.1. Mô hình hoạt động của JPF............................................................................. 9
Hình 2.2. Sơ đồ trạng thái trong quá trình kiểm thử ..................................................... 10
Hình 2.3. Kiến trúc JPF mức cao .................................................................................. 12
Hình 2.4. Mẫu Listener ................................................................................................. 13
Hình 2.5. Cây thực thi t ng tr ng ............................................................................... 19
Hình 2.6. Thuật toán thực thi t ng tr ng động ........................................................... 21
Hình 2.7. Thực thi t

ng tr ng với ph ơng thức nhận đầu vào là đối t

ng ............... 24

Hình 2.8. Cây thực thi t ng tr ng đ c quản lý riêng ................................................ 27
Hình 2.9. Hệ thống kiểm thử tổng quát ......................................................................... 29
Hình 2.10. Gán giá trị t ng tr ng cho tham số đầu vào .............................................. 31

Hình 2.11. Thực thi t ng tr ng với câu lệnh gán........................................................ 32
Hình 2.12. Thực thi t ng tr ng với câu lệnh rẽ nhánh ............................................... 34
Hình 2.13. Khởi tạo đối t ng làm đầu vào cho ch ơng trình ..................................... 36
Hình 2.14. Sinh ra các ràng buộc liên quan tới đối t

ng ............................................ 38

Hình 3.1. Thuật toán giải ràng buộc hỗn h p ............................................................... 45
Hình 3.2. Đồ thị xâu ...................................................................................................... 47
Hình 3.3. Đồ thị sau khi loại bỏ phép toán equals. ....................................................... 48
Hình 3.4. Các ràng buộc không thỏa mãn sau khi loại bỏ phép toán equals ................ 49
Hình 3.5. Các đỉnh mới đại diện cho độ dài xâu đ c bổ sung .................................... 49
Hình 3.6. Giải ràng buộc xâu dựa trên Automata ......................................................... 51
Hình 3.7. Ph ơng thức giải ràng buộc phủ định ........................................................... 52
Hình 3.8. Ch ơng trình Java kiểm thử .......................................................................... 54
Hình 3.9. Kết quả sinh dữ liệu t ng tr ng trên một số phép toán trên xâu ................ 54


6

DANH MỤC BẢNG BIỂU
Bảng 2.1. Ví dụ về thực thi t ng tr ng động .............................................................. 23
Bảng 2.2. Minh họa việc chuyển đổi từ mã nguồn Java sang mã Jimple ..................... 27
Bảng 2.3. Sửa đổi ch ơng trình với câu lệnh liên quan tới đối t ng. ......................... 34
Bảng 3.1. Xây dựng các ràng buộc cho các phép toán trên xâu. .................................. 50
Bảng 3.2. Xây dựng dàng buộc t ơng ứng với các phép toán trên xâu. ....................... 53


7
ĐẠI HỌC THÁI NGUYÊN

TRƯỜNG ĐHCNTT&TT

THÔNG TIN KẾT QUẢ NGHIÊN CỨU
1. Thông tin chung
- Tên đề tài: Nghiên cứu một số kỹ thuật sinh test case tốt trong kiểm thử phần mềm.
- Mã số: ĐH2014-TN08-03.
- Chủ nhiệm: ThS. Tô Hữu Nguyên.
- Tổ chức chủ trì: Tr ờng Đại học Công nghệ Thông tin & Truyền thông, Đại
học Thái Nguyên.
- Thời gian thực hiện: 1/2014-12/2015.(Gia hạn đến tháng 6 năm 2016)
2. Mục tiêu
- Nghiên cứu một số kỹ thuật sinh test case trong kiểm thử phần mềm và áp dụng
vào bài toán cụ thể.
- Nghiên cứu kỹ thuật thực thi t

ng tr ng từ đó làm cơ sở để sinh ra các Test

Case một cách hiệu quả để nâng cao chất l

ng phần mềm.

3. Tính mới và sáng tạo
- Đề xuất áp dụng ph ơng pháp kiểm thử thực thi t

ng tr ng áp dụng trong

kiểm thử units trong kiểm thử phần mềm.
- Xây dựng thuật toán sinh dữ liệu kiểm thử trên kiểu dữ liệu xâu, b ớc đầu đ a
ra một số cho ra đ


c một số kết quả nhất định.

4. Kết quả nghiên cứu
Với mục tiêu đề ra ban đầu là nghiên cứu, tìm kiếm h ớng tiếp cận hiểu quả
trong sử dụng kỹ thuật thực thi t
tài đã đạt đ

ng tr ng áp dụng trong tự động sinh test case đề

c một số kết quả nh sau:

- Hệ thống các kiến thức cơ bản về kiểm thử phần mềm, kiểm thử units test.
- Nghiên cứu về kỹ thuật thực thi t

ng tr ng và các vấn đề liên quan.

- Phát triển hai ph ơng pháp sinh dữ liệu kiểm thử trong trên một số kiểu dữ liệu.


8

Xây dựng thuật toán sinh dữ liệu kiểm thử trên kiểu dữ liệu xâu và đánh giá hiệu
quả của thuật toán.
Từ các nội dung nghiên cứu, nhóm thực hiện đã công bố trên các tạp chí trong
n ớc và quốc tế.
Công bố bài báo theo các nội dung nghiên cứu trên tạp chí khoa học công nghệ
trong n ớc và ngoài n ớc.
5. Sản phẩm
5.1. Sản phẩm khoa học
[1]. Tô Hữu Nguyên, Nguyễn Hồng Tân, Hà Thị Thanh, Đỗ Thanh Mai (2016),

―Thực thi t

ng tr ng trong sinh tự động dữ liệu kiểm thử phần mềm‖, Tạp

chí khoa học Đà Lạt –Đại Học Đà Lạt, 6(2), tr. 254-273.
[2]. To Huu Nguyen, Tran Thi Ngan, Do Thanh Mai, Tran Manh Tuan (2016),
―A Novel Symbolic execution model in automated generation of test case‖,
International Journal of Innovative Technology and Exploring Engineering
(IJITEE) e-ISSN: 2395 -0056, 3(7), pp 145-155.
[3]. Tô Hữu Nguyên, Nguyễn Hồng Tân, Hà Thị Thanh (2016), ―Kỹ thuật mô
hình hóa ràng buộc hỗn h p và ph ơng pháp giải ràng buộc xâu trong thực thi
t

ng tr ng‖, Tạp chí Khoa học và Công nghệ, Đại học Thái Nguyên,

159(14), tr. 141-147
5.2. Sản phẩm đào tạo
[1]. Lê Thị Định, Nghiên cứu kỹ thuật thực thi tượng trưng trong sinh tự động
các Test case, Khóa luận tốt nghiệp Đại học năm 2016, Quyết định số 443/QĐ
ĐHCNTT&TT ngày 15 tháng 06 năm 2016
[2]. Đinh Trọng Tiến, Nghiên cứu áp dụng thực thi tượng trưng trong kiểm thử
Unit trên Junit cho ngôn ngữ Java, Khóa luận tốt nghiệp Đại học năm 2016,
Quyết định số 443/QĐ ĐHCNTT&TT ngày 15 tháng 06 năm 2016
[3]. Đề tài góp phần đào tạo trình độ tiến sĩ cho NCS Tô Hữu Nguyên với tên đề
tài, Kỹ thuật thực thi tượng trưng trong việc sinh tự động các test case, của chính


9

tác giả Tô Hữu Nguyên, Quyết định số 215/QĐ –CNTT-Viện CNT ngày 04

tháng 12 năm 2012
5.3 Sản phẩm ứng dụng
Sử dụng ph ơng pháp tiếp cận Automata xây dựng modul sinh dữ liệu kiểm
thử cho unit test trên kiểu dữ liệu xâu trên Java PathFinder.
6. Phương thức chuyển giao, địa chỉ ứng dụng, tác động và lợi ích mang lại của
kết quả nghiên cứu
6.1. Về bồi dưỡng, đào tạo nhân lực khoa học và công nghệ
Hiện nay, công nghệ thông tin đang là một trong những h ớng u đ

c u

tiên phát triển của Đảng và Nhà n ớc ta. Đề tài nhằm mục đích chính là nghiên cứu
kỹ thuật thực thi t

ng tr ng trong tự động sinh test case. Nhóm nghiên cứu

ph ơng pháp áp dụng ph ơng pháp tiếp thực thi t

ng tr ng kết h p java

pathfinder trong tự động sinh các test case trên kiểu dữ liệu xâu, nhằm nâng cao khả
năng áp dụng kỹ thuật này vào trong thực tế.
Đây cũng là một trong những nội dung giúp các giảng viên CNTT&TT trau
dồi kiến thức chuyên môn, nâng cao ph ơng pháp nghiên cứu khoa học. các giảng
viên đã tham gia đề tài đã không chỉ nâng cao đ

c kiến thức chuyên sâu trong lĩnh

vực mà rèn luyện khả năng viết báo trong n ớc và quốc tế.
6.2. Đối với đào tạo tại trường đại học CNTT&TT

Các kết quả của đề tài có thể đ

c ứng dụng phục vụ mục đích giảng dạy,

học tập và nghiên cứu khoa học trong lĩnh vực chuyên môn kiểm thử phần mềm của
nhóm ngành CNTT, KTPM đang đ
này đ

c đào tạo tại tr ờng đại học CNTT&TT. Điều

c thể hiện bởi các sản phẩm của đề tài nh bài báo, báo cáo toàn văn của đề

tài.
6.3. Đối với xã hội
Kiểm thử phần mềm nói chung và sinh dữ liệu kiểm thử nói riêng đang là
vấn đề đ
đ

c các nhà nghiên cứu và các công ty phần mềm quan tâm. Giải quyết

c các vấn đề này sẽ nâng cao khả năng phát hiện những lỗi trong các sản phầm


10

phần mềm cũng nh khả năng rút ngắn thời gian, chi phí dành cho giai đoạn kiểm
thử.
6.4. Khả năng áp dụng và phương thức chuyển giao kết quả nghiên cứu
Ch ơng trình thực nghiệm có thể phát triển hoàn thiện, có khả năng áp sinh
dữ dữ liệu kiểm thử trên một số kiểu dữ liệu và đặc biệt là kiểu văn bản (trong kiểm

thử các ứng dụng Web hoặc truy vấn SQL).
Các sản phẩm của đề tài bao gồm các bài báo cáo tại hội thảo và tạp chí có
thể đ

c sử dụng nh nguồn tài liệu tham khảo trong lĩnh vực khai phá dữ liệu và

các lĩnh vực liên quan cho th viện nhà tr ờng sử dụng để phục vụ công tác giảng
dạy, học tập và nghiên cứu khoa học tại tr ờng đại học CNTT&TT.
Ngày 15 tháng 9 năm 2017
Tổ chức chủ trì

Chủ nhiệm đề tài

(ký, họ và tên, đóng dấu)

(ký, họ và tên)

Tô Hữu Nguyên


11

INFORMATION ON RESEARCH RESULTS
1. General information
- Project title: Studying some good test-case generation techniques in software
testing.
- Code number: ĐH2014-TN08-03.
- Coordinator: MSc. To Huu Nguyen.
- Implementing institution: College of Information and Communication
Technology, Thai Nguyen University.

- Duration: from 1/2014 to 12/2015.( extends to 6 / 2017)
2. Objective(s)
- Studying some test-case generation techniques in software testing and applying
these techniques into typical problems.
- Studying symbolic execution technique and applying it effectively in test-case
generation in order to increase the quality of software.
3. Creativeness and innovativeness
- To manufacturing test method applies symbolic execution of unit testing in
software testing.
- Construction of data generation algorithm testing on the data type string,
initially given a number to produce a certain test case.
4. Research results
- Systematizing the basic knowledge about software testing and unit test.
- Improving some test-case generation techniques on string and mixed data.
- Publishing papers on National and International scientific journals.
5. Products
5.1. Scientific products:


12

[1]. To Huu Nguyen, Nguyen Hong Tan, Ha Thi Thanh, Do Thanh Mai (2016),
―Symbolic execution in automaticcally generation of data software testing”,
Dalat Scientific Journal, Dalat University, 6(2), pp. 254-273.
[2]. To Huu Nguyen, Tran Thi Ngan, Do Thanh Mai, Tran Manh Tuan (2016), ―A
Novel Symbolic execution model in automated generation of test case‖,
International Journal of Innovative Technology and Exploring Engineering
(IJITEE) e-ISSN: 2395 -0056, 3(7).
[3]. To Huu Nguyen, Nguyen Hong Tan, Ha Thi Thanh (2016), ―Mixed-Constraints
modeling technique and String constraints solving method in symbolic

execution‖, Journal of Science and Technology – Thai Nguyen University,
159(14), pp. 141-147.
5.2. Training products
[1].

Le Thi Dinh (2016), Research in Novel Symbolic execution model in

automated generation of test case, Under graduated thesis, College of
Information and Communication Technology, Thai Nguyen University
[2]. Dinh Trong Tien (2016), Research in Novel Symbolic execution model in
automated generation of unit test case for Java language, Under graduated
thesis, College of Information and Communication Technology, Thai Nguyen
University.
[3]. The Research contributing to the doctoral degree for To Huu Nguyen with
the title

“Symbolic execution in automated generation of test case ", by the

author To Huu Nguyen, Thesis, Vietnam Academy of Science and Technology.
5.3. Application products: A test data generation module using Automata approach
technique for unit test with string data on JavaPathFinder.
6. Transfer alternatives, application institutions, impacts and benefits of
research result
6.1 . On fostering and training human resources in science and technology
Nowadays, information technology is one of the trends that have the priority
to develop of our Party and Nation. This project intends to research symbolic


13


excution techniques in automated test case generation. Our team apply the method
that combines symbolic excution with JavaPathFinder in automated test case
generation on string data in order to improve the applicability of this technique in
reality.
This is also one of the contents that is useful for teachers in ICTU to discuss
specialistic knowledge and to improve the ability in science research method. This
project also helps the members not only develop their intensive knowledge in specific
fields but also improve their writing paper ability to publish on international and
national journals.
6.2 . On training at ICTU
The results of this project can be applied into teaching, learning purposes and
science researches in specialistic field of software testing in information technology
and software engineering majors that are being trained in ICTU. This is presented via
the products of project such as papers and full text report.
6.3 . For society
Software testing in general and automated testing data generation in particular
are the problems that grasp the concern of both scientists and software development
companies. Solving these problems is going to improve errors detection ability in
software products, to decrease the time and the cost of testing process.
6.4 . Applicability and the method to transfer research results
The experimental program could be developed fully and applied into testing
data generation on various kinds of data, especially in text data (in Web application
testing or SQL query)
The products of this project including conference and journal papers can be
used as the reference resources in data mining and other related fields in library for
the teaching and researching purposes at ICTU.


1


MỞ ĐẦU
Kiểm thử đã đ

c chứng minh rõ ràng nó là công đoạn không thể thiếu trong

quá trình tạo ra một sản phẩm phần mềm hoàn thiện nó giúp cho sản phẩm hoạt
động đúng nh mong đ i, tránh những sai sót đáng tiếc trong vận hành phần mềm.
Việc thực hiện kiểm thử đòi hỏi ng ời kiểm thử phải có kiến thức cũng nh cách
nhìn khách quan với sản phẩm đồng thời cũng tiêu tốn khá nhiều thời gian chi phí
và công sức nhất là đối với các ch ơng trình lớn và nhiều nhóm xây dựng do vậy để
giảm bớt thời gian và tiền bạc cũng nh sự nhàm chán khi kiểm thử thủ công, thì
việc nghiên cứu các ph ơng pháp kiểm thử nhằm rút ngắn đ

c thời gian thực hiện.

Để đảm bảo việc kiểm thử đạt hiệu quả thì việc sinh các test case là vô cùng
quan trọng trên cơ sở đó sinh tự động các test case bằng việc sử dụng Java Path
Finder một trong những mở rộng của Java ứng dụng trong kỹ thuật thực thi t ng
tr ng (Symbolic execution).
Một số hướng nghiên cứu về sinh dữ liệu kiểm thử trong phần mềm
Trong lĩnh vực kiểm thử 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.
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á


2

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á 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.
H ớng nghiên cứu của đề tài



3

- Nghiên cứu lý thuyết kiểm thử, các ph ơng pháp kiểm thử, tự động sinh
test case kiểm thử đơn vị.
- Nghiên cứu áp dụng kỹ thuật thực thi t

ng tr ng trong tự động sinh các test

case.
- Cài đặt thử nghiệm các ph ơng pháp thực thi t ng tr ng trên ngôn ngữ
java , thử nghiệm các ph ơng pháp thực thi t ng tr ng trên công cụ java
Pathfinder cho sinh tự động các test case trên một số kiểu dữ liệu.
- Đánh giá kết quả sau khi thử nghiệm.
Đối t
t

ng nghiên cứu

- Nghiên cứu ph ơng pháp sinh tự động các test case, giải ràng buộc, thực thi
ng tr ng, thực thi t ng tr ng động, cách thách thức trong thực thi t ng tr ng.

- Cơ sở lý thuyết của việc nghiên cứu kỹ thuật thực thi t
trong tự động sinh các test case .
- Ứng dụng thực thi t
Kết quả đạt đ

ng tr ng áp dụng


ng tr ng vào sinh tự động các test case

c

- Báo cáo tổng h p kết tìm hiểu về kỹ thuật thực thi t

ng tr ng các kỹ thuật

giải ràng buộc, sử dụng công cụ mô hình hóa java pathfinder và symbolic java
pathfinder trong tự động sinh test case.
- Công bố một số kết quả nghiên cứu đăng trên tạp chí trong và ngoài n ớc.
- Cài đặt thử nghiệm kỹ thuật mô hình hóa và giải ràng buộc trên một số
ph ơng pháp automata và Bitvector trong giải ràng buộc xâu. Thử nghiệm hai thuật
toán trên với một số bộ dữ liệu, so sánh các kết quả đã thu đ

c sau khi thử nghiệm.


4

Chương 1. TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM VÀ SINH
DỮ LIỆU KIỂM THỬ
1.1. Kiểm thử phần mềm
Để đảm bảo một hệ thống phần mềm hoặc các thành phần của phần mềm làm
việc nh mong muốn là một thách thức lớn trong ngành công nghiệp phần mềm.
Các phần mềm lỗi gây ra những tổn thất về kinh tế cũng nh những hậu quả nghiêm
trọng khác tùy thuộc vào lĩnh vực mà phần mềm đ

c sử dụng. Do đó cần phải phát


hiện và khắc phục các lỗi của phần mềm tr ớc khi đem chúng vào sử dụng. Có các
ph ơng pháp khác nhau để phát hiện lỗi của phần mềm bao gồm kiểm tra mô hình
(model checking)[6], các kỹ thuật phân tích tĩnh (static analysis)[6] và kiểm thử
(software testing)[19].
Các kỹ thuật phân tích ch ơng trình tĩnh th ờng đ a ra nhiều cảnh báo
(warnings) không t ơng ứng với các lỗi thực sự. Các kỹ thuật kiểm thử phát hiện ra
các lỗi thực sự nh ng th ờng không phát hiện ra đ

c tất cả các lỗi do chỉ phân tích

một số sự thực thi trong ch ơng trình. Trong kiểm tra mô hình, một mô hình của hệ
thống đ

c tạo ra để hỗ tr phân tích mọi sự thực thi có thể trong mô hình. Kiểm tra

mô hình có thể kiểm chứng đ

c rằng mô hình của hệ thống hoạt động chính xác

trong tất cả tr ờng h p có thể. Kiểm tra mô hình phân tích hết mọi khía cạnh thực
thi của ch ơng trình và chỉ ra những sự vi phạm nh ng không chứng minh đ
ch ơng trình sẽ đ

c

c thực thi chính xác mà không có lỗi. Hạn chế của kiểm tra mô

hình đó là không gian trạng thái của mô hình th ờng quá lớn do đó việc thám hiểm
tất cả các trạng thái không phải lúc nào cũng thực hiện đ
Kiểm thử chính là kỹ thuật đ


c.

c sử dụng phổ biến nhất để phát hiện và khắc

phục các lỗi của phần mềm nhằm đảm bảo chất l

ng của phần mềm. Chi phí giành

cho việc kiểm thử chiếm khoảng 50% tổng chi phí trong phát triển phần mềm. Kiểm
thử là một tiến trình quan trọng trong kỹ nghệ phần mềm. Kiểm thử đơn vị chính là
b ớc đầu tiên trong quy trình kiểm thử đó. Có các kỹ thuật kiểm thử khác nhau
đ

c sử dụng nh kiểm thử hộp trắng (white-box testing), kiểm thử hộp đen (black-

box testing), kiểm thử hộp xám (gray-box testing). Các kỹ thuật kiểm thử đó đ

c

dựa trên 2 loại kiểm thử đó là kiểm thử chức năng (funcional testing) và kiểm thử


5

cấu trúc (structured testing). Kiểm thử chức năng là loại kiểm thử dựa trên đặc tả
chức năng của hệ thống, nó phát hiện các sai sót về chức năng mà không quan tâm
tới cài đặt. Kiểm thử cấu trúc là loại kiểm thử có nghiên cứu mã nguồn bằng việc
phân tích thứ tự thực hiện các lệnh.
1.2. Kiểm thử đơn vị

Kiểm thử đơn vị là một cộng việc quan trọng trong kỹ nghệ phần mềm. Kiểm
thử đơn vị th ờng đ

c áp dụng để kiểm tra việc cài đặt của các lớp hoặc ph ơng

thức. Để thực hiện việc kiểm thử đơn vị, các lớp kiểm thử đ

c tạo ra. Các lớp kiểm

thử này gồm các ph ơng thức kiểm thử. Các ph ơng thức kiểm thử là các ph ơng
thức không tham số có kiểu trả về là void chứa trong các lớp kiểm thử để kiểm tra
các khía cạnh cài đặt khác nhau của ch ơng trình. Mỗi ph ơng thức kiểm thử trong
các lớp kiểm thử biểu thị cho một ca kiểm thử đơn vị (UT).
Có thể chia một ph ơng thức kiểm thử ra làm 3 phần: Các giá trị đầu vào, dãy
các lời gọi ph ơng thức, và sự xác nhận (assertions). Kiểm thử thất bại nếu bất cứ
sự xác nhận nào bị vị phạm hoặc có một ngoại lệ (exception) xảy ra.
Ví dụ ta xét một ph ơng thức kiểm thử đ

c viết trong nền kiểm thử VSUnit.

Hình 1.1. Phương thức kiểm thử trên VSUnit
public void TestArrayList() {
// exemplary data
int capacity = 1;
object element = null;
// method sequence
ArrayList list = new ArrayList(capacity);
list.Add(element);
// assertions
Assert.IsTrue(list[0] == element);

}


6

Ph ơng thức kiểm thử TestArrayList bắt đầu bằng việc gán giá trị 1 cho biến
capacity và giá trị null cho biến element nh là các giá trị đầu vào kiểm thử. Sau đó
nó thực hiện một dãy các lời gọi ph ơng thức, tr ớc tiên là khởi tạo một đối t

ng

ArrayList với kích cỡ là capacity không chứa phần tử nào. ArrayList là một mảng
động với kích cỡ có thể thay đổi. Tiếp theo nó chèn một đối t

ng là element vào

mảng. Và cuối cùng là xác nhận xem phần tử đầu tiên của mảng có bằng đối t
vừa đ

ng

c chèn vào hay không.

Việc cài đặt nhiều ph ơng thức kiểm thử không đảm bảo rằng sẽ kiểm tra
đ

c hết mọi khía cạnh thực thi của ch ơng trình. Với các ch ơng trình có nhiều

đ ờng đi thực thi khác nhau thì việc thiếu xót các UT để kiểm tra một vài đ ờng đi
thực thi trong ch ơng trình là điều th ờng xuyên xảy ra. Khi ng ời lập trình thay

đổi mã cài đặt của ch ơng trình đ
thử không đ

c kiểm thử thì nếu nh các ph ơng thức kiểm

c cập nhật theo thì sẽ dẫn đến việc nhiều đ ờng đi thực thi của

ch ơng trình sẽ không đ

c kiểm thử.

Các nền kiểm thử hỗ tr viết các UT theo các cách khác nhau. Tuy nhiên, đa
phần các nền kiểm thử đều cung cấp những dịch vụ (service) nh sau:
+ Cung cấp thuộc tính để chỉ định các ph ơng thức nh là các UT.
+ Phát hiện và thực thi tự động các UT
+ Một runner với khả năng báo cáo (reporting). Một runner có thể là ứng
dụng dòng lệnh (console) hoặc là giao diện tích h p.
Nh trong nền kiểm VSUnit [13] cho môi tr ờng .NET. Ta sử dụng thuộc
tính [TestClass] để chỉ định một lớp là lớp kiểm thử, và [TestMethod] để chỉ định
một ph ơng thức nh là một ph ơng thức kiểm thử. Ngoài ra còn có các thuộc tính
khác nh [ExpectedException<typeofException>] để chỉ định ph ơng thức kiểm
thử ném ra ngoại lệ của một kiểu ngoại lệ cụ thể nào đó.
Giả sử có một lớp LuhnAlgorithm đ

c cài đặt nh sau:


7

Hình 1.2. phương thức LuhnAlgorithm

public static class LuhnAlgorithm {
public static bool Validate(string number){
if (number == null)
throw new ArgumentNullException("");
foreach (var c in number)
if (!Char.IsDigit(c))
throw new ArgumentException("");
return false;
}
}
Ta có thể viết một lớp kiểm thử chứa các UT để thực hiện việc kiểm thử lớp
LuhnAlgorithm:
Hình 1.3. phương thức test cho LuhnAlgorithm
[TestClass]// lớp chứa các unit test
public class LuhnAlgorithmTest {
[TestMethod]

[ExpectedException(typeof(ArgumentNullException))]
public void Test1() {
LuhnAlgorithm.Validate(null);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void Test2() {


8

LuhnAlgorithm.Validate("K50");
}

[TestMethod]
public void Test3() {
LuhnAlgorithm.Validate(“123”);
}
}
Khi

thực

thi

ph ơng

ArgumentNullException đ
ArgumentException đ

thức

kiểm

thử

Test1

thì

ngoại

lệ


c ném ra. Khi thực thi ph ơng thức kiểm thử Test2 thì

c ném ra. Rõ ràng là mỗi ph ơng thức kiểm thử ở trên chỉ

có thể kiểm tra việc thực thi của lớp LuhnAlgorithm theo một nhánh đi cụ thể. Thực
thi cả 3 ph ơng thức kiểm thử ở trên ta sẽ kiểm tra đ

c tất cả các tr ờng h p thực

thi của lớp LuhnAlgorithm. Với một ch ơng trình có nhiều đ ờng đi thì ta cần viết
các UT khác nhau để kiểm tra sự thực thi của ch ơng trình theo các đ ờng đi đó.
Tuy nhiên, với những ch ơng trình có nhiều đ ờng đi thực thi khác nhau thì việc
viết các UT nh thế đòi hỏi nhiều thời gian và công sức để tính các giá trị đầu vào
thích h p và khó có thể kiểm tra hết đ
các đ ờng đi.

c sự thực thi của ch ơng trình theo tất cả


9

Chương 2. JAVA PATHFINDER VÀ THỰC THI TƯỢNG TRƯNG
2.1. Java pathfinder
2.1.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
[12]. 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.
Hình 2.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.


10

2.1.2. Khả năng kiểm tra của JPF
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.
Hình 2.2. Sơ đồ trạng thái trong quá trình kiểm thử
import java.util.Random;
public class Rand {
public static void main (String[] args) {
Random random = new Random(42);

//


(1)
int

a

=

random.nextInt(2);

// (2)
System.out.println("a=" + a);

int b = random.nextInt(3);

//

(3)
System.out.println("

b=" + b);

int c = a/(b+a -2);

//

(4)
System.out.println("
}
}


c=" + c);


11

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 khoảng t ơng ứng là [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 2.2
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 đ
hiện đ

c 1 trong 6 kết quả trên, do vậy khả năng lớn là không phát

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.


12

2.1.3. Kiến trúc mức cao của JPF
Hình 2.3. Kiến trúc JPF mức cao


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
Search cũng cấu hình và đánh giá các đối t

ng JVM.

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


×