Chạy Java Selenium automation test từ Docker

Friday, December 02, 2022
Edit this post


Trước đây lúc còn làm ở Agoda, tôi đã từng có cơ hội được làm quen với docker nhưng ở mức khá high level, không có dịp được thực hành từ đầu (from scratch). Lúc ấy, file image là do team devops hỗ trợ viết dockerfile tạo ra, chúng tôi chỉ việc pull về và chạy test mà thôi. Do vậy, tôi không hiểu được tường tận và có đủ "cảm giác" khi làm việc với docker. Nhưng tôi biết docker đang là xu thế trong giới công nghệ, người ta sẽ còn phải nói về nó rất nhiều, tương tự như cái cách mà Git đã và đang trở thành một phần không thể thiếu khi nói về source version control.

Trên mạng có rất nhiều những bài viết và video hướng dẫn về cách cài đặt và sử dụng docker cơ bản, phần lớn là cho dev. Tuy nhiên, với đặc thù công việc là automation QA, tôi muốn cụ thể hóa và áp dụng docker vào automation test, để những bạn khác có nhu cầu tìm hiểu có thêm một nguồn tài liệu tham khảo đi sâu vào chi tiết.

Docker là gì?

Docker là một công nghệ ảo hóa ở mức OS nhằm phân phối các ứng dụng dưới dạng các container. Để chạy được các container, máy tính hoặc server cần được cài đặt Docker engine. Ưu điểm vượt trội của docker là nó có thể giúp đóng gói chỉ những thứ cần thiết vào một file image, giúp tối ưu tài nguyên dung lượng. Khi đó bạn có thể chia sẻ ứng dụng của mình tới người khác một cách dễ dàng, họ sẽ không cần phải tốn thời set up môi trường, chỉ cần máy của họ có cài docker engine, việc khởi chạy ứng dụng chỉ trong vòng một nốt nhạc.

Đề bài

Dựng một project/framework đơn giản sử dụng Java + Selenium nhằm tự động hóa một test case login cơ bản vào một trang web bất kỳ và xác thực user có thể login thành công, ở đây tôi sẽ sử dụng trang web mẫu https://www.saucedemo.com/. Sau khi code chạy được, đóng gói project vào một file docker image để bất cứ ai cũng có thể chạy được test của bạn.

👉 Hướng dẫn cài Docker desktop: https://www.youtube.com/watch?v=r6JiWwh-08c
👉 Enable Hyper-V cho Windows 10 Home: https://www.itechtics.com/enable-hyper-v-windows-10-home/ (mặc định Windows 10 Home không được bật sẵn Hyper-V, bạn sẽ cần phải bật Hyper-V thì Docker mới có thể hoạt động). Bạn chỉ cần lưu đoạn code bên dưới vào file đặt tên là hyperv.bat, sau đó nhấp chuột phải vào file, chọn Run as administrator là được. Nếu máy tính của bạn đã được cài sẵn Windows 10 Pro, bạn có thể bỏ qua bước này.

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

Bên dưới là video recording từ buổi sharing knowledge với các bạn khác trong team mà tôi đang làm việc cùng. Trong video này, tôi đã chia sẻ từ đầu đến cuối các bước dựng project, cách tạo Dockerfile, cách build docker image, và cuối cùng là cách chạy test từ docker container.

Hands-on demo video

Cấu trúc project

Tôi đã dựng một framework hết sức cơ bản, đây là dạng framework tôi thường dùng cho mục đích nghịch code hoặc để phỏng vấn. Dễ thấy với yêu cầu của để bài, nếu áp dụng POM (page object model design pattern), chúng ta sẽ cần ít nhất 2 model cho trang Login và trang chủ của website sau khi login thành công (ở đây gọi là trang Inventory).

Chúng ta cũng sẽ cần phải viết ít nhất một test class, set up những thứ cần thiết như DriverHelper, WaitHelper... nhưng nhìn chung không có gì phức tạp ở đây. Để quản lý các thư viện (dependecies), tôi dùng Maven, do đó sẽ cần cấu hình file pom.xml. Test runner mà tôi sử dụng là TestNG. IDE mà tôi sử dụng để implement là IntelliJ IDEA Community Edition.


