Xem mẫu
- Hà Thị Minh Phương 259
Tái cấu trúc mã Javascript trong kiểm thử tự động
trên Selenium Framework
Hà Thị Minh Phương
Khoa Công nghệ Thông tin và Truyền thông, Đại học Đà Nẵng
htmphuong@sict.udn.vn
Tóm tắt. Kịch bản kiểm tra tự động đóng một vai trò quan trọng trong kiểm thử tự động.
Kiểm thử tự động đã trở thành một chủ đề nghiên cứu nóng trong ứng dụng Web để tăng
chất lượng kiểm thử. Để tái cấu trúc mã JavaScript của ứng dụng Web được thuận tiện hơn,
một cách tiếp cận tạo ra các kịch bản tự động từ trường hợp kiểm thử - test case được xác
định sẽ giới thiệu trong bài báo này. Trước tiên, nó mô tả các trường hợp kiểm thử sử dụng
định dạng XML. Sau đó, Selenium là một framework - nền tảng hỗ trợ nhiều trình duyệt
kiểm thử, một phương pháp để chuyển đổi mô tả XML vào các tập lệnh kiểm tra dựa
trên khung Selenium cũng được đề xuất để phục vụ cho việc kiểm thử tự động trên ứng
dụng Web.
Từ khóa: kiểm thử tự động, tái cấu trúc, XML, JavaScript, Selenium.
1 Đặt vấn đề
Hiện nay các ứng dụng Web đang dần dần được phổ biến nhiều hơn hơn các ứng dụng
Winform, các trình duyệt Web dựa trên các chuẩn của HTML5 và CSS3. Điều này cho việc lập
trình giao diện người dùng trong các ứng dụng Web trở nên dễ dàng và thuận lợi hơn. Mặc dù
sự phát triển nhanh chóng của công nghệ, nếu chương trình vẫn được lập trình bằng tay thay vì
tự động tạo ra, mã phải được sắp xếp lại, điều này đòi hỏi sự cải thiện chất lượng phần mềm
phải được tăng lên. Để phát hiện và sửa những lỗi, các kỹ sư có ít lựa chọn để thông qua kịch
bản kiểm thử sử dụng các trình gỡ lỗi [1]. Tuy nhiên, vấn đề tương thích của nhiều trình duyệt
vẫn gây phiền hà cho các nhà phát triển và người kiểm thử, khi thiết kế và lập trình các trang
web bằng kỹ thuật JavaScript với mỗi trình duyệt có thể phải có bộ phân tích HTML / CSS và
công cụ JavaScript của chính nó. Đây một thách thức lớn đối với đảm bảo chất lượng và bảo trì
phần mềm, cần thiết phải ứng dụng web để tái cấu trúc mã JavaScript khi xem xét việc chuyển
ứng dụng web giữa các trình duyệt.
Martin Fowler [2] đã chỉ ra unit test – kiểm thử đơn vị là điều kiện tiên quyết cho việc tái
cấu trúc ứng dụng Web. Đối với việc tái cấu trúc mã, bước quyết định là xây dựng một bộ hệ
thống unit test hoàn chỉnh, nếu không thì không có sự thay đổi của các hàm chương trình trước
và sau khi tái cấu trúc, đây sự khó khăn để đảm bảo cho lập trình hiệu quả. Để đảm bảo chất
lượng phần mềm khi tái cấu trúc, unit test là một phần tất yếu. Tuy nhiên, functional function –
kiểm thử chức năng hiệu quả và có ích hơn đối với JavaScript hơn là unit test [3]. Các lý do để
giải thích cho việc này như sau: Một là các unit test được sử dụng trong các mô-đun logic mà
các thuật toán được thực hiện. Unit test chỉ chỉ giám sát kết quả kiểm tra và đánh giá nó đúng
hay sai giá trị từ kết quả mong đợi, trong khi mã JavaScript có thể thực hiện hiệu quả trong các
trang Web. Hai là, mã JavaScript nên được tương thích với mỗi trình duyệt khác nhau. Một
trang Web có thể hiển thị trong các trình duyệt khác nhau. Kết luận ở đây là trước khi bắt đầu
tái cấu trúc lại JavaScript, chúng ta cần phải xây dựng và tích hợp hệ thống kiểm thử chức năng
cho ứng dụng Web.
- 260 KỶ YẾU HỘI THẢO KHOA HỌC QUỐC GIA CITA 2017 “CNTT VÀ ỨNG DỤNG TRONG CÁC LĨNH VỰC”
Bài viết này được tổ chức như sau phần I đặt vấn đề, phần II giới thiệu về kiểm thử ứng dụng
Web và tự động hóa dựa trên Selenium. Phần III trình bày ngắn gọn quá trình tự động tạo các
tập lệnh chức năng. Phần IV thảo luận về thuật toán chính và chuyển đổi về việc thay đổi biểu
thức thống nhất thành các tập lệnh thực thi. Phần V đưa ra kết luận và các công trình trong
tương lai.
2 Giới thiệu kiểm thử tự động
Công cụ kiểm thử tự động là cực kỳ quan trọng trong kiểm thử tự động. Các chức năng của
các công cụ này là tương tự. Bên cạnh việc ghi lại hành động của người dùng, cần phải thực
hiện nhiều tính năng hơn, chẳng hạn như thực hiện các kịch bản hành động và tạo ra các kịch
bản kiểm thử. Kiểm thử tự động ứng dụng Web hiện nay chỉ được sử dụng để kiểm tra hồi quy
trong ngành công nghiệp để thực hiện giảm chi phí [4].
Rất nhiều công cụ kiểm tra tự động đã được xuất bản cho các ứng dụng Web, chẳng hạn như
QTP, Win Runner, Robot và Silk Test [5] .etc. Trong lĩnh vực nghiên cứu của MBT, Tuomas,
Tommi và Mika đã thực hiện một framework làm việc bởi cơ chế hướng theo từ khóa, chúng
kết hợp mô hình thử nghiệm trừu tượng với các tập lệnh kiểm tra tại lần đầu tiên[7]. Trên thực
tế, họ tập trung vào những điểm khác nhau với ngữ cảnh kiểm thử hoặc mục đích ứng dụng.
Hình 1 mô tả cấu trúc của framework kiểm thử tự động Selenium ứng dụng Web bao gồm
Selenium Core, Selenium IDE, Selenium RC và Selenium Web Driver. Nó không chỉ mô phỏng
một loạt các hành động của người dùng mà còn phát lại các sự kiện mà người kiểm tra đã thực
hiện trong quá trình thử nghiệm.
Hình 1. Kiến trúc của Selenium framework
1) Selenium Core là công cụ lõi của toàn bộ framework, là một thư viện chức năng, lập trình
bởi JavaScript. Các mô-đun khác của Selenium đều phụ thuộc vào nó. Trong kiến trúc ở trên,
Selenium Core là nền tảng mà nó đưa vào các trang Web kiểm thử hướng dẫn cho các test được
thực thi.
2) Selenium IDE là một trình duyệt plugin trên Firefox. Nó ghi lại và thực hiện các lệnh
Selenium. Các lệnh Selenium có thể dễ dàng chuyển đổi thành tất cả các ngôn ngữ lập trình
được hỗ trợ, giúp người kiểm tra dễ dàng sửa đổi và sử dụng lại các trường hợp kiểm thử
hiện tại.
3) Selenium RC, viết tắt của Remote Control, là một khung hỗ trợ các ngôn ngữ tiên tiến để
gọi Selenium Core, được gọi là API. Nó có một máy chủ Selenium giám sát và nhận các hướng
dẫn được gửi bởi Selenium Client. Sau khi nhận được lệnh, Selenium RC sẽ chuyển đổi các
hướng dẫn vào mã JavaScript cho các trình duyệt khác nhau. Như thể hiện trong hình 2,
- Hà Thị Minh Phương 261
Selenium RC gọi hàm lõi bằng cách chèn mã vào các trang Web. Remote Control hỗ trợ tính
toán lưới. Hơn nữa, kiểm thử Selenium được điều khiển bởi Server cục bộ, trong đó các lệnh
song song có thể được gửi đến các máy chủ sử dụng thuật toán song song khi bạn triển khai
nhiều máy chủ.
Hình 2. Hoạt động của Selenium Remote Control
4) Selenium Web Driver là phiên bản mới nhất (v2.0), khác với Selenium Remote Control.
Vì trình điều khiển Web không đưa các tập lệnh vào các trang Web, việc gọi trình duyệt cần sự
trợ giúp của các API bản địa [6]. Nó được khuyến cáo bởi các tài liệu chính thức hiện tại vì tính
ổn định và hiệu năng của nó tốt hơn Selenium RC. Ngoài ra, người kiểm tra có thể từ bỏ sử
dụng Selenium Server trong kiểm thử tự động mà không cần thuật toán song song.
3 Định nghĩa và mô tả cho các test case
3.1 Định nghĩa cấu trúc XML cho các Test Case
Selenium framework có cú pháp riêng của nó để xác định các test case. Mỗi Selenese biểu
diễn cho một bước kiểm tra và một danh sách của chúng có thể được lưu như là một trường hợp
kiểm thử dưới định dạng HTML. Tuy nhiên, thông tin trong Selenese là không đủ. Cần thiết đề
xuất một cú pháp mạnh hơn và linh hoạt, kết hợp những lợi thế của định dạng dữ liệu XML và
Selenese. Nó được gọi là Extension Selenium Command Line (ESCL) hoặc XSelenese. Các tính
năng của XML đưa ra một giải pháp tốt hơn. Lý do mở rộng các biểu thức lệnh Selenium bằng
XML thay vì HTML là như sau
- Sử dụng tổ hợp thẻ và tham chiếu để chỉ ra mối quan hệ giữa các test case với việc tái sử
dụng lại.
- Sử dụng lược đồ XML để chuẩn hóa kiểu dữ liệu XML và xác nhận hợp lệ các tệp XML
Hai tính năng trên làm người dùng có thể tùy chỉnh cú pháp của mình cho các yêu cầu kiểm
tra khác nhau. Và chỉ cần một vài quy tắc và cấu hình nên được sửa đổi khi tái sử dụng các test
case mà hệ thống thế hệ vẫn hoạt động. Lược đồ XML cho test case đơn được xác định như sau:
Hình 3. Cấu trúc Tag của Test Case XML Root Element
- 262 KỶ YẾU HỘI THẢO KHOA HỌC QUỐC GIA CITA 2017 “CNTT VÀ ỨNG DỤNG TRONG CÁC LĨNH VỰC”
Hình 4 mô tả chi tiết của mỗi bước kiểm thử. Mỗi nút bước phải chứa một số thẻ selenese,
được sử dụng để mô tả một vài hành động của người dùng trước khi xác nhận kết quả đầu ra.
Lưu ý ở đây nút xác minh có một thuộc tính có tên "ref". Nó có thể liên kết đến nút khác đã
được xác định đã có trong cùng một hệ thống kiểm thử cho việc tái sử dụng. Và nút selenese
cũng có nút con của nó, chúng là các tag command, tag locator và giá trị tương ứng của các tag.
Ba nút con tương ứng với ba phần của Selenese.
3.2 Định nghĩa cấu trúc XML cho các Test Suites
Bản đặc tả dựa trên XML của test case ở trên có một số khiếm khuyết là làm thế nào để hiển
thị mối quan hệ giữa các test case là không tường minh. Cụ thể, mỗi loại test case là độc lập và
tách rời. Đó là một ý tưởng tốt để xây dựng một bảng đăng ký trong test suite, nếu không nút
xác thực tham chiếu không thể được tìm thấy trong hệ thống kiểm thử hiện tại. Do đó, một tệp
XML khác được sử dụng để hiển thị các test suites.
Hình 4. Cấu trúc XML của Test Suites
Trong hình 4, test suit chứa các test case. Nhưng nó giới thiệu tham số mới "reverse-case ".
Hình 5 mô tả một test suite đơn giản bằng cấu trúc XML và thứ tự của các test case được sắp
xếp bởi cái nút test case. Test suit chứa 4 test case bao gồm “register”, “login”, “change
password” và “log out”. Thuộc tính name của mỗi tag test-case là định danh của nó.
Hình 5. Test Suite XML Demo
3.3 Thực thi kịch bản kiểm thực tự động
Hình 6. Mô hình lớp của các test case được tạo ra
- Hà Thị Minh Phương 263
Làm thế nào để trích xuất dữ liệu và phân tích các định dạng dữ liệu tương ứng mã tương
ứng. Test case là cần thiết để thể hiện đơn vị kiểm thử nhỏ nhất và mỗi test suite phải phù hợp
với phạm vi mã lập trình được tạo ra.
Đối với các trình bày trong phần trước, có ít nhất ba lớp bên trong một kịch bản kiểm thử
được tạo ra tự động điều hướng đến trang chính của CPMISS, nhập thông tin đăng nhập của
người dùng, nhấp vào nút đăng nhập và sau đó xác minh ngữ cảnh sau khi đăng nhập. Trong sơ
đồ lớp như hình 6 trên, mỗi test case được coi là một lớp độc lập trong kịch bản kiểm tra và mỗi
bước kiểm tra là một lớp bên trong của nó. Sử dụng lớp này có thể cải thiện khả năng đọc và sử
dụng lại mã lập trình. "Test-suite.xml" và "test-case.xml" trong Sơ đồ Lớp (Hình 6) cho biết hai
tệp tin cấu hình XML. Các đối tượng phân tích chuyển đổi các thẻ XML thành mã kịch bản. Các
API Selenium RC dễ dàng hơn Web Driver nếu người kiểm thử muốn gọi một đối tượng tĩnh,
nó có thể thực thi Selenese mà không có bất kỳ chuyển đổi nào. Trong thực tế, công việc chính
là trích xuất các đối số lệnh từ tệp cấu hình XML và đặt chúng vào các lớp của các test case
theo thứ tự. Sau khi phân tích tất cả các tệp cấu hình các test case và test suite, các mối quan hệ
và tham chiếu cần được trích cấu trúc dữ liệu của test suite và các nút xác nhận trong XML.
Như demo trong hình 7, lớp "TestLoginCPMISS" là một mã test case thực thi được tạo ra bởi
tất cả phương pháp trên. Tất cả các kịch bản test case được tạo tự động bởi công cụ có các tính
năng chung như sau:
- Tất cả các lớp test case được mở rộng từ các lớp cha trừu tượng "DefaultTestCase".
- Tất cả các bước kiểm thử là lớp bên trong và mỗi bước đều có loại riêng của bản thân nó để
phân biệt dù nó có phải là bước xác minh hay không.
- Mỗi bước xác minh là một lớp bên trong phải được đăng ký trong lớp test suite của nó.
- Khởi tạo các vector kiểm thử các bước thực hiện theo thuộc tính id trong XML. Bây giờ mã
giả của kịch bản kiểm thử chuyển đổi tự động là được đưa ra như sau:
Thuật toán 1: Phân tích XML và dữ liệu kịch bản
Như thuật toán được hiển thị ở trên, quá trình phân tích cú pháp các test case dựa trên XML
vào các kịch bản kiểm thử được mã hoá bởi JAVA. Nó có thể được chia thành ba phần. Mỗi
phần ánh xạ tới một thẻ XML tag trong test case tệp. Trước và sau khi phân tích nội dung của
Selenese, các xác thực trước và xác thực sau khi đăng nhập phải được xử lý và truy vấn đối
- 264 KỶ YẾU HỘI THẢO KHOA HỌC QUỐC GIA CITA 2017 “CNTT VÀ ỨNG DỤNG TRONG CÁC LĨNH VỰC”
tượng tham chiếu nếu nó có thuộc tính tham chiếu. Thuật toán cốt lõi của việc tạo mã là phân
tíchdữ liệu lệnh từ XML vì các tệp cấu hình chứa tất cả thông tin của kịch bản kiểm thử tự sinh
ra. Và sau đó, thông tin tương ứng về dòng lệnh Selenium sẽ được trích xuất. Nếu Selenese
nhận được, Selenium cung cấp một loạt của các API để chuyển đổi nội dung thành các phần mã
tương đồng. Những điểm quan trọng là tạo ra một bảng lập bản đồ ánh xạ và tìm kiếm nó nhanh
chóng. Ngoài những tính năng này, nội dung của từng bước được chuyển đổi trực tiếp từ các đối
số trong lệnh của Selenium, được trích xuất bởi trình đọc XML sử dụng DOM. Sau đó, nếu
script cần phải được chạy, một số thư viện * .jar và JDK môi trường phải được thiết lập. Kết
quả phân tích của test case Login như sau
Hình 7. Script Login Test Case tự động được tạo ra
Bây giờ kịch bản kiểm thử có thể chạy liên tục và tạo ra các báo cáo, từ đó kết quả của mỗi
bước thực hiện sẽ được hiển thị. Trong danh sách hiển thị kết quả này, mỗi mục tương ứng với
một lệnh kiểm tra và kết quả thực hiện của nó được hiển thị trong một ô của bảng kết quả. Bên
cạnh đó, thời gian và số dòng lập trình cũng có thể được được trình bày giúp người kiểm thử
đánh giá hiệu suất và xác định nguyên nhân của các lỗi một cách nhanh chóng.
Hình 8. Kết quả kiểm tra
Như kết quả hình 8 cho thấy, trang kết quả kiểm tra là một tệp định dạng HTML ghi lại từng
kết quả của các tập lệnh kiểm tra thực thi. Tiêu đề của tệp hiển thị thông tin ngữ cảnh kiểm tra,
- Hà Thị Minh Phương 265
bao gồm phiên bản trình duyệt Web, phiên bản Selenium và thời gian chạy... Dưới tiêu đề, mỗi
mục trong danh sách log là một bản ghi thực hiện của Selenese. Màu nền được đánh dấu là kết
quả hiển thị OK hoặc Failure cho biết kết quả hiện tại của kịch bản kiểm thử.
3.4 Đánh giá Selenium framework
Selenium là công cụ mã nguồn mở, chúng hoạt động trên môi trường và nền tảng rộng lớn.
Điều này tạo ra sự dễ dàng cho bất kỳ người nào mà chưa có kinh nghiệm cũng có thể hiểu
được nội dung thực hiện Nó là một cây cầu nối giữa nhóm công nghệ và nhóm nghiệp vụ làm
việc trong một nhóm dự án kiểm thử.
Khả năng sử dụng lại mã nguồn là một điểm nổi bật trong framework Selenium này. Chúng
ta có thể thực hiện các test case khác mà có các bước thực thi tương tự. Khi dữ liệu kiểm thử
thay đổi thì không cần phải làm việc lại với các kịch bản Selenium mà đã được viết.
4 Kết luận
Bài báo này đưa ra một cách tiếp cận mới của kịch bản kiểm thử tự động tạo mã JavaScript
tái cấu trúc ứng dụng Web. Selenium là framework cốt lõi, cung cấp các API linh hoạt để kiểm
thử tự động hóa. Mô tả định dạng XML của các test case và test suite là nghiên cứu chính đầu
tiên. Chi phí kiểm tra và việc tái cấu trúc mã JavaScript sẽ giảm đi và ít tương tác thủ công hơn.
Để nâng cao hiệu quả kiểm tra và giảm sự can thiệp của người kiểm thử, chúng tôi sẽ tập trung
vào làm thế nào để tạo ra các kịch bản kiểm thử tự động với các mô hình dựa trên kỹ thuật
kiểm thử.
References
1. S. Roy Choudhary, D. Zhao, H. Versee, and A. Orso. Water: Web application test repair. In Proc. of
the 1st Int. Workshop on End-to-End Test Script Engineering, 2011.
2. Martin Fowler, Kent Beck, John Brant, Refactoring: Improving the Design of Existing Code, U.S.,
1999, pp. 11-21.
3. Antawan Holmes and Marc Kellogg, Automating Functional Tests Using Selenium, Proceedings of
AGILE 2006 Conference, 2006.
4. McMahon, C, History of a Large Test Automation Project Using Selenium, 2009.
5. Zhenghua Feng, Ju Gao, Hongwei Zeng, Research of Web Application Test Automation, Computer
Engineering and Design, 2010.
6. Web Site, http://docs.seleniumhq.org/docs/
7. Tuomas Pajumen, Tommi Takala and Mika Katara. Model-Based Testing a General Purpose
Keyword-Driven Test Automation Framework. International Conference on Software Testing.
Verification and Validation Workshops. 2011.
nguon tai.lieu . vn