Ngày 14 tháng 3 năm 2020 - Công Nghệ Máy Tính
Selenium cung cấp một bộ công cụ và thư viện phụ thuộc mạnh mẽ để tự động hóa trình duyệt web. Nó cho phép mô phỏng tương tác của người dùng với trình duyệt thông qua các mở rộng theo chuẩn W3C WebDriver. Mã nguồn tự động được viết bằng WebDriver có thể tái sử dụng trên nhiều trình duyệt phổ biến.
Yếu tố quan trọng ở đây chính là WebDriver, nó chịu trách nhiệm kết nối API do nhà sản xuất trình duyệt cung cấp để giao tiếp với trình duyệt. Người dùng có thể thực hiện các thao tác như nhập văn bản vào ô input, chọn mục từ danh sách thả xuống, nhấp chuột vào liên kết… Ngoài ra còn hỗ trợ di chuyển chuột và chạy script JavaScript.
1. Chuẩn Bị Môi Trường
Selenium cung cấp nhiều cách triển khai: cài đặt tệp thực thi WebDriver trên máy cục bộ, khởi tạo dịch vụ riêng biệt, hoặc sử dụng dịch vụ WebDriver từ xa. Cũng có thể cấu hình cluster Grid để kiểm tra nhiều phiên bản trình duyệt khác nhau.
Dưới đây chúng ta sẽ sử dụng Docker để khởi chạy một dịch vụ độc lập có môi trường Chrome:
docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-zirconium
Giờ hãy cùng viết một ví dụ kiểm thử đơn giản trong Golang nhé!
2. Mã Nguồn Kiểm Thử Selenium Trong Golang
Chúng ta sẽ thử kiểm tra blog cá nhân tại leileiluoluo.com
: mở trang chủ, nhấn nút tìm kiếm, nhập từ khóa “istio” và xác nhận có ít nhất một kết quả trả về. Đồng thời lưu lại ảnh chụp màn hình kết quả tìm kiếm.
Thư viện Selenium cho Golang được sử dụng ở đây là github.com/tebeka/selenium
.
Mô tả mã nguồn:
- Hàm
setup
khởi tạo đối tượng driver. - Hàm
TestSearch
thực hiện kiểm tra chức năng tìm kiếm: mở trang tìm kiếm, nhập từ khóa, bấm nút tìm kiếm, xác nhận kết quả và chụp màn hình. - Hàm
teardown
giải phóng tài nguyên của driver sau khi hoàn thành.
Mã nguồn đã được push lên GitHub:
package blog_test
import (
...
)
var (
browserName = flag.String("browser", "chrome", "Tên trình duyệt")
gridUrl = flag.String("grid", "", "Đường dẫn grid")
blogURL = "https://leileiluoluo.com"
...
)
func setup() func() {
...
}
func screenshot(filename string) {
...
}
func TestSearch(t *testing.T) { [winvn com9](/post/botanical-garden/)
...
}
func TestMain(m *testing.M) {
...
}
Thực thi kiểm thử:
$ go test -v
Kết quả kiểm thử:
=== RUN TestSearch
--- PASS: TestSearch (46.40s)
PASS
ok github.com/leileiluoluo/test 91.427s
Như vậy chúng ta đã có thể bắt đầu với kiểm thử tự động bằng Selenium.
Tuy nhiên, khi đối mặt với ứng dụng web phức tạp hơn, làm thế nào để tổ chức mã nguồn kiểm thử hiệu quả? Một hướng đi là áp dụng mô hình Page Object Model…
3. Tổ Chức Mã Nguồn Kiểm Thử Hiệu Quả
Kiến trúc mã nguồn kiểm thử có thể trở nên rối rắm khi logic kiểm thử ngày càng phức tạp. Selenium đề xuất sử dụng mô hình Page Object Model, tức là thay vì nghĩ trực tiếp từ góc độ kiểm thử viên, hãy nhìn từ góc độ người dùng cuối. Mỗi kịch bản kiểm thử nên là sự kết hợp giữa hành động và ngữ cảnh của trang.
Viết kiểm thử cũng giống như viết mã nghiệp vụ: cần cân nhắc tính tái sử dụng, đóng gói, trách nhiệm duy nhất, lập trình hướng đối tượng và các mẫu thiết kế.
Dựa trên nguyên tắc này, quy tắc thiết kế hay mẫu mã Page Object Model ra đời. Nó áp dụng nguyên tắc hướng đối tượng để đóng gói các selector và hành vi của từng trang riêng lẻ, cung cấp dịch vụ của trang qua các phương thức và không chứa đoạn assert trong mô hình trang.
Dưới đây là phiên bản cải tiến dựa trên tiêu chuẩn này. File blog_test.go
đóng vai trò điểm nhập tổng thể, trong khi các chức năng trang được phân chia vào thư mục pages
, cụ thể trang tìm kiếm được đóng gói trong search.go
.
Cấu trúc mã nguồn mới:
$ tree
.
├─ blog_test.go
├─ pages
│ ├─ ...
│ └─ search.go
├─ go.mod
└─ go.sum