Chương này cũng trình bày một số kỹ thuật điển hình nhằm tăng tính khả kiểm thử của một hệ thống phần mềm nói chung.. Một số chuyên gia kiểm thử và phát triển phần mềm đã chỉ ra tầm qua
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
TRẦN THỊ THEN
NGHIÊN CỨU TÍNH KHẢ KIỂM THỬ
CỦA ỨNG DỤNG TRÊN NỀN WEB
LUẬN VĂN THẠC SỸ NGÀNH CÔNG NGHỆ THÔNG TIN
Hà Nội - 2014
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
TRẦN THỊ THEN
NGHIÊN CỨU TÍNH KHẢ KIỂM THỬ
CỦA ỨNG DỤNG TRÊN NỀN WEB
Ngành: Công nghệ Thông tin
Chuyên ngành: Kỹ thuật Phần mềm
Mã số: 60480103
LUẬN VĂN THẠC SỸ NGÀNH CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Đặng Văn Hưng
Hà Nội - 2014
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan luận văn này là công trình nghiên cứu của cá nhân tôi, dưới sự hướng dẫn trực tiếp từ phía TS Đặng Văn Hưng Các số liệu, nội dung tham khảo được trích dẫn có nguồn gốc rõ ràng, tuân thủ tôn trọng quyền tác giả Kết quả cuối cùng đạt được của luận văn là thành quả của quá trình nghiên cứu của bản thân, chưa từng được công bố dưới bất kỳ hình thức nào
Tôi xin chịu trách nhiệm về nghiên cứu trong luận văn
Tác giả
Trang 4Đồng kính gửi lời cảm ơn đến tập thể các thầy , cô giáo trong trường Đa ̣i ho ̣c công nghê ̣ – Đa ̣i ho ̣c Quốc gia Hà Nô ̣i đã trau dồi kiến thức cho tôi , điều đó là nền tảng quí báu góp phần to lớn trong quá trình vâ ̣n du ̣ng vào hoàn thiê ̣n luâ ̣n văn
Cuối cùng, tôi xin được gửi lòng biết ơn sâu sắc đến gia đình , bạn bè, đồng nghiê ̣p đã ta ̣o điều kiê ̣n về vâ ̣t chất cũng như tinh thần , luôn sát cánh bên tôi , đô ̣ng viên giúp tôi yên tâm học tập và kết thúc khóa học
Xin chân thành cảm ơn!
Tác giả
Trần Thị Then
Trang 5MỤC LỤC
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
DANH MỤC CÁC KÝ HIỆU , THUẬT NGỮ, CHỮ VIẾT TẮT v
DANH MỤC CÁC BẢNG vi
DANH MỤC CÁC HÌNH VẼ vii
PHẦN MỞ ĐẦU 1
Tính cấp thiết và mục tiêu của đề tài 1
Phương pháp nghiên cứu 1
Bố cục của luận văn 2
CHƯƠNG 1 TỔNG QUAN 3
1.1 Tầm quan trọng của tính khả kiểm thử 3
1.2 Khái niệm tính khả kiểm thử 4
1.3 Các khái niệm liên quan tính khả kiểm thử 6
1.4 Một số yếu tố ảnh hướng đến tính khả kiểm thử 9
1.5 Một số độ đo tính khả kiểm thử 12
1.5.1 Độ đo cấu trúc và hành vi 12
1.5.2 Độ đo luồng dữ liệu 13
1.6 Kết chương 14
Trang 6CHƯƠNG 2 KỸ THUẬT LÀM TĂNG TÍNH KHẢ KIỂM THỬ 15
2.1 Tính khả kiểm thử của tài liệu đặc tả 15
2.2 Tính khả kiểm thử của thiết kế kiến trúc 18
2.3 Tính khả kiểm thử của thiết kế chi tiết 22
2.4 Kiểm thử xây dựng sẵn 22
2.5 Khung và công cụ hỗ trợ kiểm thử 23
2.6 Tổng kết 27
sCHƯƠNG 3 TÍNH KHẢ KIỂM THỬ CỦA ỨNG DỤNG TRÊN NỀN WEB 28
3.1 Đặc trưng chính của các ứng dụng trên nền web 28
3.2 Tính khả kiểm thử của các ứng dụng trên nền web 31
3.2.1 Khía cạnh là một phần mềm 31
3.2.2 Tính khả kiểm thử cho phần máy chủ 32
3.2.3 Tính khả kiểm thử cho phần trình duyệt 35
KẾT LUẬN 44
TÀI LIỆU THAM KHẢO 45
Trang 7DANH MỤC CÁC KÝ HIỆU , THUẬT NGỮ, CHỮ VIẾT TẮT
2 SOAP Simple Object Access Protocol – Giao thức truy
cập đối tƣợng đơn giản
Trang 8DANH MỤC CÁC BẢNG
Bảng 1 Kịch bản thuộc tính chất lƣợng dạng bảng 19Bảng 2 Một số công cụ và khung kiểm thử 26Bảng 3 Url có ngữ nghĩa 33
Trang 9DANH MỤC CÁC HÌNH VẼ
Hình 1 Ví dụ về một file log 8
Hình 2 Chạy javac ở chế độ thường và chế độ verbose 9
Hình 3 Sáu yếu tố ảnh hưởng đến tính khả kiểm thử 10
Hình 4 Một kịch bản thuộc tính chất lượng cho tính khả kiểm thử 18
Hình 5 Các chiến thuật khả kiểm thử 20
Hình 6 Kiến trúc của mô-đun với mã tự kiểm tra [13] 23
Hình 7 Công cụ hỗ trợ lấy thông tin về ứng dụng 24
Hình 8 Kiến trúc chung của ứng dụng web 29
Hình 9 Mô hình tổng quát của các ứng dụng trên nền web 31
Hình 10 Ví dụ url 33
Hình 11 Màn hình SOAP UI 35
Hình 12 WebDriver 36
Hình 13 Ví dụ sử dụng Selenium với Java 36
Hình 14 Một đoạn mã HTML của trang web asp.net 38
Hình 15 Một đoạn mã HTML của trang web ruby-lang 39
Trang 11PHẦN MỞ ĐẦU
Tính cấp thiết và mục tiêu của đề tài
Sự phát triển và lan tỏa rộng rãi của Internet trên toàn cầu những năm gần đây là cơ sở đánh dấu cho sự bùng nổ mạnh mẽ của các ứng dụng được viết trên nền web Các ứng dụng này có sự tăng mạnh về số lượng cũng như doanh thu
Do đó để có sự canh tranh cao, các công ty phần mềm đang không ngừng tìm cách cải tiến chất lượng ứng dụng, giảm chi phí, đồng thời đẩy nhanh tốc độ xây dựng ứng dụng
Làm việc trong một đơn vị xây dựng phần mềm trong gần năm năm, tôi
đã tham gia vào không ít dự án với vai trò là kỹ sư kiểm thử, trưởng nhóm kiểm thử và nhận thấy nỗ lực kiểm thử và sửa lỗi của các dự án quá lớn (chiếm tới 60-70% nỗ lực cả dự án) Và các nỗ lực này tập trung nhiều nhất ở hai giai đoạn kiểm thử là kiểm thử chức năng và kiểm thử hồi quy
Ngoài nỗ lực kiểm thử lớn, tác giả còn nhận thấy có nhiều lỗi tiềm ẩn mà trong quá trình kiểm thử rất khó hoặc gần như không có khả năng tìm ra Thông qua đề tài này, tôi mong muốn tìm ra phương pháp để việc kiểm thử dễ dàng thực hiện hơn, tránh được các lỗi tiềm ẩn nhằm giảm bớt các thiệt hại do lỗi không được phát hiện gây ra, đồng thời là cơ sở để giảm nỗ lực, chi phí cho việc kiểm thử
Phương pháp nghiên cứu
Để đề tài đạt được kết quả như mục tiêu đặt ra, trong luận văn tôi đã đề xuất và áp dụng các phương pháp nghiên cứu như sau:
- Nghiên cứu tài liệu: Nghiên cứu các khái niệm về tính khả kiểm thử và tập
trung vào các kỹ thuật làm tăng tính khả kiểm thử Đây là mảng kiến thức
mà các nghiên cứu trên thế giới vẫn còn hạn chế, các khái niệm còn chưa
Trang 12có sự thống nhất do đó đòi hỏi nhiều kiến thức nền tảng để lựa chọn thông tin cho phù hợp với mục tiêu đặt ra ban đầu
- Phân tích và áp dụng: Qua việc phân tích các đặc thù của ứng dụng web
tôi đưa ra một số chú ý để tăng tính khả kiểm thử cho lớp ứng dụng này Các đề xuất này được trao đổi với các đồng nghiệp để nhận được góp ý từ đội phát triển phần mềm, gồm cả lập trình viên, kiểm thử viên
Bố cục của luận văn
Phần còn lại của luận văn được trình bày theo các phần chính sau:
Chương 1: Tổng quan Chương này trình bày một số kiến thức cơ
sở về tính khả kiểm thử như các khái niệm, các yếu tố ảnh hưởng đến tính khả kiểm thử, lợi ích khi chúng ta chú ý đến tính khả kiểm thử
Chương 2: Kỹ thuật làm tăng tính khả kiểm thử Chương này
trình bày một số khái niệm về tính khả kiểm thử thông qua các độ
đo cấu trúc thiết kế và chương trình Chương này cũng trình bày
một số kỹ thuật điển hình nhằm tăng tính khả kiểm thử của một hệ thống phần mềm nói chung
Chương 3: Tính khả kiểm thử của ứng dụng trên nền web
Chương này phân tích đặc điểm của ứng dụng web và đề xuất một
số điểm quan trọng cần chú ý để tăng tính khả kiểm thử của các ứng dụng web nói chung
Kết luận: Tổng hợp các kết quả đạt được, tồn tại và hướng mở
rộng của đề tài
Trang 13CHƯƠNG 1 TỔNG QUAN
Trong chương này, chúng ta sẽ xem xét các khái niệm cơ bản nhất khi nói
về tính khả kiểm thử [1] Bao gồm các khái niệm, tầm quan trọng, các yếu tố tác động đến tính khả kiểm thử Mục tiêu là để cho người đọc có cái nhìn tổng quan nhất về tính khả kiểm thử
1.1 Tầm quan trọng của tính khả kiểm thử
Tính khả kiểm của phần mềm là một trong những khái niệm quan trọng trong thiết kế và kiểm thử chương trình và các thành phần phần mềm Xây dựng các chương trình và các thành phần với tính khả kiểm thử cao luôn luôn làm đơn giản hóa việc thực hiện kiểm thử, giảm chi phí kiểm thử và tăng chất lượng phần mềm Chi phí kiểm thử đang chiếm khoảng 50% chi phí sản xuất một phần mềm Tăng tính khả kiểm thử là điều kiện cần thiết để giảm tận gốc chi phí kiểm thử phần mềm nói riêng và chi phí sản xuất phần mềm nói chung
Một số chuyên gia kiểm thử và phát triển phần mềm đã chỉ ra tầm quan trọng của tính khả kiểm thử và thiết kế, đặc biệt là đối với các hệ thống lớn:
Trong quá trình phân tích thiết kế một hệ thống, chúng ta không chỉ cần quan tâm đến tính khả thi (có thể xây dựng được) mà còn phải chú ý đến tính khả kiểm thử của chúng
Bỏ qua việc thiết kế để có khả năng kiểm thử cao trong các hệ thống lớn có thể làm giảm hiệu quả kiểm thử rất nhiều [2]
Tầm quan trọng của tính khả kiểm thử phần mềm đối với một hệ thống phần mềm nào đó tỷ lệ thuận với:
Kích thước và độ phức tạp của hệ thống
Trang 14 Các rủi ro đối với cuộc sống và kinh doanh nếu có lỗi không được phát hiện
Tần suất của các hoạt động kiểm thử
Vòng đời của hệ thống (giả sử rằng kiểm thử hồi quy và bảo trì là nhiệm vụ thường xuyên)
Tính khả kiểm thử rất quan trọng đối với kiểm thử viên và lập trình viên
vì nó giúp họ kiểm soát được nỗ lực kiểm thử Khách hàng cũng sẽ được lợi ích nếu chất lượng sản phẩm cao hơn và tốc độ sửa lỗi nhanh hơn Những tính chất của tính khả kiểm thử như: xây dựng mã nguồn phục vụ kiểm thử tự động, báo cáo lỗi tự động, và khả năng chuẩn đoán lỗi bên trong (built-in diagnostic) sẽ cung cấp thông tin nhanh hơn, tốt hơn về nguyên nhân lỗi và do đó giúp đẩy nhanh tiến độ sửa lỗi
Sau khi đã ước lượng, tính toán được tính khả kiểm thử của một hệ thống,
ta có thể đưa ra các thông tin hữu ích cho kiểm thử viên, lập trình viên và quản trị dự án nhằm mục đích:
Tập trung vào các thành phần có tính khả kiểm thấp – xem xét mã nguồn, phân tích hình thức, tiêu chuẩn kiểm thử cao hơn
Thay đổi các thành phần có tính khả kiểm thấp để tăng tính khả kiểm
Tự tin hơn với các thành phần có tính khả kiểm cao
Phân tích rủi ro đối với các thành phần có tính khả kiểm thấp để xác định các rủi ro của hệ thống cũng như tìm ra nguyên nhân gốc
1.2 Khái niệm tính khả kiểm thử
Khi phát triển một phần mềm chúng ta không chỉ tạo ra phần chương trình mà thường tạo ra nhiều sản phẩm trung gian khác như các tài liệu đặc tả yêu cầu, tài liệu thiết kế, mã nguồn và chương trình phần mềm Tiếng Anh dùng
từ artifact để chỉ chung các sản phẩm này Tính khả kiểm thử là các đặc tính của các artifact mà các đặc tính này ảnh hưởng đến sự dễ dàng đạt được các mục
Trang 15tiêu kiểm thử Nó được định nghĩa là “mức độ mà một artifact phần mềm tạo điều kiện cho việc kiểm thử” [3]
Định nghĩa này cho ta thấy:
Không chỉ mã nguồn hay bản chạy chương trình ảnh hưởng đến kiểm thử mà là toàn bộ các artifact tạo ra trong quá trình phát triển phần mềm đều có vài trò quan trọng
Liệu một artifact có tạo điều kiện cho việc kiểm thử hay không chỉ
có thể được xác định trong ngữ cảnh kiểm thử, ví dụ, với mục tiêu, nguồn lực, kỹ thuật và công cụ kiểm thử
Chúng ta xem một ví dụ để hiểu rõ hơn khái niệm tính khả kiểm thử này Một artifact mô tả một giao diện phần mềm sẽ hỗ trợ việc kiểm thử hộp đen và
nó không hỗ trợ kiểm thử hộp trắng vì giao diện không nêu cấu trúc của cài đặt (implementation) của giao diện đó Nếu mục tiêu kiểm thử không phải là đạt được một mức độ bao phủ kiểm thử hộp trắng, ví dụ bao phủ 100% dòng lệnh, thì mô tả giao diện không có ảnh hưởng gì nhiều đến việc đạt mục tiêu
Ngoài định nghĩa về tính khả kiểm thử trên có một số định nghĩa khác về tính khả kiếm thử Theo [4], tính khả kiểm thử là sự dễ dàng và chi phí tương đối để tìm ra lỗi phần mềm
Theo thuật ngữ của IEEE [5], tính khả kiểm thử gồm:
“mức độ dễ dàng thiết lập các tiêu chuẩn kiểm thử và thực thi kiểm thử của một hệ thống hay một thành phần hệ thống để xác định xem các tiêu chuẩn đó có được thỏa mãn không.”
“mức độ cho phép thiết lập các tiêu chuẩn kiểm thử và thực thi kiểm thử đối với một yêu cầu để xác định xem các tiêu chuẩn đó có được thỏa mãn không”
Theo chuẩn ISO về chất lượng sản phẩm phần mềm [6], tính khả kiểm thử là tập các thuộc tính có liên quan đến nỗ lực cần thiết để thẩm định (validate) một phần mềm đã sửa đổi
Trang 16Như vậy chúng ta có thể thấy, về cơ bản, tính khả kiểm thử đều được hiểu
là mức độ dễ dàng để thực hiện việc kiểm thử hay mức độ dễ dàng để tìm ra lỗi của hệ thống phần mềm Các việc kiểm thử không chỉ áp dụng cho chương trình phần mềm mà còn cả các sản phẩm trung gian như tài liệu yêu cầu, thiết kế, v.v Tuy nhiên, các định nghĩa vẫn có những chi tiết khác nhau về định nghĩa một hệ thống thế nào là có tính khả kiểm thử cao Trong chương sau, chúng ta sẽ nghiên cứu cụ thể hơn về một trong những cách để đo đạc một cách định lượng tính khả kiểm thử của một hệ thống
1.3 Các khái niệm liên quan tính khả kiểm thử
Khả năng kiểm soát và khả năng quan sát là hai khái niệm mấu chốt của tính khả kiểm thử [4] Để kiểm thử một thành phần, ta cần phải kiểm soát được đầu vào và quan sát được đầu ra Khả năng kiểm soát là khả năng điều khiển dễ dàng đầu vào để chuyển phần mềm đến một trạng thái cụ thể nào đó Còn khả năng quan sát liên quan đến mức độ dễ dàng trong việc quan sát kết quả đầu ra
và các thay đổi về trạng thái của phần mềm Nếu không có được hai khả năng này, việc cải tiến khả năng kiểm thử hệ thống là rất khó thực hiện Hay nói cách khác, một thành phần của phần mềm được gọi là khả kiểm thử nếu nó có hai thuộc tính này
Khả năng kiểm soát là khả năng điều khiển các thành phần của phần
mềm đến các trạng thái mong muốn thông qua các giá trị đầu vào Giá trị đầu vào có thể là các biến của hàm/phương thức, lấy từ tương tác của người dùng thông qua giao diện phần mềm hoặc các tương tác bên trong/bên ngoài của ứng dụng, được lưu trữ, thao tác trong các biến và có khả năng thay đổi tùy vào phạm vi của biến
Trạng thái phần mềm là một tập các biến và các giá trị tương ứng tại một thời điểm nhất định Trong một mô-đun hay một đơn vị chương trình, có thể có
vô số các trạng thái này, tuy nhiên chỉ một tập nhỏ các kết hợp là có ý nghĩa và được quan tâm Ví dụ phần mềm thao tác trên tài khoản ngân hàng: khi chủ tài khoản rút tiền, phần mềm sẽ đánh dấu trạng thái tài khoản đó là „đang hoạt động‟ khi hoàn tất giao dịch Nếu là thẻ tín dụng, sự thay đổi trạng thái tài
Trang 17khoản chỉ được chủ thẻ để ý khi tài khoản không còn đủ tiền so với số tiền khách rút Tài khoản khi đó có thể được đánh dấu là rút quá (overdrawn) Khả năng thao tác trên các đầu vào và quan sát trạng thái dễ dàng sẽ giúp đội phát triển có thể tạo ra một bộ kiểm thử tự động hiệu quả
Khả năng quan sát là khả năng nhìn được phản ứng của hệ thống đối
với các đầu vào và theo dõi được các thay đổi trạng thái của phần mềm Thường thì ta có thể thấy đầu ra của hệ thống, tuy nhiên, có nhiều phản ứng hay trạng thái trung gian có thể không đúng và ta thường không nhìn thấy Ba điều kiện cần để một lỗi xuất hiện là: (1) chạy mã nguồn có lỗi; (2) mã nguồn lỗi đó dẫn đến 1 trạng thái dữ liệu sai; (3) trạng thái sai này được nhìn thấy Khả năng quan sát là sự dễ dàng để của hệ thống giúp chúng ta xem được cả các trạng thái trung gian mà bình thường không quan sát được
Thực hiện các phương pháp để tăng khả năng quan sát các trạng thái sẽ giúp phát hiện các lỗi tiềm ẩn của chương trình Khả năng quan sát do đó có liên quan đến thể hiện của kết quả kiểm thử phần mềm Có thể tăng cường khả năng quan sát của phần mềm bằng nhiều cách: ghi log, truy vết, chèn mã (code instrumentation), thăm dò và chèn các câu lệnh in ra màn hình vào mã nguồn
Ví dụ khi lập trình chúng ta ghi ra các file log một số cột mốc của hệ thống, như bắt đầu một hàm, kết thúc một hàm, hoặc một sự kiện nào đó, thì khi xem lại các file log này để giúp quan sát bên trong hệ thống thì chúng ta đã tăng khả năng quan sát của phần mềm Hình 1 là một ví dụ về log hệ thống cho thấy các thông tin chi tiết về hoạt động của hệ điều hành
Trang 19Ở ví dụ này chúng ta có thể thấy khi chạy với tham số verbose, chương trình dịch in rất nhiều thông tin chi tiết từng bước hoạt động bên trong của chương trình dịch, giúp ta quan sát được các thông tin
1.4 Một số yếu tố ảnh hướng đến tính khả kiểm thử
Theo [4] có sáu yếu tố chính ảnh hưởng đến tính khả kiểm thử của một phần mềm Sáu yếu tố tương ứng với các bước chính trong quy trình phát triển phần mềm cơ bản gồm1:
1 http://robertvbinder.com/software-testability-part-2-controllability-and-observability/
C:\Users\thentt>javac HelloWorld.java
C:\Users\thentt>javac -verbose HelloWorld.java
[parsing started RegularFileObject[HelloWorld.java]]
[parsing completed 26ms]
[search path for source files: ]
[search path for class files: C:\Program
Trang 20Hình 3 Sáu yếu tố ảnh hưởng đến tính khả kiểm thử
Yếu tố về tài liệu mô tả: Hành vi và kiến trúc phần mềm có thể được tài
liệu hóa dưới dạng các đặc tả yêu cầu, cách nhìn kiến trúc, mô hình thiết kế chi tiết và các giả thuật toán Sự rõ ràng và ngắn gọn của tài liệu này có thể hỗ trợ tính khả kiểm thử Một số đặc điểm của tài liệu làm tăng khả năng kiểm thử bao gồm: các yêu cầu được mô tả rõ ràng, không mơ hồ, có tính khả thi khi sinh ca kiểm thử từ yêu cầu, thiết kế chi tiết triệt để, khả năng lưu vết khi cài đặt và phân chia chức năng một cách tách bạch
Yếu tố về cài đặt: Phần mềm được cài đặt với nhiều ngôn ngữ lập trình
và mô hình khác nhau Các tính năng có sẵn trong những ngôn ngữ và mô hình này làm cho việc kiểm thử khó khăn hơn hay dễ dàng hơn phụ thuộc vào cách chúng được sử dụng Ví dụ, trong các hệ thống hướng đối tượng, thừa thế là một đặc tính có thể gây khó khăn cho việc kiểm thử nếu cây thừa kế có nhiều mức vì các lớp ở mức thấp hơn cần phải hoạt động giống với các lớp ở mức cao hơn
Yếu tố về kiểm thử kèm theo: Mã nguồn được viết thêm các lệnh để
kiểm tra tính chất của dữ liệu nhằm giảm bớt công việc kiểm thử Nó giúp hệ thống có khả năng tự kiểm tra và những kiểm tra này không là các tính năng được mô tả trong đặc tả của phần mềm Ví dụ, các lệnh assert trong các ngôn ngữ lập trình hiện đại nhằm giúp viết các lệnh kiểm tra này dễ dàng hơn
Trang 21Ví dụ sau thể hiện việc sử dụng lệnh assert để kiểm tra giá trị của biến truyền vào nằm trong khoảng hợp lệ
6 private void setRefreshInterval(int interval) {
7 // Confirm adherence to precondition in nonpublic method
8 assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE :
interval;
9 // Set the refresh interval
10 }
Yếu tố về bộ kiểm thử: Bộ kiểm thử là một tập các ca kiểm thử và các
bước để thực hiện các ca kiểm thử đó Bộ kiểm thử hướng dẫn cách để dự đoán các kết quả kiểm thử, do đó nó giúp cho việc kiểm thử hệ thống dễ dàng hơn
Bộ kiểm thử cũng được sử dụng lại mỗi khi kiểm thử hồi quy một hệ thống Nếu việc kiểm thử hồi quy này được thực hiện tự động một cách hiệu quả thì rõ ràng nó giúp tiết kiệm các chi phí và nỗ lực kiểm thử Bộ kiểm thử nếu được tổ chức một cách khoa học và có khả năng mở rộng sẽ làm tăng hiệu quả của công việc kiểm thử
Yếu tố về công cụ kiểm thử: Có các công cụ thực thi các kịch bản kiểm
thử tự động, ghi lại các bước thực thi, lưu thông tin trạng thái và thông tin, sau
đó báo cáo kết quả kiểm thử làm cho việc kiểm thử dễ dàng hơn rất nhiều Đặc biệt là giảm bớt nỗ lực kiểm thử trong giai đoạn kiểm thử hồi quy
Nếu hệ thống cho phép áp dụng dễ dàng các công cụ kiểm thử tự động và thay đổi dễ dàng bộ kiểm thử khi chương trình thay đổi thì rõ ràng nó có ảnh hưởng tích cực đến khả năng kiểm thử hệ thống
2 http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html
Trang 22Yếu tố về quy trình kiểm thử: Nên có một cam kết đối với việc kiểm
thử phần mềm của đơn vị sản xuất phần mềm Điều này phản ánh trong nguồn lực liên quan đến kiểm thử như nhân sự thực hiện, chiến lược kiểm thử hệ thống
và việc tích hợp công việc kiểm thử trong suốt quy trình phát triển
1.5 Một số độ đo tính khả kiểm thử
Theo Binder [4] khả năng kiểm thử được đánh giá hay đo dựa trên các độ
đo của chương trình phần mềm là độ phức tạp cấu trúc và hành vi, và độ phức tạp luồng dữ liệu Độ đo cấu trúc và hành vi thể hiện các thành phần phần mềm trong hệ thống và quan hệ, tương tác giữa chúng Độ đo luồng dữ liệu mô tả sự phức tạp của các đường đi dữ liệu di chuyển trong hệ thống
1.5.1 Độ đo cấu trúc và hành vi
Chúng ta biết rằng khi thiết kế một phần mềm chúng ta thường thể hiện bằng các mô hình, gồm các thành phần và liên kết giữa chúng (về cấu trúc), cũng như tương tác giữa các thành phần đó trong quá trình hoạt động của phần mềm (về hành vi) Các mô hình cấu trúc và hành vi này cuối cùng sẽ được chuyển sang bước cài đặt chương trình phần mềm Các mô hình và chương trình đều có thể được sử dụng để phục vụ công việc kiểm thử nên chúng ảnh hưởng trực tiếp đến mức độ dễ dàng để thực hiện việc kiểm thử Các tài liệu và mã nguồn phần mềm này sẽ được phân tích để chọn ra các thuộc tính dùng làm độ
đo để đo lường tính khả kiểm thử
Ngôn ngữ mô hình hóa thống nhất UML là một ngôn ngữ mô hình hóa phổ biến để mô tả cấu trúc và hành vi phần mềm Qua nghiên cứu, người ta thấy rằng, các mô hình lớp và mô hình trạng thái trong UML là hai mô hình chính ảnh hướng đến tính khả kiểm thử nên chúng được tập trung phân tích khi nói đến khả năng kiểm thử Các mô hình này có thể gây khó khăn cho việc kiểm thử
do các tác động phụ phát sinh khi các đối tượng tương tác với nhau
Ví dụ, một đối tượng thay đổi trạng thái của một đối tượng khác qua nhiều cách (đường) khác nhau Những khu vực này cần được chú ý để cải thiện
Trang 23tính khả kiểm thử Hình 2 mô tả một ví dụ của các tương tác lớp có thể dẫn đến các tương tác đối tượng như vậy Trong hình này một đối tượng của lớp C có thể tương tác ngầm với một đối tượng của lớp D, hoặc trực tiếp thông qua quan
hệ lớp hoặc gián tiếp thông qua phân cấp kế thừa các lớp A, A2 hoặc A21
Hình 2 Tương tác lớp dẫn đến các tương tác đối tượng
Độ phức tạp của các tương tác được mô hình hóa bởi biểu đồ lớp này có thể là cơ sở để đo tính khả kiểm thửu của phần mềm Ở mức mã nguồn chương trình, việc phân tích tĩnh mã nguồn cũng có thể cung cấp một thông tin về độ đo tính khả kiểm thử
Phân tích tĩnh mã nguồn cũng được sử dụng để dự đoán tính khả kiểm của các lớp trong một hệ thống hướng đối tượng Chẳng hạn, để phân tích mối tương quan giữa các thuộc tính hướng đối tượng với kích thước bộ kiểm thử, có thể sử dụng hai độ đo là độ đo về độ sâu của cây phân cấp, số dòng lệnh cho mỗi lớp, và số con của một lớp và độ đo về số lượng ca kiểm thử Hay nói khác
đi, hai độ đo này có thể trả lời câu hỏi các thuộc tính hướng đối tượng có ảnh hưởng gì đến số lượng và độ phức tạp của các ca kiểm thử
1.5.2 Độ đo luồng dữ liệu
Độ đo luồng dữ liệu dựa vào luồng dữ liệu đi các thành phần của phần mềm để đánh giá/đo tính khả kiểm thử Các mô hình luồng dữ liệu cho thấy dữ liệu trong hệ thống di chuyển theo các đường như thế nào Các độ đo luồng dữ liệu có thể dựa trên việc phân tích các mô hình luồng dữ liệu hoặc mã nguồn
Trang 24chương trình Các kỹ thuật phân tích luồng dữ liệu đã được sử dụng trong các trình biên dịch để thực hiện phân tích tĩnh mã nguồn và xác định đường đi dữ liệu trong phần mềm
Theo [7] một kỹ thuật đồ thị được gọi là đồ thị chuyển thông tin – Information Transfer Graph (ITG) được sử dụng để phân tích luồng dữ liệu trong các thành phần phần mềm Một ITG được tạo ra suốt quá trình phân tích một mô hình luồng dữ liệu Một luồng được định nghĩa là sự chuyển động/sự thay đổi của dữ liệu từ đầu vào, xuyên suốt một số các thành phần, đến một đầu
ra của hệ thống Bài báo cũng đưa ra nhiều độ đo khả kiểm thử
Ví dụ tính khả kiểm thử của các cặp def-use (từ lúc biến được gán giá trị - def, đến lúc giá trị của biến được sử dụng use) được đo bằng nghịch đảo của tổng số cặp def-use trong chương trình Dễ thấy giá trị này càng cao có nghĩa chương trình càng dễ kiểm thử
1.6 Kết chương
Chương này tóm tắt khái quát một số độ đo của tính khả kiểm thử một phần của phần mềm Để giảm chi phí và tăng hiệu quả kiểm thử, việc đo đạc và tăng tính khả kiểm thử cần được thực hiện càng sớm càng tốt để tránh phải thiết
kế lại hoặc cài đặt lại về sau Điều này có nghĩa chúng ta phải chú ý tính khả kiểm thử của tài liệu đặc tả đầu tiên, tiếp đó là phải chú ý đến tính khả kiểm thử của thiết kế, rồi mới đến tính khả kiểm thử mã nguồn, v.v
Ở mỗi giai đoạn của quá trình phát triển phầm mềm lại có nhiều độ đo khác nhau nên việc chọn một độ đo phù hợp là việc cần phân tích, cân nhắc Một số độ đo phức tạp nhưng phản ánh chính xác hơn tính khả kiểm thử, một số
độ đo lại đơn giản nhưng đánh giá khá thô tính khả kiểm thử Chúng ta cần chọn
độ đo cân bằng giữa nhu cầu khả kiểm thử của từng giai đoạn và công sức bỏ ra
để thực hiện việc tính toán, đo đạc các độ đo này
Trang 25CHƯƠNG 2 KỸ THUẬT LÀM TĂNG TÍNH KHẢ KIỂM THỬ
Chương trước đã nói về các độ đo được sử dụng để làm giảm công việc kiểm thử phần mềm Tuy nhiên, bản thân phép đo tính khả kiểm không làm cho phần mềm có khả năng kiểm thử hơn mà là giúp đánh giá chất lượng của việc phát triển để hướng tới việc nâng cao yếu tố chất lượng này, tức là nâng cao tính khả kiểm thử Trong chương này, chúng ta sẽ xem xét một số kỹ thuật có thể được sử dụng để cải tiến tính khả kiểm thử phần mềm dựa trên [4] Độ đo tính khả kiểm thử là một thước đo giúp chúng ta biết đã cải tiến được bao nhiêu
Thiết kế phần mềm là bước xây dựng các tài liệu như đặc tả yêu cầu, khung nhìn kiến trúc và các mô hình thiết kế chi tiết Các tài liệu này cuối cùng
sẽ được dùng trong pha kiểm thử phần mềm vì nó mô tả các hành vi và đặc tính mong muốn của phần mềm Chất lượng của mỗi tài liệu này sẽ giúp cho bước cài đặt, bước kiểm thử thực hiện ở giai đoạn sau thực hiện dễ dàng hơn Tuy nhiên, đối với mỗi tài liệu sẽ có sự tương tác riêng đến khả năng kiểm thử mà ta cần xem xét cụ thể, chi tiết
2.1 Tính khả kiểm thử của tài liệu đặc tả
Một trong những giai đoạn đầu của thiết kế phần mềm là mô tả yêu cầu
kỹ thuật Yêu cầu kỹ thuật mô tả các chức năng hệ thống phải thực hiện, các đặc điểm đáng chú ý về và cần thiết của hệ thống, các ràng buộc về hoạt động của
Trang 26thuật hơn Tuy nhiên, nó vẫn chỉ mô tả chức năng và các ràng buộc nhìn từ phía ngoài của hệ thống chứ chưa nêu chi tiết cần cài đặt như thế nào
Các yêu cầu hệ thống này có thể được viết bằng các đặc tả ngôn ngữ có cấu trúc, sử dụng các biểu mẫu với các trường dữ liệu chuẩn Ngoài ra, tài liệu yêu cầu hệ thống còn thường mô tả các trường hợp/ca sử dụng (use case) và biểu đồ tuần tự Tài liệu này là đặc tả yêu cầu phần mềm (SRS - Software Requirements Specification)
Các yêu cầu hệ thống thường không được sử dụng để thiết kế và cài đặt phần mềm ngay, mà trước khi đó chúng ta cần kiểm tra/kiểm thử tính đúng đắn
và chất lượng của chúng, để các việc phát triển sau đó được thuận lợi hơn Do
đó để tăng tính khả kiểm thử, các tài liệu yêu cầu cần được viết rõ ràng, không
mơ hồ để tránh bị người lập trình và người thiết kế hiểu sai hay hiểu không
Với các qui trình phát triển hiện đại ngày nay người ta thường lấy các ví
dụ trong qua trình thu thập yêu cầu để sử dụng chúng làm ca kiểm thử Các ví
dụ này cũng giúp cả người khách hàng và đội phát triển cùng hiểu đúng yêu cầu cần đạt của các chức năng phần mềm Theo phương pháp phát triển hướng hành
vi [8] (BDD -behaviour driven development) người ta còn sử dụng một ngôn ngữ chuyên dụng là gherkin3 để viết các kịch bản làm ví dụ cho các tính năng của sản phẩm như ví dụ sau
3 http://cukes.info/gherkin.html
Trang 27Ở ví dụ này tính năng quản lý tài khoản (Password mangement) có một kịch bản (ví dụ) khi người sử dụng có email cukes@cukes.info quên mật khẩu
và chọn chức năng reset thì hệ thống sẽ gửi email với link để đặt lại mật khẩu mới cho người dùng
Thông thường một tính năng (feature) này có thể có nhiều kịch bản (scenario) chính là các ví dụ hay tương đương một ca kiểm thử Theo cách này chúng ta vừa sử dụng mô tả này làm tài liệu yêu cầu, đồng thời cũng sử dụng nó
để viết kiểm thử chấp nhận hay kiểm thử chức năng ở mức người sử dụng và chúng sẽ được chạy tự động
Lỗi về giao diện phần mềm (không phải giao diện người dùng) là một trong những vấn đề phổ biến nhất trong quá trình xây dựng phần mềm Do đó chúng ta cần tập trung đặc biệt vào đặc tả giao diện khi xây dựng đặc tả yêu cầu
kỹ thuật Đặc tả giao diện phải được mô tả rõ ràng trong tài liệu đặc tả yêu cầu Đặc tả giao diện bao gồm: các đặc tả thủ tục/hàm (giao diện lập trình ứng dụng, API) và các cấu trúc dữ liệu Giao diện phải được đặc tả cho cả hệ thống đang thiết kế và các hệ thống đã có mà sẽ tương tác với hệ thống này
Các yêu cầu được sử dụng để tạo ra các artifact như thiết kế, cài đặt, các
ca kiểm thử, v.v Nếu chúng ta lưu giữ thông tin yêu cầu nào được thể hiện ở trong artifact nào thì việc này giúp chúng lần xuôi, và lần ngược lại giữa các artifact để kiểm tra xem thiết kế có phù hợp với yêu cầu Tương tự, chúng ta có thể biết mô-đun nào cài đặt yêu cầu nào theo thiết kế nào Khái niệm này gọi là khả năng truy vết (traceability) Khả năng truy vết là cơ sở để kiểm tra chất lượng sản phẩm và là phương tiện để chứng minh rằng các yêu cầu đã được
Feature: Password management
Scenario: Forgot password
Given a user with email " cukes@cukes.info " exists
When I ask for a password reset
Then an email with a password reset link should be sent
Trang 28hiểu rõ, tuân thủ và không có các tính năng/chức năng thừa, không cần thiết Khả năng truy vết cho biết các ca kiểm thử đã được tạo ra ở giai đoạn mô tả yêu cầu có thể được thực hiện trên phần mềm Nói cách khác, khả năng truy vết hỗ trợ đắc lực cho việc tăng tính khả kiểm thử của hệ thống
2.2 Tính khả kiểm thử của thiết kế kiến trúc
Kiến trúc phần mềm của một hệ thống tính toán là cấu trúc tổng thể của
hệ thống, bao gồm các thành phần của hệ thống, các quan hệ/liên kết giữa các thành phần đó và các thuộc tính có thể quan sát từ bên ngoài của các thành phần
và các liên kết đó [9] Kiến trúc tập trung giải quyết các yêu cầu chất lượng như hiệu năng (performance), tính dễ dùng (usability), độ an toàn (security), của hệ thống Tính khả kiểm thử cũng là một trong các thuộc tính chất lượng của hệ thống phần mềm
Thông thường người khách hàng không đưa ra được các yêu cầu thuộc tính chất lượng cụ thể chính xác Việc này sẽ gây khó khăn khi bàn giao, nghiệm thu sản phẩm Do đó khi xác định yêu cầu chất lượng người ta sử dụng các kịch bản thuộc tính chất lượng Một kịch bản thuộc tính chất lượng là một yêu cầu chất lượng cụ thể, nó thường gồm sáu yếu tố sau đây: tác động, nguồn tác động, môi trường, thành phần của hệ thống (artifact), phán ứng cần có, lượng hóa phản ứng bằng giá trị cụ thể Ví dụ về một kịch bản thuộc tính chất lượng khả năng kiểm thử như trong Bảng 1 hay tương đương là Hình 4 [9]
Hình 4 Một kịch bản thuộc tính chất lượng cho tính khả kiểm thử