Triển khai kiểm thử tự động với Robot framework và Selenium trên AWS CodeBuild

0 0 0

Người đăng: DevOps Insights

Theo Viblo Asia

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:

  1. Developer đẩy code lên source control (bitbucket/github) và Codepipeline sẽ tự động được kích hoạt.
  2. 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).
  3. 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.
  4. Triển khai file thực thi ở Bước 2 lên hạ tầng (Server/AWS ECS/AWS EKS) tương ứng.
  5. Thực thi kiểm thử tự động (Automation Testing).
  6. 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:

  1. 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 chromechromedriver 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 đến Robot 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.

  1. 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" } } } ] }
      
  1. 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 file report-xxx.html làm entry point trong mỗi lần thực thi REPORT_FILE=$(ls ./Output | grep "report")

      image.png

      • 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" }
        
    • 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'
      
  1. 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ả

  1. 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 stage Deploy . image.png

  • 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. image.png

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 88

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 65

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 47

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 35

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 85

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 113