Giả sử, chúng ta sử dụng AWS Codepipeline để triển khai dự án và pipeline gồm các bước cụ thể như sau:
- Developer đẩy code lên source control (bitbucket/github) và Codepipeline sẽ tự động được kích hoạt.
- Tiến hành build và đóng gói source code thành file thực thi có thể triển khai lên hệ thống (excutable binary/ .jar/ docker image / code artifact).
- Gửi yêu cầu đến Team để xác nhận xem có triển khai ứng dụng lên hạ tầng (Server) hay không.
- Triển khai file thực thi ở Bước 2 lên hạ tầng (Server/AWS ECS/AWS EKS) tương ứng.
- Thực thi kiểm thử tự động (Automation Testing).
- Gửi yêu cầu đến Team để xác nhận xem có cần chạy lại hạ tầng với phiên bản cũ hay không nếu Automation Testing thất bại (rollback).
Bài viết này sẽ tập trung vào Bước 5 và giả sử sẽ triển khai Regression Testing cho hệ thống. Giới thiệu qua về Regression Testing, đây là một loại kiểm thử tự động được thực thi sau mỗi lần chúng ta triển khai các thay đổi mới lên hệ thống, nó được dùng để đảm bảo rằng những thay đổi mới sẽ không gây ra vấn đề cho các chức năng hiện tại.
Để bắt đầu thì chúng ta xem qua về cấu trúc source code automation testing mà mình tham khảo được ở github. ở ví dụ này, automation test sử dụng Robot framework và Selenium. Các bạn có thể tham khảo source code chính tại đây.
Vì mình cần điều chỉnh lại một số thông số từ code nên mình đã fork ra một repo riêng để thuận tiện hơn. Bạn có thể tham khảo repo mới tại đây và đây là những điều chỉnh của mình.
Chúng ta có một số test case ở thư mục tests và để chạy được những test case này ở local, mình cần cài đặt khá nhiều thứ theo như hướng dẫn của tác giả. Nhưng trong bài viết này, chúng sẽ chạy các test case trên AWS Codebuild (các bạn có thể chạy ở local trước để hiểu hơn về cấu trúc và cách hoạt động).
Trong AWS Codebuild có sẵn một số môi trường build, nhưng để chạy được code automation test này, chúng ta không thể chỉ sử dụng trực tiếp các môi trường có sẵn mà nên sử dụng chức năng Custom image để chuẩn bị môi trường riêng phù hợp, mình sẽ sử dụng Docker để build Custom image, như vậy sẽ đơn giản hơn cho chúng ta rất nhiều.
Giải thích một cách đơn giản là khi AWS Codebuild được thực thi nó sẽ khởi chạy một container từ Custom image và xem đây là môi trường để thực thi các lệnh, vì vậy chúng ta cần đảm bảo cài đặt và đóng gói tất cả các tools hay dependencies cần thiết trong Custom image này.
Các bước cụ thể như sau:
- Build Docker image với Dockerfile như sau:
FROM python:3.11.4 WORKDIR /app # 🚀 Install Chrome and ChromeDriver here! RUN apt-get update -qq -y && \ apt-get install -y \ libasound2 \ libatk-bridge2.0-0 \ libgtk-4-1 \ libnss3 \ xdg-utils \ git \ wget && \ wget -q -O chrome-linux64.zip https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/linux64/chrome-linux64.zip && \ unzip chrome-linux64.zip && \ rm chrome-linux64.zip && \ mv chrome-linux64 /opt/chrome/ && \ ln -s /opt/chrome/chrome /usr/local/bin/ && \ wget -q -O chromedriver-linux64.zip https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.204/linux64/chromedriver-linux64.zip && \ unzip -j chromedriver-linux64.zip chromedriver-linux64/chromedriver && \ rm chromedriver-linux64.zip && \ mv chromedriver /usr/local/bin/ # Coppy source code to /app folder COPY ./ /app RUN pip install -r requirements.txt ENTRYPOINT ["tail", "-f", "/dev/null"]
-
Lưu ý quan trọng là chúng ta cần phải cài đặt chrome và chromedriver trực tiếp trong docker image, ngoài ra cũng cần chạy
pip install
để cài đặt các dependencies liên quan đếnRobot Framework và Selenium
. -
Sau khi build docker Image thành công, mình đã lưu nó ở Dockerhub registry tại đường dẫn bên dưới: https://hub.docker.com/r/luanvan/python-robot.
- Cấu hình AWS S3 bucket để lưu và hiển thị kết quả kiểm thử tự động.
- Bước đầu tiên bạn cần tạo một S3 bucket có tên phù hợp với các thông số mặc định.
- Cập nhật Bucket policy cho phép truy cập tới các file ở trong S3 bucket, Chọn
Permissions
-->Bucket policy
.- Ở bước này thì chúng ta sẽ giới hạn truy cập bằng IP.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<your-automation-report-s3-bucket-name>/*", "Condition": { "IpAddress": { "aws:SourceIp": "<your-ip>/32" } } } ] }
- Ở bước này thì chúng ta sẽ giới hạn truy cập bằng IP.
- Tạo và cấu hình AWS Codebuild.
-
Chọn Source Provider: mình chọn
No source
vì trong Docker image đã có source code automation test rồi. -
Cấu hình Custom image: mình dùng Docker Image đã được build và public trên Dockerhub registry
luanvan/python-robot:latest
. -
Các bước thực thi (buildspecs)
version: 0.2 phases: build: commands: - echo "Regression Test" - pwd # Copy source code from /app to current location - cp -r /app/* ./ - ls -lha - echo "Start" - robot --nostatusrc --outputdir Output --timestampoutputs tests - aws s3 sync ./Output s3://<your-automation-report-s3-bucket-name>/robot-reports/ - REPORT_FILE=$(ls ./Output | grep "report") - REPORT_URL=https://<your-automation-report-s3-bucket-name>.s3.<aws-region-code>.amazonaws.com/$REPORT_FILE - echo $REPORT_URL - curl -X POST -H 'Content-type:application/json' --data '{"text":"'"This is Automation Testing reports. Could you please help to review?\n$REPORT_URL"'"}' 'https://hooks.slack.com/services/xxxxxx/xxxxxxxxxxx/xxxxx' - echo "End"
Giải thích về các câu lệnh quan trọng:
-
Mình chạy các test case ở thư mục test với các tham số:
robot --nostatusrc --outputdir Output --timestampoutputs tests
--nostatusrc
: Đảm bảo sẽ chạy lệnh tiếp theo kể cả kết quả từ robot có test case bị thất bại.--outputdir Output
: Lưu lại kết quả kiểm thử vào thư mục Output .
-
Tiếp theo mình sẽ upload kết quả kiểm thử lên S3 bucket để hỗ trợ việc xem kết quả kiểm thử.
aws s3 sync ./Output s3://<your-automation-report-s3-bucket-name/robot-reports/
- Thư mục kết quả
Output
sẽ có một số file như sau, chúng ta chỉ cần giữ lại filereport-xxx.html
làm entry point trong mỗi lần thực thiREPORT_FILE=$(ls ./Output | grep "report")
- Lưu ý: Để Codebuild có thể upload lên S3, mình cần thêm quyền cho Codebuild service role như sau:
"Action": [ "s3:PutObjectTagging", "s3:PutObjectAcl", "s3:PutObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<your-automation-report-s3-bucket-name>/*", "arn:aws:s3:::<your-automation-report-s3-bucket-name>" ], "Sid": "AllowUploadS3" }
- Thư mục kết quả
-
Cuối cùng, gửi thông báo về kết quả kiểm thử đến Slack: ở bước này mình sẽ dùng slack incoming webhook.
curl -X POST -H 'Content-type:application/json' --data '{"text":"'"This is Automation Testing reports. Could you please help to review?\n$REPORT_URL"'"}' 'https://hooks.slack.com/services/xxxxxx/xxxxxxxxxxx/xxxxx'
-
- Chạy Codebuild và xem kết quả.
-
Chạy Codebuild và có logs như sau:
-
Nhận thông báo từ Slack
-
Xem kết quả
-
Tích hợp Codebuild vào AWS Codepipeline.
Giả sử chúng ta đã có sẵn một AWS Codepipeline cho dự án, nhưng chưa có bước thực thi automation testing. Bây giờ dựa trên Codebuild đã tạo mình sẽ thêm một bước mới vào Codepipeline để automation testing được thực thi ngay sau khi các thay đổi mới được triển khai lên hạ tầng. Đây là bước thứ 5 trong Codepipeline tổng thể.
-
Từ AWS Codepipeline, mình sẽ thêm một stage mới có tên
Automation Testing
ngay sau stageDeploy
. -
Bên trong
Automation-Testing
mình thêm một action mới có thểRegression-Testing
, mình chỉ nhập một số thông số như sau, còn lại có thể để như mặc định.