Luận văn đã cải tiến phương pháp và bộ công cụ phục vụ cho quy trình
kiểm thử hồi quy để đảm bảo chất lượng mã nguồn các ứng dụng doanh nghiệp
trên nền tảng và công nghệ Java EE. Các phương pháp được đề xuất bởi [2,5]
tập trung phân tích chủ yếu cho mã nguồn Java. Tuy nhiên với các nền tảng khác
nhau thì mã nguồn Java còn tương tác với các mã nguồn giao diện theo những
cách khác nhau. Trong luận văn này, tác giả đã hoàn thành thêm chức năng cho
bộ công cụ nhằm đáp ứng cho việc phân tích mã nguồn giao diện cho các ứng
dụng sử dụng công nghệ Java Servlet. Bên cạnh đó, công cụ còn hỗ trợ phân loại
kiểm thử hồi quy từ các thành phần thay đổi và ảnh hưởng bao gồm kiểm thử
đơn vị, kiểm thử tích hợp và kiểm thử giao diện. Từ đó, đưa ra cái nhìn khách
quan giữa kiểm thử viên và lập trình viên. Đối với các kiểm thử viên, họ có thể
thực hiện kiểm thử hồi quy dựa trên mã nguồn hoặc đặc tả. Nếu kiểm thử hồi
quy dựa trên đặc tả sẽ chọn ra các ca kiểm thử để thực hiện nếu nó liên quan đến
phần đặc tả bị thay đổi, kỹ thuật này đòi hỏi đặc tả phải được quản lý tốt. Tuy
nhiên, với phương pháp cải tiến mà luận văn đã thực hiện, việc kiểm thử hồi quy
sẽ dựa trên mã nguồn. Kiểm thử viên chỉ cần thực hiện một số ca kiểm thử dựa
trên kết quả phân tích sự ảnh hưởng các thành phần giao diện. Còn đối với lập
trình viên họ có thể sử dụng công cụ để đánh giá được các thay đổi trong mã
nguồn. Một bộ ánh xạ giữa thành phần mã nguồn và các giao diện, chức năng
của ứng dụng được tích hợp, giúp bộ công cụ này thực sự có ích và có thể ứng
dụng vào quá trình đảm bảo chất lượng phần mềm ở các công ty phát triển phần
mềm hiện nay.
Về thực nghiệm, luận văn đã áp dụng công cụ để so sánh hai phiên bản mã
nguồn cho ứng dụng Web quản lý bệnh viện. Kết quả thực nghiệm cho thấy,
công cụ cải tiến tìm được các thành phần ảnh hưởng liên quan đến giao diện ứng
dụng Web mà công cụ trước không tìm thấy. Thêm vào đó là việc phân loại các
thành phần ảnh hưởng và thành phần thay đổi. Từ đó, hỗ trợ kiểm thử hồi quy
một cách hiệu quả. Dựa vào kết quả thực nghiệm, công cụ đã cho chúng ta thấy
được tính khả dụng của công cụ giúp giảm thời gian và chi phí kiểm thử hồi
quy.
Dựa trên những gì đã thực hiện được, trong tương lai sẽ có thêm nhiều phụ
thuộc giao diện cho các nền tảng khác được thêm vào để xử lý giúp bộ phân tích
ảnh hưởng dự đoán tập ảnh hưởng chính xác hơn. Bộ quản lý và so sánh các
phiên bản mã nguồn sẽ được tích hợp với các hệ thống quản lý phiên bản như
SVN, Git và công cụ kiểm thử hồi quy. Bộ công cụ sẽ hỗ trợ cho thêm nhiều55
công nghệ và nền tảng khác của Java, và xa hơn nữa, trong tương lai bộ công cụ
có thể phân tích cho các ngôn ngữ khác.
58 trang |
Chia sẻ: yenxoi77 | Lượt xem: 586 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Phương pháp phân tích sự ảnh hưởng của các thành phần và ứng dụng cho kiểm thử hồi quy trong các dự án Java EE, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
o
người dùng định nghĩa sử dụng mã nguồn XML. Một ví dụ cho mã nguồn cấu
hình Struts 2 cho chức năng hiển thị được mô tả trong Mã nguồn 2.1.
Mã nguồn 2.1. Mã tệp cấu hình Struts 2
<action name=“hienthi” class=“controller.HelloActionSupport”
method=“hienthi”>
/WEB-INF/hienthi.jsp
Hình 2.9 mô tả quy trình phân tích sự phụ thuộc cho Struts 2.
Hình 2.9. Quy trình phân tích sự phụ thuộc cho ứng dụng Struts 2
Quy trình phân tích sự phụ thuộc bắt đầu từ tệp cấu hình trong mã nguồn
Struts 2, các thông tin phụ thuộc giữa các thành phần sẽ được khai thác với phụ
thuộc từ thẻ đến hàm hienthi() của lớp HelloActionSupport và một
phụ thuộc từ thẻ đến tệp JSP hienthi.jsp. Để phân tích sự phụ thuộc
trong ứng dụng sử dụng Struts 2, bao gồm các bước như sau [2]:
19
Bước 1: trình xác nhận sẽ kiểm tra mã nguồn của dự án có sử dụng Struts
2 không, đầu ra là cây cấu trúc tương ứng với tệp cấu hình chính của
Struts 2.
Bước 2: một trình phân tích cú pháp sẽ tìm kiếm tất cả tệp cấu hình được
khai báo trong struts.xml và duyệt tất cả các tệp cấu hình, lưu thông tin
trong Configuration Model chứa thông tin về : Package, Action, Result,
Result Type, Interceptor, Interceptor Stack.
Bước 3: trình phân tích phụ thuộc sẽ đọc thông tin từ Configuration
Model cùng với phân tích cây cấu trúc để xác định phụ thuộc và thêm vào
cây cấu trúc.
2.2.3 Phân tích sự phụ thuộc trong Java Core
Trong mã nguồn Java, có ba loại quan hệ chính giữa các lớp: quan hệ phụ
thuộc, thành phần và kế thừa [2]. Dựa vào các quan hệ này, bộ phân tích phụ
thuộc cho Java Core sẽ phân tích các nút là thành phần Java trên biểu đồ phụ
thuộc Java EE và xác định phụ thuộc Java Core giữa các thành phần.
Quan hệ phụ thuộc: hai lớp gọi là phụ thuộc nếu phương thức của lớp này
sử dụng đối tượng của lớp kia để thực hiện các thao tác. Khi hai lớp phụ thuộc,
những thay đổi ở lớp này sẽ ảnh hưởng đến lớp kia. Ví dụ, Mã nguồn 2.2 gồm
phương thức f sử dụng đối tượng lớp B, C để thực hiện thao tác.
Mã nguồn 2.2. Mã Java thể hiện quan hệ phụ thuộc
public class A {
public void f(B b, C c) { }
public void f(){
B b = new B();
C c = new C();
. }
}
Quan hệ thành phần: một lớp sẽ chứa các thuộc tính là đối tượng của lớp
khác. Ví dụ, lớp A chứa các thuộc tính là đối tượng của lớp B như Mã nguồn
2.3.
Mã nguồn 2.3. Mã Java thể hiện quan hệ thành phần
public class A {
int a;
private B b; // B là một lớp
... }
20
Quan hệ kế thừa: một lớp con kế thừa các thuộc tính public của lớp cha và
có thể thêm một số các thuộc tính riêng. Khi lớp cha thay đổi thì các lớp con kế
thừa nó sẽ bị ảnh hưởng. Ví dụ trong Mã nguồn 2.4, lớp B kế thừa thành phần
public của lớp A và có thêm đặc tính riêng k.
Mã nguồn 2.4. Mã Java thể hiện quan hệ kế thừa
public class A {
int a;
public int f(){...} }
class B extends A{
public void k(){...} }
2.2.4 Phân tích phụ thuộc cho công nghệ kết nối cơ sở dữ liệu JDBC
JDBC (Java Database Connectivity) là một giao diện lập trình ứng dụng
của Java (API) được dùng để kết nối và truy xuất cơ sở dữ liệu. JDBC quản lý
kết nối đến cơ sở dữ liệu, gửi các câu truy vấn từ ứng dụng Java tới cơ sở dữ liệu
và xử lý kết quả sau truy vấn thành các đối tượng của Java. Mã nguồn 2.5 là một
ví dụ về câu truy vấn trong JDBC [2].
Mã nguồn 2.5. Mã nguồn chương trình Sample
public String getTableName(String a){
return “Consumer where name =” +a ; }
public Consumer findConsumer(boolean isOrderId, int order, Session
session) {
List consumers = new ArrayList();
String orderBy = “order by”;
if (order == 0)
orderStr = “”;
else {
if (isOrderId)
orderStr+= “category”;
if (order == -1) orderStr += “desc”; else orderStr + = “asc”;}
consumers = session.createQuery(“Select*
From”+getTableName()+orderBy);
return consumers; }
21
Một vấn đề quan trọng cần giải quyết từ Mã nguồn 2.5 làm thế nào để biết
được câu truy vấn cuối cùng có giá trị gì và có ảnh hưởng đến bảng nào trong cơ
sử dữ liệu. Hiện nay có một vài công cụ đã giải quyết được vấn đề này: JSA,
JDBC Checker, v.v. Trong phần này, một phương pháp dự đoán giá trị câu truy
vấn mã nguồn Java bằng đồ thị chuỗi được trình bày.
Định nghĩa 2.2: Phép toán gộp: Cho hai tập A = {a1 , a2 ,..., an} và B =
{b1, b2 ,...,bm}. Phép toán gộp hai tập A và B, kí hiệu: A ○ B là một tập C thỏa
mãn [2]:
C = {(a + b) | a ∈ A và b ∈ B}
Định nghĩa 2.3: Đồ thị chuỗi: Đồ thị gốc r là nút rỗng, có hướng thể hiện
quá trình thay đổi giá trị của một chuỗi kí tự, kí hiệu G = , V là tập các
đỉnh, E = V × OP × V biểu diễn tập các cạnh của đồ thị với các kiểu cạnh: OP =
{INIT, CONCAT}. Mỗi đỉnh v ∈ V gồm ba giá trị, kí hiệu v = (l, t, c, Rv) [2].
Trong đó:
l ∈ {STRING, VARIABLE, METHOD, APPENDABLE, UNDEFINED}
là nhãn của đỉnh.
t ∈ {UNION, PRODUCT} là kiểu xử lí của đỉnh.
c: thông tin lưu trữ của đỉnh. Với l = STRING, c thể hiện cho một chuỗi kí
tự. Với l = VARIABLE hoặc APPENDABLE, c thể hiện cho tên biến.
Với l = METHOD, c thể hiện cho tên hàm.
Rv: tập dự đoán chứa những giá trị chuỗi có thể có của đỉnh v. Nếu vl =
STRING, Rv được khởi tạo là {vc}, ngược lại là {∅}.
Ý nghĩa các các kiểu cạnh được thể hiện trong Bảng 2.1. Biểu thức v1
(label) v2 biểu thị một cạnh có hướng từ đỉnh v1 tới đỉnh v2 với kiểu là label [2].
Mã nguồn 2.5 mô tả một đồ thị chuỗi được biểu diễn như Hình 2.10. Đầu
tiên, mọi câu lệnh trong mã nguồn sẽ được quét, chỉ câu lệnh sử dụng hàm
createQuery sẽ được xử lý. Nút mới được tạo tùy theo kiểu của tham số truyền
vào và thêm vào đồ thị. Nếu nó là phương thức, nội dung của phương thức được
quét, giá trị câu lệnh return sẽ được xử lý và thêm vào đồ thị. Nếu phần tử vừa
thêm là biến cục bộ, bộ sinh đồ thị sẽ quét trong phương thức sử dụng biến đó.
Nếu câu lệnh thay đổi giá trị biến được tìm thấy, đỉnh mới được tạo tùy thuộc
vào việc thay đổi là khởi tạo hay cộng gộp và thêm vào đồ thị.
Trong trường hợp giá trị mới đó được tạo nên bởi nhiều thành phần nhỏ, ví
dụ như “select * from” + getTableName() +orderBy thì mỗi thành phần được
nối trực tiếp đến phần tử thêm cuối cùng trong đồ thị với cạnh kiểu CONCAT.
22
Những đoạn câu lệnh ở trong cặp ifthen, thenelse được tính như một đồ thị
con có đỉnh là phần tử được thêm cuối cùng trong đồ thị, và đỉnh gốc đó được
đặt kiểu PRODUCT. Trong trường hợp câu lệnh cần thêm vào đồ thị ở trong
vòng lặp, ta phải xác định giá trị được thêm ở dạng chuỗi kí tự bình thường, hay
là phần tử của một mảng. Nếu là một chuỗi kí tự, giá trị của đỉnh được thêm vào
đồ thị có dạng >. Nếu là phần tử của mảng, toàn bộ phương thức
sẽ được quét lại lần nữa để tìm ra những giá trị được thêm vào mảng, sau đó
được thêm vào đồ thị. Cứ quét như vậy tới cuối phương thức hoặc không còn
nút nào được thêm mới nữa thì kết thúc việc sinh đồ thị [2].
Hình 2.10. Ví dụ minh họa đồ thị chuỗi
Sau khi đồ thị chuỗi được xây dựng, một bộ giải đồ thị sử dụng phương
pháp đệ quy cùng thuật toán duyệt tiền thứ tự để dự đoán câu truy vấn có thể
được tạo ra. Mỗi kiểu xử lí t của đỉnh v thể hiện cách thêm giá trị các đỉnh ra của
v vào tập dự đoán Rv như nào. Giả sử đỉnh v có tập đỉnh ra là VOUT = {v1,
v2,...,vn}. Gọi VCONCAT ⊂ VOUT là tập đỉnh thỏa mãn ∀ vi ∈ VCONCAT, cạnh từ v
đến vi có nhãn CONCAT, theo thứ tự FIFO (First In First Out - đỉnh được thêm
vào cây trước sẽ được lấy ra trước). Với Rv là tập dự đoán của đỉnh v [2], khi đó:
v UNION VOUT → Rv = Rv ○ Rv1 ○ Rv2 ○○ Rvn với v1, v2,, vn ∈ VOUT
v PRODUCT VOUT → Rv = (Rv ○ Rv1) ∪ (Rv ○ Rv2) ∪∪ (Rv ○ Rvt) với v1,
23
v2,, vt ∈ VCONCAT. Còn lại, ∀ vj ∈ VOUT \ VCONCAT, tập dự đoán Rvj sẽ
được thêm trực tiếp vào tập dự đoán R của đỉnh METHOD, VARIABLE
và APPENDABLE phía trên gần nhất.
Hình 2.11. Quá trình xây dựng và dự đoán câu truy vấn
Từ đồ thị chuỗi, phương pháp giải đồ thị để tìm tập dự đoán được biểu
diễn như sau:
q = R “from” + R “getTableName” ○ R “order”
= {“select * from”} ○ ({“Consumer where name =”} ○ R”a”) ○ R “order by”
= {“select * from”} ○ ({“Consumer where name =”} ○
{“>“}) (({“order by”} ○ R “category”) ∪ “”)
= {“select * from”} ○ {“Consumer where name = >”} ○ (({
“order by” } ○ (({“category”} ○ {“desc”}) ∪ ({“category”} ○ { “asc”))) ∪
“”)
= {“select * from Consumer where name = >”} ○ (({“order
by”} ○ {“category desc”, “category asc”}) ∪ {“”})
= {“select * from Consumer where name = >”}, “select *
from Consumer where name = > ○ ({“order by category
desc”, “order by category asc”} ∪ {“”})
= [“select * from Consumer where name = >”,
“select * from Consumer where name = > order by
category desc”,
“select * from Consumer where name = > order by
category asc”]
Sau khi tập dự đoán được xây dựng xong, các câu truy vấn được phân tích.
Các bảng sử dụng trong câu ở các vị trí quan trọng như: sau “from”, sau “join”,
v.v. sẽ được lấy ra. Danh sách những bảng này sẽ được thêm vào cây cấu trúc và
sinh phụ thuộc.
24
Bảng 2.1. Ý nghĩa các kiểu cạnh trong đồ thị chuỗi
Biểu thức Ý nghĩa Tương đương mã nguồn Java
v1 (INIT) v2
Giá trị của v2
là giá trị khởi
tạo của v1
String var = “init value”;
StringBuilder b = new
StringBuilder();
method() {return “value”;}
v1 (CONCAT)
v2
Giá trị v2 được
thêm vào giá
trị của v1
var += “concat value”;
b.append(“append value”);
2.2.5 Phân tích phụ thuộc cho Hibernate
ORM Framework (Object Relational Mapping Framework) là một kỹ thuật
chuyển đổi dữ liệu giữa các cơ sở dữ liệu quan hệ sang các đối tượng trong ngôn
ngữ lập trình hướng đối tượng như Java, C#, v.v. Hibernate là một trong những
công nghệ nền tảng cung cấp API cho phép ứng dụng có thể thao tác với cơ sở
dữ liệu, ánh xạ các bảng trong cơ sở dữ liệu với các đối tượng trong Java.
Hibernate hỗ trợ ánh xạ tự động thông qua tệp ánh xạ XML hoặc dùng
Annotation để ánh xạ các trường trong bảng với các thuộc tính của đối tượng
Java.
Hình 2.12. Quá trình phân tích phụ thuộc cho Hibernate
Hình 2.12 mô tả các bước phân tích phụ thuộc cho Hibernate [2]. Đầu tiên,
bộ phân tích sẽ xác định xem mã nguồn có sử dụng Hibernate hay không bằng
cách tìm tệp cấu hình hibernate.hbm.xml. Tiếp theo, bộ phân tích sẽ đọc các thẻ
có trong tệp cấu hình và chỉ ra các thẻ XML, mỗi thẻ XML có thể khai báo một
tệp ánh xạ XML khác hoặc một lớp Java. Sau đó, bộ phân tích sẽ xác định tệp
cấu hình ánh xạ theo cách nào và phân tích theo cách tương ứng. Mỗi nút thể
hiện cho bảng, cột của cơ sở dữ liệu được tạo và thêm vào cây AST hiện tại. Các
nút này cũng được bộ phân tích truy vấn sử dụng để tìm những thành phần có
khả năng tác động đến cơ sở dữ liệu.
25
Mã nguồn 2.6. Một phần tệp hibernate.cfg.xml
jdbc:mysql://localhost:3306/testdb
root
1234567890
Mã nguồn 2.7. Tệp ánh xạ Employee.hbm.xml
Mã nguồn 2.6 là một ví dụ về tệp cấu hình trong Hibernate, bộ phân tích sẽ
tìm tất cả các thẻ chứa thông tin ánh xạ từ cơ sở dữ liệu với lớp
trong Java. Với phương pháp ánh xạ bằng tệp XML, thẻ sử dụng
thuộc tính là “resource” cùng với tên tệp XML chứa thông tin ánh xạ. Còn với
phương pháp Annotation, thuộc tính là “class” và tên lớp Java với đầy đủ
package.
26
Trong Mã nguồn 2.7 của tệp ánh xạ Employee.hbm.xml, thực thể Employee
được ánh xạ với bảng EMPLOYEE trong thẻ . Khóa chính id được ánh
xạ với thuộc tính id trong thẻ , first_name với firstName, last_name với
lastName, salary với salary trong thẻ .
Bộ phân tích Hibernate được chia thành hai phần: phân tích câu truy vấn
và hàm phân tích thực thể. Hibernate đã xây dựng sẵn các phương thức tương
tác với cơ sở dữ liệu bằng thực thể, danh sách các phương thức cho trong Bảng
2.2 [2]. Tham số truyền vào các hàm này có thể là tên của thực thể Java dưới
dạng “package.name”. Đi cùng với tên thực thể là đối tượng Java chứa các giá
trị cần gửi cho cơ sở dữ liệu, hoặc chỉ cần gửi đối tượng Java. Các phương thức
này có các đặc điểm khá riêng biệt nên chúng dễ được tìm thấy bằng cách quét
qua từng câu lệnh. Sau đó phân tích các tham số truyền vào phương thức này và
xác định kiểu thực thể của tham số.
Bảng 2.2. Các phương thức truy xuất CSDL có sẵn của Hibernate
Phương thức Mô tả
delete(Object object)
delete(String entityName, Object object)
Xóa một bản ghi
get(Class clazz, Serializable id)
get(String entityName, Serializable id)
Lấy thông tin bản ghi
load(Class clazz, Serializable id)
load(Object object, Serializable id)
Lấy thông tin bản ghi
merge(Object object)
merge(String entityName, Object object)
Cập nhật bản ghi
save(Object object)
save(String entityName, Object object)
Lưu bản ghi
update(Object object)
update(String entityName, Object object)
Cập nhật bản ghi
persist(Object object)
persist(String entityName, Object object)
Lưu bản ghi
27
2.4 Quản lý phiên bản
Bộ so sánh mã nguồn [2] nhận đầu vào là phiên bản mã nguồn đã được
thay đổi, một trình kiểm tra sẽ quét toàn bộ mã nguồn mới, so sánh với mã
nguồn gốc để tìm ra những tệp có nội dung thay đổi hoặc có thể là tệp thêm vào
hoặc tệp bị xóa. Với tệp thay đổi, bộ tiền xử lý tương ứng với mã nguồn tệp đó
sẽ được sử dụng tạo cây AST mới. Sau đó, thông tin nút gốc được sử dụng để
định danh trên cây AST của mã nguồn gốc. Tiếp theo, một trình duyệt cây sẽ
duyệt hậu thứ tự được thực hiện và tìm ra các nút được thêm mới, xóa đi, v.v.
Đầu ra của bộ so sánh mã nguồn là tệp thay đổi để cung cấp cho việc phân tích
ảnh hưởng sự thay đổi.
Hình 2.13. So sánh cây cấu trúc giữa hai phiên bản mã nguồn
Hình 2.13 là một ví dụ so sánh hai phiên bản mã nguồn của dự án. Nút
File_A.java được định danh trên cây cấu trúc mã nguồn gốc, sau đó trình duyệt
cây thực hiện duyệt hậu thứ tự đồng thời trên hai cây với độ sâu cấp ba, nhận
thấy nút thuộc tính có tên ID đã được thay đổi kiểu từ kiểu int thành kiểu long,
và nút phương thức A2() tồn tại trên cây mới nhưng không có trên cây gốc, do
đó nút này đã được thêm mới.
28
Chương 3. Phương pháp phân tích ảnh hưởng các thành phần
giao diện và phân loại kiểm thử hồi quy
Chương 2 đã trình bày phương pháp phân tích phụ thuộc trong mã nguồn
Java và một số công nghệ nền tảng kèm theo công cụ JCIA. Chương này, luận
văn sẽ trình bày phương pháp phân tích ảnh hưởng các các thành phần giao diện
trong công nghệ Java Servlet. Tiếp theo là trình bày về kiểm thử hồi quy và phân
loại kiểm thử hồi quy từ các thành phần thay đổi và ảnh hưởng tìm được từ công
cụ. Cuối chương là quy trình kiểm thử hồi quy dựa trên phương pháp cải tiến.
3.1 Phương pháp phân tích ảnh hưởng các thành phần giao diện
Với các nền tảng khác nhau thì mã nguồn Java tương tác với các mã nguồn
giao diện theo những cách khác nhau. Vì vậy, hiện tại công cụ JCIA tập trung
vào phân tích ảnh hưởng giao diện cho công nghệ Java Servlet.
3.1.1 Phân tích kiến trúc Java Servlet
Java Servlet là chương trình chạy trên phía máy chủ Web và đóng vai trò
như một lớp trung gian giữa một yêu cầu đến từ một trình duyệt Web
hoặc HTTP Client với cơ sở dữ liệu hoặc các ứng dụng trên HTTP Server.
Hình 3.1. Kiến trúc Java Servlet
Hình 3.1 mô tả kiếm trúc của Java Servlet với các thành phần như sau:
Web Browser là một trình duyệt giúp người dùng có thể truy cập được
máy chủ Web thông qua giao thức HTTP.
29
Web Server là một chương trình máy tính sử dụng HTTP (Hypertext
Transfer Protocol) để truyền tải dữ liệu.
Servlet Container là một phần của máy chủ Web được viết bởi ngôn ngữ
Java để xử lý các Web động, yêu cầu tính toán từ máy khách.
Database là nơi chứa dữ liệu tương tác của hệ thống.
Dữ liệu sẽ được nhập vào khung dữ liệu trên trình duyệt máy chủ của máy
khách sau đó giao tiếp với máy chủ Web thông qua giao thức HTTP để truyền
và nhận dữ liệu. Web Server có nhiệm vụ trung chuyển dữ liệu và điều hướng
đến Servlet Container để thực thi các tác vụ tương ứng với yêu cầu từ phía máy
khách. Servlet Container gọi phương thức init() của servlet để khởi tạo và nó
được gọi một lần khi servlet được tải lần đầu tiên.
Container gọi phương thức service() của servlet để xử lý HTTP request,
tức là đọc dữ liệu trong yêu cầu và hình thành một response. Web Server trả lại
kết quả dựa trên yêu cầu.
Hình 3.2. Vòng đời của Java Servlet
Khi Servlet được tải lần đầu tiên các bước 1, 2, 3 được thực thi. Các bước
này chỉ được gọi khi Servlet được gọi lần đầu. Servlet Container sẽ gọi phương
thức init() một lần duy nhất khi khởi tạo Servlet. Phương thức init() phải được
thực hiện thành công trước khi Servlet có thể nhận bất kỳ yêu cầu nào. Bước
30
4 được gọi khi có yêu cầu từ phía người dùng tới Servlet. Service() được gọi bởi
Servlet container để cho phép Servlet đáp ứng yêu cầu từ phía người dùng, nó
chỉ được gọi sau khi phương thức init() của Servlet đã được thực hiện thành
công. Phương thức Destroy() chỉ được gọi khi tất cả các luồng trong phương
thức dịch vụ của Servlet đã thoát hoặc sau một khoảng thời gian chờ nhất định.
Hình 3.3 là một ví dụ về mã nguồn sử dụng nền tảng Java Servlet:
Hình 3.3. Mã nguồn sử dụng nền tảng Java Servlet
Đầu tiên, yêu cầu từ người dùng sẽ được gửi đến Server bằng giao thức
HTTP thông qua URL. Tiếp theo, dựa vào các thông số đầu vào hostname và
port, máy chủ Web sẽ điều hướng tới Servlet Container tương ứng, cụ thể trong
ví dụ này là Servlet helloservlet. Sau đó, tệp web.xml sẽ là nơi định nghĩa ánh xạ
31
giữa servlet name với các url tương ứng, cũng như lớp tương ứng. Từ các ánh xạ
và các thông số đầu vào từ URL sẽ quyết định tệp java được gọi và tùy vào
phương thức do máy khách truyền lên thì một trong hai phương thức doPost()
hoặc doGet() được gọi. Đối tượng ServletOutputStream dùng để gửi dữ liệu về
cho máy khách mà cụ thể ở đây là trình duyệt.
3.1.2 Phương pháp phân tích sự ảnh hưởng
Ý tưởng phân tích được dựa trên kiến trúc và luồng dữ liệu trong Java
Servlet kết hợp với kết quả phân tích mã nguồn từ công cụ JCIA hiện có.
Hình 3.4. Phương pháp phân tích
Hình 3.4 mô tả một bộ mã nguồn dự án bao gồm 3 phần: tệp cấu hình, mã
nguồn giao diện và mã nguồn Java. Trong đó, các phụ thuộc trong mã nguồn
Java đã được phân tích từ phiên bản trước. Từ tệp cấu hình và các annotation,
xác định được các Java Servlet và URL ánh xạ của chúng. Sau đó, các phụ thuộc
giữa mã nguồn Java và mã nguồn giao diện được phân tích, các thành phần giao
diện tương tác với servlet thông qua URL ánh xạ với servlet với action là
phương thức của servlet. Các tệp Java Servlet truyền và nhận dữ liệu từ giao
diện thông qua các HTTP Request, Response và Session. Từ mã nguồn giao
diện, các thành phần của giao diện được phân tích dựa vào các tags để tìm phụ
thuộc giữa các tag và phụ thuộc giữa các tệp giao diện.
Hình 3.5 mô tả các bước phân tích phụ thuộc cho Java Servlet. Bước đầu
tiên, bộ phân tích sẽ tìm tệp cấu hình web.xml/annotation để xác định xem mã
nguồn có sử dụng Java Servlet hay không. Nếu tìm thấy, bộ phân tích sẽ tìm tệp
servlet và trỏ đến URL. Bước tiếp theo, bộ phân tích sẽ phân tích các thành phần
32
giao diện và mã nguồn Java trong JSP để tìm phụ thuộc giữa giao diện và mã
nguồn Java. Sau đó, bộ phân tích tìm các giá trị được gửi từ các tệp Java tới giao
diện và nhận từ giao diện bằng Session, Request, Response.
Hình 3.5. Quá trình phân tích phụ thuộc
Mã nguồn 3.1 là một ví dụ cho việc tìm kiếm các Java Servlet thông qua
tệp cấu hình web.xml. Thông tin về Java Servlet đã được khai báo rõ ràng nhờ
vào các và liên hệ bằng . Như
vậy, có một phụ thuộc Servlet ánh xạ từ lớp Java tại đường dẫn
Controller/SANPHAM_CTR tới URL Sanpham.do.
Mã nguồn 3.1. Mã cấu hình web.xml trong Java Servlet
Sanpham
Controller.SANPHAM_CTR
/Sanpham.do
Mã nguồn 3.2 thể hiện mối quan hệ giữa URL và Java Servlet thông qua
Annotation. Từ đó, phụ thuộc từ LoginService.class tới URL /LoginService có
thể dễ dàng nhận ra được.
Mã nguồn 3.2. Mã Annotation trong Java Servlet
@WebServlet(“/LoginService”)
public class LoginService extends HttpServlet
Tiếp theo, bộ phân tích sẽ phân tích đến phụ thuộc giữa các thành phần
giao diện. Công cụ tìm đến các tệp JSP, phân tích các thẻ và thu thập các thuộc
33
tính của từng thẻ. Dựa trên các thuộc tính của các thẻ giao diện trong các tệp
JSP, các phụ thuộc giữa các tệp sẽ được hình thành.
Mã nguồn 3.3. Phụ thuộc trong mã nguồn giao diện
Mã nguồn 3.3 thể hiện sự phụ thuộc từ các thẻ tới các tệp với các
đường dẫn templates/user/side-bar.jsp, templates/user/nav-bar.jsp,
reception/bookbed.jsp, templates/footer.jsp. Nếu mã nguồn trong các tệp này bị
thay đổi thì giao diện chứa mã nguồn trên cũng bị thay đổi.
Sau đó là quá trình phân tích phụ thuộc giữa mã nguồn Java và mã nguồn
giao diện thông qua dữ liệu được lưu tại Session và vận chuyển thông qua
HTTPRequest, HTTPResponse. Từ đó, công cụ nhận được các phụ thuộc bằng
cách tìm ra các đối tượng tương ứng trong mã nguồn. Bên cạnh đó, giao diện
cũng tương tác với mã nguồn Java thông qua các lời gọi đến URL theo các giao
thức HTTP. Dựa vào ánh xạ đã phân tích từ cấu hình, bộ phân tích sẽ đánh dấu
lại các phụ thuộc.
Mã nguồn 3.4. Phụ thuộc giữa mã nguồn Java và mã nguồn giao diện
String user = request.getParameter(“user”);
String pass = request.getParameter(“pass”);
<input type=“text” name=“password” placeholder=“Password”
required>
<input type=“submit” name=“Login” placeholder="”Login
Loginmodal-submit” value=“Login”>
Mã nguồn 3.4 cho thấy mã nguồn Java lấy dữ liệu từ hai input trong giao
diện thông qua phương thức getParameter của request. Ngoài ra, mã nguồn
34
cũng thể hiện mối quan hệ giữa form tới lớp servlet có ánh xạ với URL
LoginService.
Ngoài các phụ thuộc trên, mã nguồn JSP còn tương tác với các đối tượng
Java bằng cách nhúng các mã nguồn Java vào trong nội dung của chính nó.
Thông qua đó, JSP có thể sử dụng các phương thức và thuộc tính của các đối
tượng Java mà không cần phải khai báo Servlet. Như vậy, việc tương tác giữa
Java và JSP trở nên linh hoạt và dễ dàng hơn.
Mã nguồn 3.5 nằm trong tệp patientmgmt.jsp có gọi đến đối tượng Java là
AdminDAO, Employee, RoomType và Room là các đối tượng không được khai
báo Servlet. Nhờ đó, JSP có thể lấy dữ liệu từ Java, xử lý chúng và trả kết quả
về cho giao diện. Như ví dụ trong Mã nguồn 3.5, các dữ liệu về rooms lấy được
từ phương thức getListObject() của AdminDAO đã được JSP lấy ra và hiển thị
dưới dạng các dòng dữ liệu từ trong bảng. Tuy nhiên, hiện tại trong luận văn
việc tìm phụ thuộc của mã nguồn Java trong JSP còn hạn chế và sẽ cải thiện
trong tương lai.
Mã nguồn 3.5. Phụ thuộc mã nguồn Java nhúng trong mã nguồn JSP
35
3.2 Phương pháp phân loại kiểm thử hồi quy
3.2.1 Phân loại kiểm thử hồi quy
Có một số cách để kiểm thử hồi quy có thể được thực hiện. Tuy nhiên,
điều này phụ thuộc vào các yếu tố như loại thay đổi được đưa ra, sửa lỗi, v.v.
Một tập hợp các kiểm thử có thể thực hiện theo luồng sau:
Kiểm thử hồi quy đơn vị: thực hiện kiểm thử lại đối với sự thay đổi ở mô-
đun hoặc vùng nào đó của ứng dụng.
Kiểm thử hồi quy tích hợp: thực hiện kiểm thử lại đối với sự thay đổi ở các
mô-đun kèm theo những tương tác với nó.
Kiểm thử hồi quy toàn bộ: kiểm tra lại toàn bộ ứng dụng, không phụ thuộc
vào vị trí của sự thay đổi.
Tùy thuộc vào tình hình của dự án bao gồm: thời gian, chi phí và nguồn
lực sẵn có, mức độ nghiêm trọng của sự thay đổi mà việc thực hiện kiểm thử hồi
quy sẽ hiệu quả nếu chọn đúng bộ kiểm thử thay vì kiểm thử lại toàn bộ. Hiện
nay, cũng có một số công cụ quản lý mã nguồn có thể thấy được các dòng lệnh
thay đổi. Tuy nhiên việc kiểm thử như thế nào, phân loại ra sao và được thực
hiện bởi lập trình viên hay kiểm thử viên là chưa có công cụ nào hỗ trợ. Các
công cụ quản lý mã nguồn hiện nay đều không hỗ trợ tích hợp kiểm thử.
Hình 3.4. Phân loại kiểm thử hồi quy
Hình 3.6 mô tả việc phân loại kiểm thử hồi quy. Dựa trên các phân tích sự
ảnh hưởng mà công cụ JCIA đã thực hiện bao gồm các phụ thuộc liên quan đến
mã nguồn Java và mã nguồn giao diện JSP với nền tảng Java Servlet. Một
phương pháp phân loại kiểm thử hồi quy được đề xuất bao gồm: kiểm thử hồi
36
quy đơn vị, kiểm thử hồi quy tích hợp và kiểm thử hồi quy cho giao diện. Mục
đích của việc phân loại như trên là để đưa ra cái nhìn khách quan giữa lập trình
viên và kiểm thử viên. Lập trình viên có thể kiểm thử hồi quy cho đơn vị và tích
hợp các đơn vị một cách hiệu quả và kiểm thử viên có thể kiểm thử hồi quy cho
các trang thay đổi và ảnh hưởng.
Giao diện cần được kiểm thử có thể được xác định dựa vào kiểu đối tượng
khi dựng cây cấu trúc, đó là các tệp và các thẻ JSP. Kết hợp với dữ liệu phân
tích hai phiên bản, công cụ có thể đưa ra các tệp giao diện có thể bị thay đổi và
cần phải kiểm thử lại.
Từ các phụ thuộc đã phân tích được, bộ công cụ sẽ tự động phân loại kiểm
thử hồi quy cho các phương thức trong Java. Nếu phương thức đó không gọi đến
bất kỳ một phương thức nào khác thì sẽ được phân loại vào kiểm thử đơn vị. Và
ngược lại nếu phương thức đó gọi đến bất kỳ một phương thức khác thì sẽ được
phân loại vào kiểm thử tích hợp.
3.2.3 Quy trình kiểm thử hồi quy dựa trên phương pháp cải tiến
Hình 3.5. Quy trình kiểm thử hồi quy đề xuất
Luận văn đề xuất một quy trình kiểm thử hồi quy dựa trên kết quả của
công cụ JCIA như Hình 3.5. Đầu tiên, mã nguồn dự án Java EE phiên bản trước
37
khi thay đổi sẽ được đưa vào công cụ để phân tích, sau đó một phiên bản mã
nguồn Java EE được sửa đổi sẽ được đưa vào công cụ JCIA mở rộng để so sánh
hai phiên bản và tìm ra các thành phần bị ảnh hưởng. Sau khi có được kết quả
đầu ra là các thành phần thay đổi và bị ảnh hưởng, các thành phần này sẽ được
phân loại dựa trên các tệp mã nguồn là Java Core hay JSP. Tiếp theo là chọn các
ca kiểm thử cần kiểm tra lại và cập nhật ca kiểm thử nếu có thay đổi để đưa vào
các công cụ kiểm thử để thực hiện kiểm thử hồi quy Ranorex (công cụ kiểm thử
giao diện).
38
Chương 4. Công cụ hỗ trợ và thực nghiệm
Ở chương này, luận văn sẽ trình bày về quá trình thực nghiệm và triển khai
với công cụ JCIA mở rộng và công cụ hỗ trợ kiểm thử hồi quy Ranorex.
4.1 Giới thiệu công cụ JCIA mở rộng
Dựa trên những cải tiến phương pháp đã được trình bày ở trên, bộ công cụ
JCIA mở rộng thừa kế mã nguồn từ JCIA đã được triển khai và cài đặt sử dụng
cho các công nghệ nền tảng Spring, Hibernate, Struts 2. Công cụ JCIA mở rộng
tập trung phân tích ảnh hưởng cho công nghệ Java Servlet nhằm tìm ra các thành
phần dự đoán thay đổi liên quan đến giao diện. Hình 4.1 mô tả kiến trúc của bộ
công cụ JCIA phiên bản trước và phần mở rộng trong phiên bản mới (phần mở
rộng là phần được bôi đậm trong hình).
Hình 4.1. Kiến trúc của công cụ JCIA
Công cụ JCIA mở rộng nhận đầu vào là mã nguồn Java EE sử dụng công
nghệ Java Servlet. Trong bộ tiền xử lý, mã nguồn Java sẽ được phân tích nhờ
thư viện Java Development Tools phục vụ cho yêu cầu định danh và tìm kiếm
nút. Bộ phân tích ảnh hưởng được kế thừa từ công cụ JCIA, mở rộng phân tích
sự ảnh hưởng cho các thành phần giao diện trong Java Servlet. Sau đó, dựa vào
bộ so sánh phiên bản và kỹ thuật phân tích ảnh hưởng WAVE-CIA đã có; một
39
bộ phân loại các thành phần dựa trên các phụ thuộc được thực hiện nhằm mục
đích hỗ trợ cho kiểm thử hồi quy.
Hình 4.2 mô tả kết quả đầu ra của công cụ sau khi so sánh hai phiên bản
mã nguồn bao gồm các thành phần thay đổi và các thành phần dự đoán thay đổi.
Các thành phần này được phân loại hỗ trợ cho việc kiểm thử hồi quy bao gồm
các thành phần cho kiểm thử đơn vị, các thành phần kiểm thử tích hợp và kiểm
thử giao diện.
Hình 4.2. Kết quả đầu ra của công cụ
4.2 Thực nghiệm
Sau đây, luận văn sẽ trình bày một ví dụ áp dụng công cụ JCIA phân tích
cho mã nguồn ứng dụng Web Java EE quản lý bệnh viện [7]. Đây là một ứng
dụng quản lý các thông tin cơ bản liên quan đến bệnh viện như: quản lý nhân
viên, quản lý thông tin bệnh nhân, quản lý đặt phòng, quản lý thuốc, quản lý
dịch vụ khám chữa bệnh. Ứng dụng Web này có chức năng phân theo các quyền
như Hình 4.3.
Ứng dụng Web này bao gồm các trang:
Đăng nhập: Người dùng cần phải đăng nhập vào thành công vào hệ thống
để có thể sử dụng các chức năng quản lý của hệ thống. Tài khoản dùng để truy
cập vào hệ thống được cung cấp và khởi tạo bởi người quản trị hệ thống. Tương
ứng với mỗi loại người dùng khác nhau, người quản trị sẽ cung cấp quyền truy
cập vào hệ thống khác nhau. Từ đó, người dùng có thể truy cập được một vào
giao diện chức năng tương ứng với quyền được cung cấp.
40
Hình 4.3. Ứng dụng Web quản lý bệnh viện.
User Admin: Sau khi đăng nhập thành công người quản trị hệ thống sẽ có
quyền thực hiện các chức năng như: quản lý nhân viên, quản lý phòng, quản lý
dịch vụ y tá, gửi/nhận tin nhắn từ người dùng khác, thay đổi mật khẩu.
- Quản lý nhân viên: Ở chức năng này, người quản trị hệ thống có thể thực hiện
thêm mới, sửa, xóa nhân viên và phân loại phòng ban cho nhân viên. Việc phân
loại nhằm phân quyền cho nhân viên khi tham gia sử dụng trong hệ thống. Nhân
viên thuộc phòng ban nào sẽ được phân quyền sử dụng chức năng tương ứng của
phòng ban đó. Thông tin của nhân viên bao gồm các thông tin chung, trình độ
chuyên môn và kinh nghiệm làm việc, phòng ban. Kết quả của việc thêm, sửa,
xóa nhân viên thành công, nhân viên sẽ được hiển thị trong danh sách nhân viên
được thể hiện trong bảng “All Employees”. Bên cạnh đó, để giúp tiết kiệm thời
gian cho quản trị viên, hệ thống có cung cấp chức năng tìm kiếm nhanh trong
bảng thông tin nhân viên trong bảng.
41
Bảng 4.1 mô tả chi tiết các yêu cầu dữ liệu đầu vào của từng trường trong
chức năng quản lý nhân viên.
Bảng 4.1. Mô tả yêu cầu chức năng quản lý nhân viên
Tên trường Bắt buộc Khoảng hợp lệ Khác
First Name Có Lớn hơn 3 ký
tự
Không được bỏ trống
Father Name Có Không được bỏ trống
Family Name Không
Address Có Không được bỏ trống
Password Có 6-16 ký tự Không được bỏ trống
Bao gồm cả chữ viết
thường và viết hoa
Confirm Password Có 6-16 ký tự Không được bỏ trống
Bao gồm cả chữ viết
thường và viết hoa
Phải trùng với
Password
Email Có Không được bỏ trống
Phải nhập đúng định
dạng email
Date of Birth Có Không được bỏ trống
Phone Có Không được bỏ trống
Chỉ bao gồm ký tự số
Không chứa dấu cách
Select Gender Không
Category, Employee
Job, User Name,
Date, Institute
Name,
Year, Position,
Degree,
Quatification
Có
Không được bỏ trống
- Quản lý phòng: Chức năng quản lý phòng cho phép quản trị viên có thể thêm,
sửa, xóa thông tin các phòng. Danh sách các phòng sau khi được thêm mới hoặc
sửa đổi sẽ được hiển thị trên trang quản lý phòng giúp quản trị viên biết được
42
những loại phòng hiện có trong bệnh viên, số lượng giường cũng như giá của
từng loại phòng. Ngoài ra nhằm giúp quản trị viên tìm kiếm thông tin nhanh
chóng, hệ thống còn cung cấp thêm chức năng tìm kiếm nhanh.
Bảng 4.2 mô tả chi tiết yêu cầu dữ liệu đầu vào của từng trường trong
chức năng quản lý nhân viên.
Bảng 4.2. Mô tả yêu cầu chức năng quản lý phòng
Tên trường Bắt buộc Khoảng hợp lệ Khác
Room Type Có Không Không được bỏ trống
Room Number Có Không Không được bỏ trống
Number of Bed Có Lớn hơn 0
Không được bỏ trống
Chỉ được phép nhập ký tự số
- Quản lý dịch vụ y tá: Chức năng quản lý dịch vụ y tá cung cấp cho quản trị
viên hệ thống các chức năng cơ bản thêm, sửa, xóa các dịch vụ y tá. Thông tin
các dịch vụ hiển thị trong bảng, người dùng có thể tìm kiếm thông tin về các
dịch vụ.
Bảng 4.3 mô tả chi tiết yêu cầu của dữ liệu đầu vào của từng trường trong
chức năng quản lý dịch vụ y tá.
Bảng 4.3. Mô tả yêu cầu chức năng quản lý dịch vụ
Tên trường Bắt buộc Khoảng hợp lệ Khác
Nurse, Shift
Time, Service
Date, Department
Có
Không Không được bỏ trống
User Receptionist: Hệ thống cho phép người dùng này thực hiện các chức
năng như: quản lý bệnh nhân, đặt phòng cho bệnh nhân, gửi/nhận tin nhắn từ
người dùng khác, đổi mật khẩu.
- Quản lý bệnh nhân: Hệ thống cho phép người dùng Receptionist quản lý các
thông tin về bệnh nhân với các chức năng: thêm, sửa, xóa thông tin bệnh nhân
bao gồm thông tin cá nhân và thông tin người thân. Các thông tin bệnh nhân liên
quan đến bệnh nhân được hiển thị trong bảng “All Patient”. Bên cạnh đó, người
dùng có thể tìm kiếm thông tin bệnh nhân trong bảng với chức năng tìm kiếm.
- Quản lý đặt phòng: Hệ thống cho phép người dùng Receptionist thực hiện
chức năng: thêm, sửa, xóa thông tin đặt phòng. Thông tin chi tiết về phòng đặt
43
được hiển thị trong bảng và người dùng có thể tìm kiếm thông tin phòng đặt
bằng cách thực hiện chức năng tìm kiếm phía trên mỗi bảng.
Bảng 4.4 mô tả chi tiết yêu cầu của dữ liệu đầu vào của từng trường trong
chức năng quản lý bệnh nhân.
Bảng 4.4. Mô tả yêu cầu chức năng quản lý bệnh nhân
Tên trường Bắt buộc Khoảng hợp lệ Khác
First Name Có Lớn hơn 3 ký tự Không được bỏ trống
Father Name, Family
Name, Address
Không
Email Có
Không được bỏ trống
Nhập đúng định dạng
Email
Date of Birth Có Không được bỏ trống
Phone Có
Không được bỏ trống
Chỉ được phép nhập số
Select Gender, Blood
Type, Full Name,
Address, Relationship
Không
Bảng 4.5 mô tả chi tiết yêu cầu của dữ liệu đầu vào của từng trường trong
chức năng quản lý bệnh nhân và đặt phòng.
Bảng 4.5. Mô tả yêu cầu chức năng đặt phòng
Tên trường Bắt buộc Khoảng hợp lệ Khác
First Name Có Lớn hơn 3 ký tự Không được bỏ trống
Father Name, Family
Name, Address
Không
User Pharmacist: Hệ thống cho phép người dùng thực hiện các chức
năng như: quản lý thuốc, bán thuốc cho bệnh nhân, gửi/nhận tin nhắn của người
dùng khác, thay đổi mật khẩu.
- Quản lý thuốc: Ở chức năng này, người dùng Pharmacist có thể thực hiện các
chức năng: thêm, sửa, xóa thông tin thuốc. Các thông tin liên quan đến thuốc
được hiển thị trong bảng “All Drugs”, người dùng có thể tìm kiếm thông tin về
thuốc tại bảng này bằng cách sử dụng chức năng tìm kiếm.
44
- Quản lý bán thuốc: Chức năng cho phép người dùng Pharmacist quản lý thuốc
được bán cho bệnh nhân và có thể thực hiện thêm, sửa, xóa thông tin thuốc bán
ra và thông tin này được hiển thị trong bảng cho phép người dùng tìm kiếm
thông tin với chức năng tìm kiếm. Bên cạnh đó người dùng có thể in hóa đơn
thuốc.
Bảng 4.6 mô tả chi tiết yêu cầu của dữ liệu đầu vào của từng trường trong
chức năng quản lý bán thuốc.
Bảng 4.6. Mô tả yêu cầu chức năng quản lý thuốc
Tên trường Bắt buộc Khoảng hợp lệ Khác
Drug Name Có Không được bỏ trống
Cost Có Lớn hơn 0
Không được bỏ trống
Chỉ cho phép nhập ký tự số
Quantity Có Lớn hơn 0
Không được bỏ trống
Chỉ cho phép ký tự số
Production date Có Không được bỏ trống
Drug expired Có Không được bỏ trống
Bảng 4.7 mô tả chi tiết yêu cầu của dữ liệu đầu vào của từng trường trong
chức năng quản lý bán thuốc.
Bảng 4.7. Mô tả yêu cầu chức năng quản lý bán thuốc
Tên trường Bắt buộc Khoảng hợp lệ Khác
Drug Name,
Patient
Có Không được bỏ trống
Unit Per Day Có Lớn hơn 0 và nhỏ
hơn 4
Không được bỏ trống
Quantity Có
Lớn hơn 0 và nhỏ
hơn 50
Không được bỏ trống
Take From, End
Take
Có
Không được bỏ trống
Nhập đúng định dạng
dd/mm/yyyy
Dựa trên các mô tả yêu cầu và các đặc tả kể trên, một tập các ca kiểm thử
được thiết kế cho từng chức năng trong hệ thống. Dưới đây là tập các ca kiểm
thử cho một số chức năng chính.
45
Chức năng Add Patient
STT Hành động Phản hồi từ hệ thống
Trường hợp thêm Patient thành công
1
1. Nhập vào các trường sau với giá
trị hợp lệ:
- First Name, Father Name, Family
Name, Address, Email, Date of
Birth, Phone, Select Gender, Blood
Type
2. Chọn chức năng “Next”
Nhập vào các trường sau với giá trị
hợp lệ: Full Name, Address,
Relationship, Phone
3. Chọn chức năng “Finish”
Hệ thống hiển thị thông báo
tương ứng “Success Add
Patient”
Nhập giá trị không hợp lệ vào trường Email
2
1. Nhập sai định dạng Email
2. Nhập giá trị hợp lệ vào các
trường còn lại
Hệ thống hiển thị thông báo
tương ứng “Please enter a
valid email address”
Nhập vào giá trị trống
3
Để trống các trường bắt buộc:
- First Name, Email, Date of Birth,
Phone
2. Chọn chức năng “Next”
Next of Skin
- Phone
3. Chọn chức năng “Finish”
Hệ thống hiển thị thông báo
tương ứng dưới các trường
“This field is required”
Nhập giá trị không hợp lệ vào trường Phone
4
1. Nhập chữ cái/ký tự đặc biệt vào
vào trường Phone
2. Nhập giá trị hợp lệ vào các
trường còn lại
Hệ thống hiển thị thông báo
tương ứng dưới các trường
“This field is invalid”
Nhập giá trị không hợp lệ vào trường First Name
5 Nhập vào trường First Name < 3 ký
tự
Hệ thống hiển thị thông báo
tương ứng “Please enter at
least 3 characters”
46
Chức năng Book Bed
STT Hành động Phản hồi từ hệ thống
Trường hợp Book Bed thành công
1
1. Chọn và nhập các giá trị hợp
lệ:
- Room, Patient, Department
2. Chọn chức năng “Book Bed”
Hệ thống hiển thị thông báo tương
ứng “Success Added Book Bed”
Trường hợp nhập vào giá trị trống
Để trống các trường bắt buộc:
- Room, Patient, Department
2. Chọn chức năng “Book Bed”
Hệ thống hiển thị thông báo tương
ứng dưới các trường “This field is
required”
Chức năng Sell Drug
STT Hành động Phản hồi từ hệ thống
Trường hợp Sell Drug thành công
1
1. Chọn và nhập các giá trị hợp
lệ:
- Drug, Patient, Unit Per Day,
Quantity, Take From, End Take
2. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Selled Successfully, Warning
Drug Quantity Less Than 50”
Nhập vào giá trị trống
2
Để trống các trường bắt buộc:
- Drug
- Patient
- Unit Per Day
- Quantity
- Take From
- End Take
2. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng dưới các trường “This field is
required”
Nhập sai định dạng Quantity
3
1. Nhập giá trị âm vào trường
Quantity
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid number
between 1 and 50”
47
STT Hành động Phản hồi từ hệ thống
4
1. Nhập giá trị vào trường
Quantity lớn hơn số lượng thuốc
còn lại trong cơ sở dữ liệu.
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “You Enter Quantity more than
Drug Quantity”
5
1. Nhập giá trị 0 vào trường
Quantity
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid number
between 1 and 50”
6
1. Nhập giá trị >50 vào trường
Quantity
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid number
between 1 and 50”
7
1. Nhập chữ vào trường
Quantity
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a number”
Nhập sai định dạng Unit Per Day
8
1. Nhập chữ vào trường Unit Per
Day
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a number”
9
1. Nhập giá trị > 4 vào trường
Unit Per Day
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid number
between 1 and 4”
48
STT Hành động Phản hồi từ hệ thống
10
1. Nhập giá trị âm vào trường
Unit Per Day
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid number
between 1 and 4”
Nhập sai định dạng Take From/End Take
11
1. Nhập chữ vào trường Take
From
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter a valid format
dd/mm/yyyy”
14
1. Nhập Take From lớn hơn End
Take
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
Hệ thống hiển thị thông báo tương
ứng “Please enter Take From < End
Take”
Trường hợp giảm tiền thuốc đối với bệnh nhân có Health Insurance
15
1. Chọn bệnh nhân có Health
Insurance
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
4. Chọn chức năng “Invoice”
Tiền thuốc được tính đúng theo
công thức Total Cost = Cost
*Quantity-(Cost*Quantity*%level
Health_Insurance)
Trường hợp không giảm tiền thuốc đối với bệnh nhân không có Health
Insurance
16
1. Chọn bệnh nhân không có
Insurance Health
2. Các trường còn lại nhập giá
trị hợp lệ
3. Chọn chức năng “Sell Drug”
4. Chọn chức năng “Invoice”
Tiền thuốc được tính đúng theo
công thức Total Cost =
Cost*quantity
49
Chức năng tính Fee
STT Hành động Phản hồi từ hệ thống
Trường hợp Paid thành công
1
Chọn chức năng “Check” để
thanh toán
Hệ thống hiển thị “Paid
successfully” trong cột Fee
Trường hợp bệnh nhân đã Book Bed thành công
3
Kiểm tra thông tin bệnh nhân Hiển thị đầy đủ thông tin bệnh
nhân đã Book Bed thành công
Bài toán đặt ra: Sau khi kiểm thử phiên bản 1, kiểm thử viên đã phát hiện
ra một số lỗi bao gồm: cập nhật thông tin bệnh nhân không thành công, không
hiển thị thông báo sau khi xóa thông tin bệnh nhân, màn hình “Sell Drug” và
“Manage Drug” thiếu xác nhận các trường bắt buộc. Trong phiên bản mới,
khách hàng yêu cầu nhóm phát triển sửa lỗi tìm được ở phiên bản 1 và thêm một
số yêu cầu thay đổi.
Hình 4.4. Lỗi xảy ra ở phiên bản 1
Yêu cầu thứ nhất: Thêm trường cho bệnh nhân nội trú (In Patient) và
ngoại trú (Out Patient) trong màn hình quản lý bệnh nhân. Nếu là bệnh nhân nội
trú, bệnh nhân được phép thực hiện chức năng đặt phòng thông qua
Receptionist. Nếu bệnh nhân đăng ký ngoại trú sẽ không thể đặt phòng thành
công.
50
Hình 4.5. Yêu cầu thêm mới cho giao diện quản lý bệnh nhân
Yêu cầu thứ hai: Thêm trường kiểm tra Health Insurance với các mức độ 1,
2, 3, 4 tương ứng việc giảm 10%, 20%, 30%, 40% số tiền mà bệnh nhân phải trả
cho đặt phòng và mua thuốc.
Hình 4.6. Nghiệp vụ liên quan đến Health Insurance
Sau khi tiếp nhận yêu cầu của khách hàng và làm rõ yêu cầu, nhóm phát
triển thực hiện triển khai và đưa ra một phiên bản mới. Kiểm thử viên thực hiện
cập nhật các ca kiểm thử dựa theo yêu cầu thay đổi của khách hàng. Lúc này, mã
nguồn của phiên bản mới sẽ được đưa vào công cụ JCIA để so sánh và phân tích
sự ảnh hưởng từ các thay đổi.
Hình 4.8 mô tả kết quả sau khi đưa vào công cụ JCIA để phân tích bao
gồm các thành phần thay đổi và thành phần dự đoán thay đổi. Các thành phần
này được phân loại kiểm thử hồi quy cho đơn vị.
51
Hình 4.7. Kết quả tập thay đổi và ảnh hưởng cho kiểm thử đơn vị
Từ kết quả trên, lập trình viên sẽ phải thực hiện kiểm thử đơn vị cho tất cả
các hàm thay đổi và hàm bị ảnh hưởng để đảm bảo chất lượng cho phiên bản 2.
Việc kiểm thử đơn vị có thể kết hợp với công cụ CTF4Junit, công cụ này hỗ trợ
sinh ca kiểm thử cho đơn vị cho mã nguồn Java. Tuy nhiên, công cụ mới chỉ hỗ
trợ một phần đối với các hàm với kiểu dữ liệu nguyên thủy.
Tiếp theo là kết quả phân loại kiểm thử hồi quy cho các thành phần giao
diện (như Hình 4.9).
Hình 4.8. Kết quả tập thay đổi và ảnh hưởng cho kiểm thử giao diện
Từ kết quả trên, kiểm thử viên sẽ phải cập nhật các ca kiểm thử và chọn ra
một bộ các các ca kiểm thử phù hợp để thực hiện kiểm thử hồi quy giao diện.
Dựa vào kết quả đầu ra của công cụ JCIA mở rộng như Hình 4.10, các màn hình
giao diện thay đổi và dự đoán thay đổi sẽ được kiểm thử để đảm bảo chất lượng
của phiên bản mới. Việc kiểm thử giao diện được kết hợp với công cụ Ranorex,
52
công cụ này hỗ trợ kiểm thử giao diện tự động bằng kỹ thuật ghi lại và phát lại
để kiểm thử tính chính xác giữa tương tác người dùng và giao diện.
Hình 4.9. Kết quả kiểm thử hồi quy giao diện với Ranorex
Hình 4.10. Kết quả tập thay đổi và ảnh hưởng cho kiểm thử tích hợp
4.3. Ý nghĩa của công cụ thực nghiệm
Công cụ JCIA mở rộng là một giải pháp nhằm hỗ trợ kiểm thử hồi quy cho
các ứng dụng Web doanh nghiệp Java EE. Thực nghiệm cho thấy hướng phát
triển tiềm năng của phương pháp đối với việc đảm bảo chất lượng phần mềm.
Tuy phương pháp và công cụ vẫn còn một số hạn chế nhưng công cụ này vẫn có
ý nghĩa quan trọng trong việc kiểm thử hồi quy. Công cụ này giúp tìm ra các
thành phần bị ảnh hưởng từ các thành phần thay đổi và giúp nhóm phát triển
cũng như kiểm thử viên có góc nhìn khách quan hơn trong việc phát triển ứng
dụng cũng như đảm bảo chất lượng. Đây là một giải pháp giúp giảm kinh phí và
53
rút ngắn thời gian cũng như nâng cao tính hiệu quả và chính xác trong quá trình
kiểm thử các ứng dụng Web doanh nghiệp.
Khi sử dụng công cụ JCIA mở rộng, thay vì việc thực hiện lại toàn bộ các
ca kiểm thử, chúng ta chỉ việc nén các tệp mã nguồn hai phiên bản khác nhau và
cho vào công cụ để phân tích. Việc này giúp chúng ta giảm thiểu rủi ro, thời
gian, công sức và chi phí thực hiện. Thực nghiệm cho thấy thay vì phải kiểm thử
toàn bộ mã nguồn dự án (gồm 309 hàm trong mã nguồn Java và 35 tệp giao diện
với mã nguồn JSP), kiểm thử viên chỉ cần tập trung kiểm thử lại 101 hàm (bao
gồm 89 hàm cho kiểm thử đơn vị và 12 hàm cho kiểm thử tích hợp) và 15 tệp
giao diện cho kiểm thử giao diện. Chi phí kiểm thử giảm (309+35-101-
15)/(309+35) = 66.3%.
Do đó, việc áp dụng công cụ để kiểm thử hồi quy mang lại rất nhiều lợi
ích. Với ưu điểm đã nêu, trong tương lai công cụ có khả năng áp dụng hiệu quả
cho các ứng dụng Web với các ngôn ngữ lập trình khác nhau.
54
Chương 5. Kết luận
Luận văn đã cải tiến phương pháp và bộ công cụ phục vụ cho quy trình
kiểm thử hồi quy để đảm bảo chất lượng mã nguồn các ứng dụng doanh nghiệp
trên nền tảng và công nghệ Java EE. Các phương pháp được đề xuất bởi [2,5]
tập trung phân tích chủ yếu cho mã nguồn Java. Tuy nhiên với các nền tảng khác
nhau thì mã nguồn Java còn tương tác với các mã nguồn giao diện theo những
cách khác nhau. Trong luận văn này, tác giả đã hoàn thành thêm chức năng cho
bộ công cụ nhằm đáp ứng cho việc phân tích mã nguồn giao diện cho các ứng
dụng sử dụng công nghệ Java Servlet. Bên cạnh đó, công cụ còn hỗ trợ phân loại
kiểm thử hồi quy từ các thành phần thay đổi và ảnh hưởng bao gồm kiểm thử
đơn vị, kiểm thử tích hợp và kiểm thử giao diện. Từ đó, đưa ra cái nhìn khách
quan giữa kiểm thử viên và lập trình viên. Đối với các kiểm thử viên, họ có thể
thực hiện kiểm thử hồi quy dựa trên mã nguồn hoặc đặc tả. Nếu kiểm thử hồi
quy dựa trên đặc tả sẽ chọn ra các ca kiểm thử để thực hiện nếu nó liên quan đến
phần đặc tả bị thay đổi, kỹ thuật này đòi hỏi đặc tả phải được quản lý tốt. Tuy
nhiên, với phương pháp cải tiến mà luận văn đã thực hiện, việc kiểm thử hồi quy
sẽ dựa trên mã nguồn. Kiểm thử viên chỉ cần thực hiện một số ca kiểm thử dựa
trên kết quả phân tích sự ảnh hưởng các thành phần giao diện. Còn đối với lập
trình viên họ có thể sử dụng công cụ để đánh giá được các thay đổi trong mã
nguồn. Một bộ ánh xạ giữa thành phần mã nguồn và các giao diện, chức năng
của ứng dụng được tích hợp, giúp bộ công cụ này thực sự có ích và có thể ứng
dụng vào quá trình đảm bảo chất lượng phần mềm ở các công ty phát triển phần
mềm hiện nay.
Về thực nghiệm, luận văn đã áp dụng công cụ để so sánh hai phiên bản mã
nguồn cho ứng dụng Web quản lý bệnh viện. Kết quả thực nghiệm cho thấy,
công cụ cải tiến tìm được các thành phần ảnh hưởng liên quan đến giao diện ứng
dụng Web mà công cụ trước không tìm thấy. Thêm vào đó là việc phân loại các
thành phần ảnh hưởng và thành phần thay đổi. Từ đó, hỗ trợ kiểm thử hồi quy
một cách hiệu quả. Dựa vào kết quả thực nghiệm, công cụ đã cho chúng ta thấy
được tính khả dụng của công cụ giúp giảm thời gian và chi phí kiểm thử hồi
quy.
Dựa trên những gì đã thực hiện được, trong tương lai sẽ có thêm nhiều phụ
thuộc giao diện cho các nền tảng khác được thêm vào để xử lý giúp bộ phân tích
ảnh hưởng dự đoán tập ảnh hưởng chính xác hơn. Bộ quản lý và so sánh các
phiên bản mã nguồn sẽ được tích hợp với các hệ thống quản lý phiên bản như
SVN, Git và công cụ kiểm thử hồi quy. Bộ công cụ sẽ hỗ trợ cho thêm nhiều
55
công nghệ và nền tảng khác của Java, và xa hơn nữa, trong tương lai bộ công cụ
có thể phân tích cho các ngôn ngữ khác.
56
TÀI LIỆU THAM KHẢO
TIẾNG VIỆT
[1] 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, NXB Đại học Quốc gia Hà Nội.
[2] Bùi Quang Cường, Nguyễn Minh Hiếu, Đinh Tiến Lộc. Bộ công cụ đảm bảo
chất lượng mã nguồn cho các ứng dụng doanh nghiệp, Hội nghị NCKH khoa
CNTT, ĐH Công nghệ, 2018.
TIẾNG ANH
[3] Bixin Li. WAVE-CIA: a novel CIA approach based on call graph mining. In
Proceedings of the 28th Annual ACM Symposium on Applied Computing.
[4] Bixin Li, Xiaobing Sun, Hareton Leung, Sai Zhang. A survey of code-based
change impact analysis techniques. In Software Testing, Verification and
Reliability. Wiley Online Library (2012).
[5] Le Ba Cuong, Son Van Nguyen, Duc Anh Nguyen, Pham Ngoc Hung, Hieu
Vo Dinh. A Tool for Change Impact Analysis of Java EE Applications.
Information Systems Design and Intelligent Applications. Advances in
Intelligent Systems and Computing, vol 672. Springer, Singapore (2018).
[6] Ann Millikin (2014), What Types of Software Testing Can and Should Be
Automated, https://www.seguetech.com/types-software-testing-can-should-
be-automated/.
[7] Salah, Hospital Management System, https://github.com/salahatwa/Hospital-
Management-System
Các file đính kèm theo tài liệu này:
- luan_van_phuong_phap_phan_tich_su_anh_huong_cua_cac_thanh_ph.pdf