Xác định các lệnh CLI cần thiết

Chạy được test ở máy local từ IDE chỉ là bước ban đầu. Để test của bạn có thể chạy được trên Jenkskin hay TeamCity servers, bạn sẽ cần phải provide được những lệnh cần thiết để có thể compile và chạy được project của mình, lý do là vì trên các server đó, devops team sẽ không cài IDE mà chỉ cài các thư viện cần thiết bên dưới, còn lại tất cả mọi thứ sẽ phải chạy thông qua CLI (command line interface).

Vì sử dụng Maven nên để build project ra các file class, tôi dùng lệnh:

mvn clean test-compile

Sau khi đã build thành công, tôi dùng một trong hai lệnh dưới để chạy test. Trong đó lệnh đầu tiên sẽ chạy tất cả các test method trong LoginTest class, còn lệnh thứ hai chỉ chạy riêng một mình testLogin() method trong Login test class mà thôi.

mvn test -Dtest="LoginTest"
mvn test -Dtest="LoginTest#testLogin"

Đến đây chúng ta đã tạm đủ những yếu tố cần thiết cho bước tiếp theo.

Viết Dockerfile

Dockerfile là tập tin chứa các chỉ dẫn (instructions) để có thể build được docker image. Từ docker image, người dùng có thể tạo ra các docker container và run test.

Cho file image của mình, tôi chọn Linux, distribution cụ thể là Ubuntu 16.04 làm base. Điều đó đồng nghĩa với việc tôi phải tính đền những vấn đề sau:
- Cài trình duyệt Chrome phiên bản stable mới nhất.
- Tải về chrome driver tương ứng theo phiên bản của trình duyệt đã cài đặt.
- Tải và set up biến môi trường cho Java 11.
- Tải và set up biến môi trường cho Maven 3.8.6.

Các lệnh sau RUN là lệnh Linux cho phép tải và cài đặt các app cần thiết.

FROM ubuntu:16.04

RUN apt-get update -y
RUN apt-get install -y curl
RUN apt-get install -y p7zip \
    p7zip-full \
    unace \
    zip \
    unzip \
    bzip2 \
    wget

Các tham số cần thiết:

ARG CHROME_URL=https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
ARG JAVA_URL=https://download.java.net/java/ga/jdk11/openjdk-11_linux-x64_bin.tar.gz
ARG JAVA_HOME=/usr/share/java
ARG MAVEN_URL=https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
ARG MAVEN_HOME="/usr/share/maven"

Cài đường dẫn môi trường cho Java và Maven:

ENV PATH "$PATH:$JAVA_HOME/bin"
ENV PATH "$PATH:$MAVEN_HOME/bin"

Copy toàn bộ thư mục và tập tin ở đường dẫn hiện tại của project vào file docker image (lưu ý những file và thư mục trong file .dockerignore sẽ bị bỏ qua):

COPY . /java-selenium-demo
WORKDIR /java-selenium-demo

Tải về Chrome driver: Dòng lệnh CHROME_VERSION=$(curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE) sẽ gọi lên endpoint check phiên bản driver mới nhất của Google và gán về biến CHROME_VERSION. Dựa vào đó chúng ta có thể tải về chrome driver tương ứng vào đường dẫn /java-selenium-demo/drivers, sau đó xả nén bằng lệnh unzip. Các phiên bản khác nhau của chrome driver có thể được tải về ở đây.
ARG DRIVER_DIR=/java-selenium-demo/drivers
RUN mkdir -p ${DRIVER_DIR}/
RUN CHROME_VERSION=$(curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE) && \
    curl -ko ${DRIVER_DIR}/chrome_driver.zip https://chromedriver.storage.googleapis.com/${CHROME_VERSION}/chromedriver_linux64.zip && \
    unzip ${DRIVER_DIR}/chrome_driver.zip -d ${DRIVER_DIR}/

Tải và cài đặt trình duyệt Chrome với phiên bản stable mới nhất (nhìn vào đường link tải ở phần tham số phía trên). Lệnh apt-get install cho phép chúng ta cài đặt file .deb và tất cả các thư viện liên quan, tham số -y để tự động accept các câu hỏi xác nhận trong quá trình cài đặt.

