CÁC KỸ THUẬT SINH TỰ ĐỘNG DỮ LIỆU
KIỂM THỬ DỰA TRÊN CÁC BIỂU ĐỒ UML
VŨ THỊ ĐÀO
Tháng 04 năm 2018
LỜI CẢM ƠN
Luận án được thực hiện tại Trường Đại học Công nghệ, Đại học Quốc gia
Hà Nội, dưới sự hướng dẫn của PGS.TS. Nguyễn Việt Hà.
Tôi xin gửi lời cảm ơn chân thành và sâu sắc nhất tới PGS.TS. Nguyễn
Việt Hà – Bộ môn Công nghệ phần mềm, Khoa Công nghệ thông tin, Trường
Đại học Công nghệ. Người thầy tâm huyết đã tận tình hướng dẫn, động viên
khích lệ, dành nhiều thời gian quí báu để định hướng cho tôi trong quá trình
tham gia khóa học và hoàn thiện luận án.
Tôi xin gửi lời cảm ơn chân thành tới lãnh đạo trường Đại học Công nghệ,
lãnh đạo Khoa Công nghệ thông tin, cảm ơn các đồng nghiệp đã tạo điều kiện
thuận lợi cho tôi trong quá trình làm luận án.
Tôi xin gửi lời cảm ơn chân thành tới các thầy, cô trong Bộ môn Công
nghệ phần mềm, Khoa Công nghệ thông tin, Trường Đại học Công nghệ, những
người luôn hướng dẫn, định hướng, góp ý cho tôi trong quá trình viết luận án.
Cuối cùng, tôi xin gửi lời cảm ơn sâu sắc tới gia đình và bạn bè, những
người đã luôn ủng hộ và hỗ trợ tôi về mọi mặt để tôi yên tâm học tập, nghiên
cứu, và hoàn thành luận án.
i
LỜI CAM ĐOAN
Tôi xin cam đoan: Bản luận án tốt nghiệp này là công trình nghiên cứu
thực sự của cá nhân. Các kết quả được viết chung với các tác giả khác đều được
sự đồng ý của các đồng tác giả trước khi đưa vào luận án. Các kết quả nêu trong
luận án là trung thực và chưa từng được công bố dưới bất cứ hình thức nào
trước khi trình, bảo vệ và công nhận bởi “Hội Đồng đánh giá luận án tốt nghiệp
Tiến sĩ Công nghệ Thông Tin”.
Một lần nữa, tôi xin khẳng định về sự trung thực của lời cam kết trên.
Tác giả:
ii
MỤC LỤC
LỜI CẢM ƠN
i
LỜI CAM ĐOAN
ii
MỤC LỤC
iii
DANH MỤC CÁC THUẬT NGỮ VÀ KÝ HIỆU
vii
DANH MỤC CÁC BẢNG
ix
DANH MỤC CÁC HÌNH VẼ
xi
TÓM TẮT LUẬN ÁN
Chương 1
xiii
GIỚI THIỆU
1
1.1
Đặt vấn đề . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Phương pháp và nội dung nghiên cứu . . . . . . . . . . . . . . . .
4
1.3
Cấu trúc luận án . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
Chương 2
KIẾN THỨC NỀN TẢNG
7
2.1
Các khái niệm cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2
Kiểm thử dựa trên mô hình . . . . . . . . . . . . . . . . . . . . . .
8
2.3
Các biểu đồ UML và ràng buộc OCL . . . . . . . . . . . . . . . . . 12
2.3.1
Biểu đồ tuần tự UML và các toán tử . . . . . . . . . . . . . 12
2.3.2
Các ràng buộc OCL trong các biểu đồ UML . . . . . . . . 17
2.3.3
Đồ thị dòng điều khiển . . . . . . . . . . . . . . . . . . . . . 18
iii
2.4
2.5
Các độ bao phủ và độ phân tích đột biến trong kiểm thử . . . . . 20
2.4.1
Độ bao phủ tương tranh . . . . . . . . . . . . . . . . . . . . 20
2.4.2
Độ bao phủ trong kiểm thử vòng lặp . . . . . . . . . . . . . 21
2.4.3
Độ phân tích đột biến . . . . . . . . . . . . . . . . . . . . . 22
Tổng quan về sinh dữ liệu kiểm thử tự động . . . . . . . . . . . . . 23
2.5.1
Sinh dữ liệu kiểm thử trong kiểm thử cấu trúc . . . . . . . 24
2.5.2
Sinh dữ liệu kiểm thử trong kiểm thử chức năng . . . . . . 28
2.5.3
Sinh dữ liệu kiểm thử tự động từ các biểu đồ UML . . . . 30
2.6
Các công cụ sinh dữ liệu kiểm thử hiện tại . . . . . . . . . . . . . 31
2.7
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Chương 3 SINH DỮ LIỆU KIỂM THỬ CHO KIỂU DỮ LIỆU
SỐ VÀ CẤU TRÚC ĐỘNG
35
3.1
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2
Những nghiên cứu liên quan . . . . . . . . . . . . . . . . . . . . . . 37
3.3
Phương pháp sinh dữ liệu kiểm thử cho biến kiểu dữ liệu số và
cấu trúc động . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.4
3.5
3.3.1
Tổng quan về phương pháp đề xuất . . . . . . . . . . . . . 40
3.3.2
Chuyển đổi biểu đồ tuần tự UML thành CFG . . . . . . . 41
3.3.3
Sinh các kịch bản kiểm thử . . . . . . . . . . . . . . . . . . 57
3.3.4
Chọn các vị từ và chuyển thành các hàm vị từ . . . . . . . 60
3.3.5
Hàm vị từ với các ràng buộc OCL . . . . . . . . . . . . . . 60
3.3.6
Sinh dữ liệu kiểm thử từ các hàm vị từ . . . . . . . . . . . 65
Thực nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.4.1
Công cụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.4.2
Kết quả và đánh giá . . . . . . . . . . . . . . . . . . . . . . 79
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Chương 4
SINH DỮ LIỆU KIỂM THỬ CHO VÒNG LẶP VÀ
iv
CÁC ỨNG DỤNG TƯƠNG TRANH
87
4.1
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2
Những nghiên cứu liên quan . . . . . . . . . . . . . . . . . . . . . . 88
4.3
Phương pháp sinh dữ liệu kiểm thử theo các độ bao phủ tương
tranh và lặp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.4
4.5
4.3.1
Tổng quan về phương pháp đề xuất . . . . . . . . . . . . . 92
4.3.2
Sinh các kịch bản kiểm thử . . . . . . . . . . . . . . . . . . 93
4.3.3
Sinh dữ liệu kiểm thử . . . . . . . . . . . . . . . . . . . . . 98
Thực nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.4.1
Công cụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.4.2
Kết quả và đánh giá . . . . . . . . . . . . . . . . . . . . . . 110
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Chương 5 SINH DỮ LIỆU KIỂM THỬ CHO KIỂU DỮ LIỆU
CHUỖI
115
5.1
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.2
Những nghiên cứu liên quan . . . . . . . . . . . . . . . . . . . . . . 117
5.3
Phương pháp sinh tự động dữ liệu kiểm thử cho các ràng buộc
chuỗi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.4
5.5
5.3.1
Tổng quan về phương pháp đề xuất . . . . . . . . . . . . . 119
5.3.2
Sinh các kịch bản kiểm thử . . . . . . . . . . . . . . . . . . 120
5.3.3
Giải các ràng buộc chuỗi . . . . . . . . . . . . . . . . . . . . 122
Thực nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.4.1
Công cụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
5.4.2
Kết quả và đánh giá . . . . . . . . . . . . . . . . . . . . . . 139
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Chương 6
6.1
KẾT LUẬN
144
Các kết quả đạt được của luận án . . . . . . . . . . . . . . . . . . . 144
v
6.2
Hướng nghiên cứu tiếp theo . . . . . . . . . . . . . . . . . . . . . . 146
DANH MỤC CÁC CÔNG TRÌNH KHOA HỌC CỦA TÁC GIẢ
LIÊN QUAN ĐẾN LUẬN ÁN
148
TÀI LIỆU THAM KHẢO
149
vi
DANH MỤC CÁC THUẬT NGỮ VÀ KÝ HIỆU
Tên thuật ngữ đầy đủ
Chữ viết tắt Giải nghĩa
Breadth-first search
BFS
Thuật toán tìm kiếm theo chiều
rộng
Black box testing
Control Flow Graph
Kiểm thử hộp đen
CFG
Đồ thị dòng điều khiển
Constraint solver
Bộ giải ràng buộc
Coverage criteria
Tiêu chuẩn bao phủ
Dynamic Domain Reduction
DDR
Deadlock
Depth-first search
Phương pháp giảm miền động
Khóa chết
DFS
Thuật toán tìm kiếm theo chiều
sâu
Extended Finite State Machine EFSM
Máy hữu hạn trang thái mở rộng
Finite State Machine
Máy hữu hạn trạng thái
FSM
Gray box testing
Kiểm thử hộp xám
Invariant
Bất biến
Linear Temporal Logic
LTL
Logic thời gian tuyến tính
Message
Thông điệp
Model Checking
Kiểm chứng mô hình
Mutation Score
MS
Độ đo đột biến
Object Constraint Language
OCL
Ngôn ngữ ràng buộc đối tượng
Parallel Fragment
Par
Toán tử song song
Post–condition
Hậu điều kiện
Pre–condition
Tiền điều kiện
Predicate
Vị từ
Safety property
Thuộc tính an toàn
Satisfiable
SAT
Thỏa mãn
Symbolic execution
SE
Thực thi tượng trưng
Weak Sequencing Fragment
Seq
Toán tử tuần tự yếu
vii
Tên thuật ngữ đầy đủ
Chữ viết tắt Giải nghĩa
Satisfiability Modulo Theories
SMT
Các lý thuyết môđun về tính
thỏa được
System Under Testing
SUT
Hệ thống được kiểm thử
Test Case
Ca kiểm thử
Test Data
Dữ liệu kiểm thử
Test Scenario
Kịch bản kiểm thử
Test Script
Mã kiểm thử dạng đặc tả kịch
bản dùng để tự động hóa
Unified Modeling Language
UML
Ngôn ngữ mô hình hóa thống
nhất
Unsatisfiable
UNSAT
Không thỏa mãn
Variable Assignment Graph
VAG
Đồ thị tham số biến
White box testing
eXtensible Markup Language
Kiểm thử hộp trắng
XML
Z3-Str solver
Ngôn ngữ đánh dấu mở rộng
Bộ giải Z3-Str
viii
DANH MỤC CÁC BẢNG
2.1
Các biểu đồ UML và sử dụng để mô hình hóa cho kiểm thử [100]
30
3.1
Bảng giá trị chân lý cho các toán tử logic [3] . . . . . . . . . . . . 61
3.2
Hàm vị từ cho các toán tử logic trong OCL [3] . . . . . . . . . . . 62
3.3
Hàm vị từ cho các toán tử quan hệ OCL cho kiểu dữ liệu số [3] . 64
3.4
Các kịch bản kiểm thử được sinh ra của máy bán hàng tự động . 70
3.5
So sánh kết quả đề xuất và kết quả nghiên cứu trong [72] . . . . . 81
3.6
Thực nghiệm đưa ra độ bao phủ các đường dẫn của đồ thị của
phương pháp đưa ra và phương pháp kiểm thử ngẫu nhiên . . . . 82
3.7
Kết quả thực nghiệm so sánh phương pháp đề xuất với phương
pháp [30] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.1
Kết quả MS sử dụng cho từng kịch bản kiểm thử được sinh ra
trong cách tiếp cận [95] và Phương pháp đề xuất . . . . . . . . . . 111
4.2
Kết quả MS của phương pháp đề xuất và phương pháp ngẫu nhiên112
5.1
Ví dụ giải các toán tử chuỗi . . . . . . . . . . . . . . . . . . . . . . 125
5.2
Cách Z3–str thực hiện xử lý các ràng buộc chuỗi trong Bảng 5.1 . 125
5.3
Ngữ pháp của các ràng buộc trong Z3–str, mở rộng cho search và
replaceAll so với [114] . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.4
Định nghĩa cho Thuật toán 5.2 [114] . . . . . . . . . . . . . . . . . 129
5.5
Các quy tắc giảm [114] . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.6
Quy tắc giảm sử dụng gọi đệ quy . . . . . . . . . . . . . . . . . . . 133
5.7
Các quy tắc tiền xử lý cho các toán tử chuỗi . . . . . . . . . . . . 135
5.8
So sánh khả năng tìm lỗi của các chức năng trong các ứng dụng . 140
ix
5.9
So sánh xử lý các toán tử chuỗi và hiệu năng của SeqString với
phương pháp của nhóm Tác giả Shoichiro [39] . . . . . . . . . . . . 141
x
DANH MỤC CÁC HÌNH VẼ
1.1
Các nội dung luận án giải quyết trong bài toán kiểm thử dựa trên
mô hình. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1
Quy trình kiểm thử dựa trên mô hình [100]. . . . . . . . . . . . . .
9
2.2
Ví dụ biểu đồ tuần tự UML có toán tử alt và opt. . . . . . . . . . 14
2.3
Ví dụ biểu đồ tuần tự UML có toán tử loop và break. . . . . . . . 14
2.4
Ví dụ biểu đồ tuần tự UML có toán tử par và seq. . . . . . . . . . 15
2.5
Ví dụ biểu đồ tuần tự UML có toán tử strict và critical. . . . . . . 16
2.6
Ví dụ biểu đồ tuần tự UML có toán tử ignore và consider. . . . . 16
2.7
Ví dụ biểu đồ tuần tự UML có toán tử negative và assert. . . . . 17
2.8
Ví dụ biểu đồ lớp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.9
Các loại nút của đồ thị dòng điều khiển . . . . . . . . . . . . . . . 19
2.10 Các hướng tiếp cận của sinh dữ liệu kiểm thử tự động [99]. . . . . 24
2.11 Phân loại các công cụ sinh kiểm thử tự động [40]. . . . . . . . . . 32
3.1
Sinh ca kiểm thử sử dụng kiểm chứng mô hình theo cách tiếp
cận [17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2
Các bước cơ bản sinh các dữ liệu kiểm thử. . . . . . . . . . . . . . 41
3.3
Ví dụ biểu đồ tuần tự UML. . . . . . . . . . . . . . . . . . . . . . . 43
3.4
File xmi sau khi chuẩn hóa mô tả dữ liệu của biểu đồ tuần tự
trong Hình 3.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5
Chuyển từ biểu đồ tuần tự sang CFG (của toán tử opt và alt). . . 48
3.6
Chuyển từ biểu đồ tuần tự sang CFG (của toán tử break và loop). 50
3.7
Chuyển từ biểu đồ tuần tự sang CFG (của toán tử par và seq). . 51
3.8
Chuyển từ biểu đồ tuần tự sang CFG (của toán tử strict và critical). 53
xi
3.9
Chuyển từ biểu đồ tuần tự sang CFG (của toán tử ignore và
consider). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.10 Chuyển từ biểu đồ tuần tự sang CFG (của toán tử assert và
negative). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.11 Biểu đồ tuần tự của máy bán hàng tự động. . . . . . . . . . . . . . 71
3.12 Biểu đồ lớp của chức năng máy bán hàng tự động. . . . . . . . . . 71
3.13 Đồ thị dòng điều khiển của máy bán hàng tự động. . . . . . . . . 72
3.14 Biểu đồ tuần tự với kiểu dữ liệu biến là cấu trúc động. . . . . . . 76
3.15 Đồ thị dòng điều khiển với kiểu dữ liệu biến là cấu trúc động. . . 76
3.16 Đường dẫn con P1 thực thi. . . . . . . . . . . . . . . . . . . . . . . 77
3.17 Đường dẫn con P2 thực thi. . . . . . . . . . . . . . . . . . . . . . . 78
3.18 Đường dẫn con P3 thực thi. . . . . . . . . . . . . . . . . . . . . . . 78
3.19 Kiến trúc thực thi của SequenceTesting. . . . . . . . . . . . . . . . 80
4.1
Toán tử lặp chuyển sang CFG. . . . . . . . . . . . . . . . . . . . . 91
4.2
Toán tử song song chuyển sang CFG. . . . . . . . . . . . . . . . . . 92
4.3
Quá trình sinh dữ liệu kiểm thử: phát triển từ [75] cho vòng lặp. . 100
4.4
Tính điểm chia split phụ thuộc các miền giá trị của biến trong [75].102
4.5
Biểu đồ tuần tự của chức năng chuyển tiền trong hệ thống ngân
hàng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
4.6
Biểu đồ lớp và ràng buộc OCL cho chức năng chuyển tiền. . . . . 108
4.7
Đồ thị dòng điều khiển của chức năng chuyển tiền. . . . . . . . . . 108
4.8
Kiến trúc phát triển của công cụ SequenceConcur. . . . . . . . . . 110
5.1
Kiến trúc của Bộ giải Z3–str trong [114]. . . . . . . . . . . . . . . . 124
5.2
Biểu đồ tuần tự cho chức năng kiểm tra thông tin của một ứng
dụng web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3
CFG của chức năng kiểm tra thông tin ứng dụng web. . . . . . . . 138
5.4
Kiến trúc của SeqString. . . . . . . . . . . . . . . . . . . . . . . . . 139
xii
TÓM TẮT LUẬN ÁN
Luận án nghiên cứu một số giải pháp hỗ trợ sinh dữ liệu kiểm thử tự động
từ các biểu đồ UML 2.0. Cụ thể, luận án tập trung giải quyết ở giai đoạn thiết
kế kiểm thử: sinh các kịch bản kiểm thử và sinh dữ liệu kiểm thử từ biểu đồ
tuần tự và các ràng buộc trong biểu đồ lớp. Mục tiêu của phương pháp nghiên
cứu là sinh dữ liệu kiểm thử có độ bao phủ tốt hơn, có khả năng tìm được nhiều
lỗi trong các hệ thống phần mềm. Vì vậy, luận án tập trung vào việc giải quyết
các đặc trưng, các toán tử của biểu đồ tuần tự UML 2.0; tránh bùng nổ số lượng
kịch bản kiểm thử sinh ra, các vòng lặp, các trường hợp khóa chết (deadlock)
và đồng bộ trong các ứng dụng tương tranh; giải các ràng buộc với các kiểu dữ
liệu khác nhau. Luận án đã đạt được các kết quả chính như sau:
Thứ nhất, luận án đề xuất một quy trình sinh các dữ liệu kiểm thử từ biểu
đồ tuần tự UML 2.0 và các ràng buộc OCL trong biểu đồ lớp. Biểu đồ tuần tự
UML 2.0 áp dụng cho tất cả mười hai toán tử, có cấu trúc phức tạp, các khối
lồng ghép. Phương pháp áp dụng cho các ràng buộc với biến là kiểu dữ liệu số
và cấu trúc động.
Thứ hai, luận án đề xuất một phương pháp sinh dữ liệu kiểm thử tự động
từ các biểu đồ tuần tự UML 2.0 và biểu đồ lớp trong trường hợp của bao phủ
vòng lặp và các ứng dụng tương tranh.
Thứ ba, luận án đưa ra một phương pháp cải tiến việc sinh dữ liệu kiểm
thử tự động từ các biểu đồ tuần tự UML 2.0 và biểu đồ lớp với việc giải quyết
các ràng buộc chuỗi.
Trong các phương pháp đề xuất, luận án đều xây dựng công cụ để cài đặt
và thực nghiệm trên đó. Với mỗi thực nghiệm các dữ liệu kiểm thử và kịch bản
kiểm thử sinh ra được so sánh về độ bao phủ, khả năng tìm lỗi so với các phương
pháp hiện tại. Kết quả cho thấy tính hiệu quả và độ tin cậy của phương pháp
về mặt thực nghiệm. Những đề xuất đó giải quyết một phần trong hướng tiếp
cận lớn về kiểm thử dựa trên mô hình (cụ thể là các biểu đồ UML).
xiii
Chương 1
GIỚI THIỆU
1.1
Đặt vấn đề
Trong quá trình phát triển phần mềm, kiểm thử là giai đoạn quan trọng
và thực sự cần thiết để tạo ra một hệ thống phần mềm có chất lượng cao [9, 67].
Trong thực tế hơn 50% nỗ lực phát triển dành cho giai đoạn kiểm thử [6] và rất
hiếm các sản phẩm phần mềm được sản xuất ra mà không có lỗi. Các công ty
phần mềm cũng như các tổ chức phát triển phần mềm hướng tới giải pháp tự
động hóa quá trình kiểm thử. Một minh chứng thực tế là ngày càng có nhiều
các công cụ kiểm thử tự động đưa ra và được áp dụng trong thực tế. Tuy nhiên,
đa số quá trình thực hiện đều tập trung vào việc thực thi kiểm thử tự động mà
không quan tâm nhiều đến việc thiết kế chúng. Hơn nữa, việc phát hiện lỗi phần
mềm chủ yếu là do chất lượng của các kịch bản và dữ liệu kiểm thử được thiết
kế. Các dữ liệu kiểm thử có độ bao phủ càng lớn thì độ tin cậy của tập dữ liệu
kiểm thử càng cao [24], có thể tìm được nhiều lỗi của hệ thống và giúp kiểm soát
và quản lý quá trình kiểm thử tốt hơn. Như vậy, quá trình sinh các dữ liệu kiểm
thử tự động trở nên thực sự cần thiết, nhất là đối với những phần mềm lớn và
phức tạp. Quá trình này làm giảm giá thành phát triển phần mềm, tiết kiệm
thời gian, công sức, nâng cao chất lượng và tăng độ tin cậy của phần mềm [41].
Trong các hướng tiếp cận sinh tự động dữ liệu kiểm thử hiện nay thường
được thực hiện từ mã nguồn chương trình, các mô hình hoặc các đặc tả [12, 100].
Có nhiều hướng nghiên cứu phát triển được đưa ra thực hiện từ mã nguồn chương
trình trong [8, 34, 54, 75, 91, 110]. Tuy nhiên, việc sinh tự động dữ liệu kiểm
thử này được thực hiện ở giai đoạn sau khi có mã nguồn và số kịch bản kiểm
thử được sinh ra rất lớn. Hơn nữa, có rất nhiều ngôn ngữ lập trình khác nhau
nên phương pháp sinh dữ liệu kiểm thử thường phụ thuộc nhiều vào công nghệ
1
phân tích mã nguồn. Hướng thứ hai là sử dụng các mô hình [16, 72, 97, 24]
hoặc các đặc tả [102, 64, 57] để thiết kế tự động các dữ liệu kiểm thử có thể
xuất phát từ máy hữu hạn trạng thái (Finite State Machine – FSM), các biểu
đồ UML (Unified Modeling Language) hoặc các đặc tả bằng các ngôn ngữ hình
thức khác nhau (chẳng hạn Z, B, v.v.). Việc áp dụng các đặc tả hình thức trong
thực tiễn là khó thực hiện và tốn thời gian. Hơn nữa, khi sử dụng phương pháp
này đòi hỏi trình độ của các chuyên gia hiểu về đặc tả hình thức. Vì vậy, tác
giả chọn hướng nghiên cứu từ các biểu đồ UML vì các biểu đồ UML được sử
dụng phổ biến trong thực tiễn của các công ty phát triển phần mềm. Việc sử
dụng các biểu đồ UML có thể kết hợp với ngôn ngữ ràng buộc đối tượng (Object
Contraint Language – OCL) để biểu diễn các đặc tả ràng buộc mà nhiều khi
biểu đồ không biểu diễn hết được. Hơn nữa, việc thiết kế các dữ liệu kiểm thử
từ các biểu đồ này có thể thực hiện ở giai đoạn đầu của quá trình phát triển,
không nhất thiết là phải đợi khi đã có mã nguồn chương trình.
Kiểm thử từ các biểu đồ UML cũng như việc kiểm thử thông thường được
thực hiện qua các bước: sinh các kịch bản kiểm thử, sinh dữ liệu kiểm thử và
thực thi các đoạn mã kiểm thử. Vì việc thực thi các đoạn mã kiểm thử tự động
có nhiều công cụ hỗ trợ và phụ thuộc vào công nghệ, môi trường ngôn ngữ sử
dụng. Hơn nữa, vấn đề phát hiện lỗi trong các dự án phần mềm thì chủ yếu phụ
thuộc vào các kịch bản và dữ liệu kiểm thử được thiết kế. Do đó, tác giả chọn
hướng tập trung nghiên cứu vào các phương pháp sinh dữ liệu kiểm thử. Các
hướng nghiên cứu việc sinh dữ liệu kiểm thử từ các biểu đồ UML phụ thuộc
vào loại biểu đồ được sử dụng. Tùy vào mục đích kiểm thử, mức độ kiểm thử sẽ
chọn biểu đồ phù hợp với yêu cầu đưa ra. Tác giả Bader và các đồng sự trong [5]
đưa ra một phương pháp cho việc sinh các dữ liệu kiểm thử từ biểu đồ trạng
thái. Tuy nhiên, nghiên cứu này cho rằng biểu đồ trạng thái có ý nghĩa với kiểm
thử đơn vị, số lượng kịch bản kiểm thử sinh ra lớn và rất dễ bùng nổ các kịch
bản kiểm thử. Trong khi đó các dữ liệu kiểm thử và kịch bản kiểm thử sinh từ
các biểu đồ tuần tự có ý nghĩa cho kiểm thử tích hợp [33] và số lượng kịch bản
kiểm thử sinh ra ít hơn khi so sánh với biểu đồ trạng thái [2]. Hơn nữa, biểu đồ
tuần tự là biểu đồ chi tiết và giàu hành vi trong các biểu đồ UML. Vì vậy, các
nhà nghiên cứu quan tâm đến việc sử dụng các biểu đồ tuần tự để sinh các dữ
liệu kiểm thử và các kịch bản kiểm thử. Trong hướng nghiên cứu đó, với việc
giải quyết các toán tử của biểu đồ tuần tự thì phương pháp trong [72] sinh dữ
2
liệu kiểm thử từ biểu đồ tuần tự UML giải quyết với năm loại toán tử: alt, opt,
break, parallel, loop và thuật toán sinh dữ liệu kiểm thử chủ yếu giải quyết với
kiểu dữ liệu số. Trong một vài hướng tiếp cận khác như [97, 84, 65], các phương
pháp kỹ thuật hàm nhỏ nhất trong việc sinh dữ liệu kiểm thử tự động cũng chỉ
áp dụng với kiểu dữ liệu số. Như vậy, việc sinh dữ liệu kiểm thử từ các biểu đồ
UML đối với các ràng buộc mà biến có các kiểu dữ liệu khác nhau như: kiểu dữ
liệu chuỗi, cấu trúc động và trong các trường hợp của vòng lặp chưa được đưa
ra hoặc chưa có lời giải thỏa đáng.
Trong việc giải quyết bài toán sinh dữ liệu kiểm thử tự động từ các biểu
đồ UML thì việc bùng nổ số kịch bản kiểm thử, các trường hợp khóa chết, đồng
bộ trong các luồng song song của hệ thống cũng là vấn đề gặp phải nhiều khó
khăn và thách thức. Nhóm tác giả Sun và các đồng sự trong [93] đưa ra cách
tiếp cận dựa trên việc chuyển đổi để sinh ra các dữ liệu kiểm thử hướng kịch bản
từ biểu đồ hoạt động UML. Cách tiếp cận này dựa trên các quy tắc chuyển đổi
để chuyển về cây nhị phân, sau đó dựa vào các thuật toán tìm kiếm trên cây nhị
phân này để sinh các kịch bản kiểm thử. Công cụ cài đặt sử dụng phương pháp
sinh dữ liệu kiểm thử ngẫu nhiên, chưa xét độ bao phủ của các dữ liệu kiểm thử
sinh ra; các trường hợp khóa chết và vấn đề bùng nổ các kịch bản kiểm thử chưa
được giải quyết. Hướng tiếp cận trong [58, 89] đưa ra phương pháp sinh các kịch
bản kiểm thử từ biểu đồ tuần tự và biểu đồ hoạt động trong các trường hợp
tương tranh. Các dữ liệu kiểm thử sinh ra theo phương pháp này biểu diễn tính
tương tranh và có thể bao phủ các lỗi đồng bộ, khóa chết. Tuy nhiên, phương
pháp đó chưa đưa ra các tiêu chuẩn bao phủ tương tranh khác nhau trong các
ứng dụng, việc cài đặt thực thi tính hiệu quả cũng chưa được triển khai.
Như vậy, các vấn đề mà luận án sẽ tập trung giải quyết cụ thể như sau:
Sinh dữ liệu kiểm thử từ các biểu đồ tuần tự UML 2.0 và các ràng buộc
OCL trong biểu đồ lớp nhằm giải quyết cho tất cả mười hai toán tử, có
cấu trúc lồng ghép nhau; Các ràng buộc với các biến là các biến kiểu dữ
liệu số và cấu trúc động.
Sinh tự động dữ liệu kiểm thử từ các biểu đồ tuần tự UML 2.0 và các ràng
buộc trong biểu đồ lớp trong các ứng dụng tương tranh và với các độ bao
phủ khác nhau của vòng lặp.
3
Sinh tự động dữ liệu kiểm thử từ các biểu đồ tuần tự UML 2.0 và các ràng
buộc trong biểu đồ lớp với việc giải quyết các ràng buộc chuỗi.
1.2
Phương pháp và nội dung nghiên cứu
Để thực hiện các nội dung nghiên cứu trong luận án, tác giả tiến hành theo
phương pháp tiếp cận từ trên xuống, phân loại và hệ thống hóa lý thuyết các
phương pháp về sinh dữ liệu kiểm thử tự động từ mô hình, từ đó phân tích,
phân loại và tổng hợp các phương pháp đó. Theo cách phân loại đưa ra, tác
giả đi sâu phân tích mỗi đặc điểm và ưu nhược điểm của từng loại. Từ phương
pháp phân tích và tổng hợp trên của kiểm thử dựa trên mô hình, tác giả chọn
đối tượng nghiên cứu trong luận án là từ các biểu đồ tuần tự UML 2.0 và biểu
đồ lớp. Từ đó với mỗi đặc trưng của từng loại biểu đồ, tác giả nghiên cứu liên
quan để đề xuất cải tiến hoặc đưa ra phương pháp mới về sinh dữ liệu kiểm thử.
Trong phạm vi của luận án, tác giả tập trung nghiên cứu chủ yếu về các
phương pháp tự động trong giai đoạn thiết kế kiểm thử theo quy trình phát
triển phần mềm. Mục tiêu của luận án nhằm nghiên cứu, cải tiến, đề xuất và
triển khai một số phương pháp sinh tự động các dữ liệu kiểm thử từ các biểu đồ
UML trong giai đoạn thiết kế kiểm thử để giải quyết bài toán trên. Tuy nhiên,
để đo tính hiệu quả, khả năng tìm lỗi của các dữ liệu kiểm thử sinh ra thì một
vài tiêu chuẩn bao phủ và độ đo phù hợp với mục đích so sánh các dữ liệu kiểm
thử được sinh ra với các phương pháp hiện tại. Theo đó, luận án thực hiện các
nội dung cụ thể như sau:
Tổng hợp, hệ thống hóa các nghiên cứu liên quan và bài toán tổng quan về
các vấn đề sinh dữ liệu kiểm thử tự động, kiểm thử từ các biểu đồ UML.
Nghiên cứu bài toán sinh dữ liệu kiểm thử tự động từ biểu đồ tuần tự UML
và biểu đồ lớp với việc giải quyết các toán tử, các đặc trưng của biểu đồ
UML đó. Nghiên cứu các phương pháp trong giai đoạn thiết kế kiểm thử
để các kịch bản kiểm thử được sinh ra đạt được số lượng nhỏ nhất và độ
bao phủ cao nhất, tránh bùng nổ số lượng kịch bản kiểm thử và xem xét
các trường hợp có hoặc không có sự chia sẻ dữ liệu trong các luồng song
song của biểu đồ tuần tự.
4
Nghiên cứu trong các hệ các ràng buộc từ các biểu đồ UML, xét phương
pháp sinh và thực thi dữ liệu kiểm thử với biến có kiểu dữ liệu số, cấu trúc
dữ liệu động, các ràng buộc chuỗi và kiểm thử với vòng lặp.
Thực nghiệm, triển khai trong các phương pháp cải tiến, đề xuất với các
biểu đồ tuần tự và các biểu đồ lớp. Xem xét áp dụng về các tiêu chuẩn bao
phủ khác nhau phù hợp với từng loại biểu đồ UML và đo khả năng tìm lỗi
của các dữ liệu kiểm thử được sinh ra.
Giҧi quyӃt các ÿһc
trѭng, các toán tӱ cӫa
biӇu ÿӗ UML ÿã chӑn
Các yêu cҫu
mô hình hóa
Các dӳ liӋu kiӇm
thӱ, ca kiӇm thӱ
Các biӇu ÿӗ UML
Bӝ sinh ÿҫu ra
mong muӕn
Ĉánh giá và QuyӃt ÿӏnh:
- Tҥo thêm ca kiӇm thӱ
- ChӍnh sӱa mô hình
- Ĉánh giá ÿӝ tin cұy và các
ÿӝ ÿo chҩt lѭӧng kiӇm thӱ
Giҧi quyӃt vӟi các kiӇu dӳ liӋu sӕ,
có cҩu trúc ÿӝng, các ràng buӝc
chuӛi và kiӇm thӱ vòng lһp
Phân tích kӃt quҧ
Giҧm sӕ lѭӧng và tăng ÿӝ bao phӫ cӫa kӏch
bҧn kiӇm thӱ, Tránh bùng nә sӕ lѭӧng trong
các luӗng song song, khóa chӃt, ÿӗng bӝ
Báo cáo kiӇm thӱ
Lҩy kӃt quҧ kiӇm thӱ
Sҧn phҭm cҫn
kiӇm thӱ
Hình 1.1: Các nội dung luận án giải quyết trong bài toán kiểm thử dựa trên mô hình.
Các nội dung mà luận án đưa ra trên tập trung giải quyết một số phương pháp
sinh tự động các kịch bản kiểm thử và sinh dữ liệu kiểm thử . Trong Hình 1.1
mô tả quy trình của bài toán kiểm thử dựa trên mô hình, các vấn đề luận án
tập trung giải quyết là các hình chữ nhật góc tròn nét đứt. Các vấn đề trong
các hướng nghiên cứu đưa ra phương pháp giải quyết các toán tử của biểu đồ
UML 2.0 chuyển thành một biểu diễn trung gian là đầu vào cho việc sinh các
kịch bản kiểm thử. Phương pháp sinh các kịch bản kiểm thử để tránh bùng nổ
số lượng kịch bản và tăng độ bao phủ của chúng, có mối liên hệ với các phương
pháp giải quyết ràng buộc để sinh dữ liệu kiểm thử trong từng kịch bản trên.
5
Các nghiên cứu đó góp phần giải quyết hoàn chỉnh bài toán trong giai đoạn thiết
kế kiểm thử từ các biểu đồ UML.
1.3
Cấu trúc luận án
Phần còn lại của luận án được cấu trúc thành năm chương chính. Trong
đó, Chương 2 giới thiệu kiến thức nền tảng về các vấn đề nghiên cứu trong luận
án. Đây là cơ sở lý thuyết cho việc xây dựng các phương pháp sinh tự động dữ
liệu kiểm thử từ các biểu đồ UML trong các chương từ Chương 3 đến Chương 5.
Theo cách tiếp cận của việc sinh tự động dữ liệu kiểm thử từ các biểu đồ tuần
tự UML và biểu đồ lớp, tác giả tập trung đưa ra đánh giá phân tích các hướng
nghiên cứu liên quan; nêu ra một số vấn đề còn tồn tại mà luận án sẽ tập trung
giải quyết. Cụ thể, Chương 3 trình bày nội dung kết quả nghiên cứu về phương
pháp sinh tự động dữ liệu kiểm thử giải quyết cho tất cả mười hai toán tử trong
biểu đồ tuần tự UML 2.0 và kiểu dữ liệu số và cấu trúc động. Tiếp theo, phương
pháp đề xuất cho việc sinh tự động dữ liệu kiểm thử với trường hợp kiểm thử
vòng lặp và các ứng dụng tương tranh được đưa ra trong Chương 4 nhằm giải
quyết vấn đề bùng nổ số kịch bản kiểm thử sinh ra, trường hợp khóa chết và
đồng bộ. Chương 5 trình bày nội dung kết quả nghiên cứu về phương pháp sinh
tự động dữ liệu kiểm thử với việc cải tiến khi giải với các ràng buộc chuỗi. Cuối
cùng, tổng kết lại các kết quả đạt được và hướng phát triển tiếp theo của luận
án, được trình bày trong Chương 6.
6
- Xem thêm -