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.
Trang 1Tá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
Trang 2Bà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,
Trang 3Selenium 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
Trang 4Hì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
Trang 5Là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
Trang 6tượ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,
Trang 7bao 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