RUN curl -ko /tmp/chrome.deb ${CHROME_URL}
RUN apt-get install -y /tmp/chrome.deb

Tải và cài đặt Java 11: Chỉ cần tải về file nén dạng .gz sau đó xả nén bằng lệnh tar. Đường dẫn môi trường thì đã được cài đặt trước ở trên.

RUN mkdir -p ${JAVA_HOME}
RUN curl -ko /tmp/jdk.tar.gz ${JAVA_URL}
RUN tar -xzf /tmp/jdk.tar.gz -C ${JAVA_HOME} --strip-components=1

Tải và cài đặt Maven: Cũng tương tự như Java 11, chúng ta tải về file .gz và xả nén. Đường dẫn môi trường cũng đã được cài đặt sẵn ở trên.

RUN mkdir -p ${MAVEN_HOME}
RUN curl -ko /tmp/apache-maven.tar.gz ${MAVEN_URL}
RUN tar -xzf /tmp/apache-maven.tar.gz -C ${MAVEN_HOME} --strip-components=1
RUN mvn clean test-compile

Và cuối cùng, chúng ta cần phải xóa đi những tập tin đã tải về để giảm kích thước của file image:

RUN rm /java-selenium-demo/drivers/chrome_driver.zip && \
    rm /tmp/chrome.deb && \
    rm /tmp/apache-maven.tar.gz && \
    rm /tmp/jdk.tar.gz
Tiến hành build file docker image:

Từ Dockerfile, chúng ta sẽ tạo được file docker image ở local. Quá trình này thường lâu nhất do sẽ cần phải tải về các tập tin và thư viện cần thiết, nhưng một khi file docker image đã được tạo ra thì việc khởi tạo chạy các container là cực kỳ nhanh chóng.

Dùng lệnh bên dưới để tạo docker image, trong đó "jsd" là tên tag do bạn tùy ý đặt. "jsd" chỉ đơn giản là viết tắt của java-selenium-demo. Dấu . đại diện cho thư mục hiện tại.

docker build -t jsd .


Sau khi file docker image đã được tạo thành công, dùng lệnh bên dưới để khởi tạo container. Nếu mọi thứ đều ổn, bạn sẽ đứng trong Ubuntu OS của container và đã bắt đầu có thể chạy lệnh Linux. Bạn có thể check cái file image và container trong Docker desktop hoặc sử dụng lệnh.
docker run -it jsd


Đến đây mọi thứ đã xong chạy lệnh "mvn test" như hình dưới để kick off test execution. Như vậy một khi file docker image đã được tạo ra, người dùng chỉ cần chạy container và nhập vào một câu lệnh duy nhất để kick off test, không cần phải quan tâm đến việc set up và cài đặt môi trường. Để rõ hơn mời các bạn xem video demo hands on ở đầu bài viết. Cảm ơn các bạn đã đọc bài viết, chúc các bạn thành công.


Nguồn tham khảo:

.
Xin vui lòng chờ đợi
Dữ liệu bài viết đang được tải về

BÌNH LUẬN

Cảm ơn bạn đã đọc bài viết của Cuộc Sống Tối Giản. Đây là một blog cá nhân, được lập ra nhằm mục đích lưu trữ và chia sẻ mọi thứ hay ho theo chủ quan của chủ sở hữu. Có lẽ vì vậy mà bạn sẽ thấy blog này hơi (rất) tạp nham. Mọi chủ đề đều có thể được tìm thấy ở đây, từ tâm sự cá nhân, kinh nghiệm sống, phim ảnh, âm nhạc, lập trình... Phần lớn các bài đăng trong blog này đều được tự viết, trừ các bài có tag "Sponsored" là được tài trợ, quảng cáo, hoặc sưu tầm. Để ủng hộ blog, bạn có thể share những bài viết hay tới bạn bè, người thân, hoặc có thể follow Kênh YouTube của chúng tôi. Nếu cần liên hệ giải đáp thắc mắc hoặc đặt quảng cáo, vui lòng gửi mail theo địa chỉ songtoigianvn@gmail.com. Một lần nữa xin được cảm ơn rất nhiều!!!
© Copyright by CUỘC SỐNG TỐI GIẢN
Loading...