paint-brush
Cách chạy hơn 5000 bài kiểm tra trên thiết bị di động mỗi ngày; Từ Playbook của InDrive (Phần 1)từ tác giả@indrivetech
18,716 lượt đọc
18,716 lượt đọc

Cách chạy hơn 5000 bài kiểm tra trên thiết bị di động mỗi ngày; Từ Playbook của InDrive (Phần 1)

từ tác giả inDrive.Tech10m2023/05/30
Read on Terminal Reader

dài quá đọc không nổi

InDrive chạy hơn 5.000 bài kiểm tra mỗi ngày trên các thiết bị iOS và Android cộng lại. Bí mật rất đơn giản: chúng tôi đã sử dụng Selenoid. Để viết các bài kiểm tra Appium, chúng tôi sử dụng: Kotlin; tháng 5 đơn vị 5; maven. Chúng tôi nghĩ rằng nên chia tài liệu thành hai phần: phần đầu tiên tập trung vào Android và phần thứ hai tập trung vào iOS.
featured image - Cách chạy hơn 5000 bài kiểm tra trên thiết bị di động mỗi ngày; Từ Playbook của InDrive (Phần 1)
inDrive.Tech HackerNoon profile picture

Chào mọi người! Tên tôi là Taras Egorov; Tôi là kỹ sư tại inDrive. Tôi sẽ chỉ cho bạn cách chúng tôi thiết lập cơ sở hạ tầng có khả năng chạy hơn 5.000 bài kiểm tra mỗi ngày trên thiết bị iOS và Android kết hợp. Bí mật rất đơn giản: chúng tôi đã sử dụng Selenoid.

lời nói đầu

Năm ngoái, các đồng nghiệp của chúng tôi đã tiến hành một nghiên cứu về thử nghiệm ô tô và chúng tôi đã tham gia vào một cuộc khảo sát như một phần của nghiên cứu.

Trong số những người được khảo sát, Appium được khoảng 20% nhóm sử dụng, đây là một khởi đầu không tồi.


Chúng tôi hài lòng với kết quả của cuộc khảo sát, vì vậy chúng tôi quyết định viết một bài báo để chia sẻ kinh nghiệm của chúng tôi với bạn và nhận lại một số lời khuyên. Chúng tôi nghĩ rằng nên chia tài liệu thành hai phần: phần đầu tiên tập trung vào Android và phần thứ hai tập trung vào iOS.


Hãy bắt đầu với Android.

Chạy thử nghiệm trên Android

Selenoid là một công cụ phổ biến để chạy và quản lý trình duyệt cũng như trình giả lập Android trong bộ chứa Docker. Bạn có thể đọc thêm về điều này trong tài liệu .


Để viết các bài kiểm tra Appium, chúng tôi sử dụng:

  • Kotlin;
  • tháng 5 đơn vị 5;
  • maven.

Lần chạy đầu tiên. Thiết lập Selenoid

  1. Tạo tệp cấu hình browsers.json :


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        "image": "browsers/android:10.0",        "port": "4444",        "path": "/wd/hub"      }    }  } }


Hình ảnh giả lập được chỉ định trong image . Những người từ aerokube đã chuẩn bị sẵn hình ảnh giả lập Android. Bạn có thể kiểm tra chúng ở đây hoặc ở đây . Các hình ảnh không khác nhau theo bất kỳ cách nào.


Hãy lấy hình ảnh browsers/android:10.0 làm ví dụ. Hình ảnh phải được tải xuống trước: docker pull browsers/android:10.0 , nếu không các bài kiểm tra sẽ không chạy:


 Original error: create container: Error response from daemon: No such image: browsers/android:10.0


  1. Bước tiếp theo là chạy Selenoid. Chúng tôi làm điều đó trực tiếp thông qua docker hoặc có tùy chọn sử dụng Trình quản lý cấu hình .


 docker run -d \           -v /var/run/docker.sock:/var/run/docker.sock \           -v "$(pwd)/selenoid/config/":/etc/selenoid/:ro \           -p 4444:4444 \           --name selenoid \           aerokube/selenoid:1.10.7


Bạn có thể kiểm tra xem Selenoid có hoạt động bình thường hay không bằng cách nhấp vào liên kết http://localhost:4444 trong trình duyệt của bạn:


 You are using Selenoid 1.10.7!


  1. Chỉ định địa chỉ Selenoid trong các bài kiểm tra Appium trong trình điều khiển:


 ... val driver = AndroidDriver(URL("http://localhost:4444/wd/hub"), capabilities) ...


  1. Tiếp theo, chỉ định liên kết đến khả năng tích hợp:


 ... capabilities.setCapability("appium:app", "https://storage.example.com/builds/app.apk") ...


Nếu không thể cung cấp liên kết, bạn có thể chỉ định đường dẫn đến bản dựng:**


 ... capabilities.setCapability("appium:app", "/builds/app.apk") ...


Trong đó /builds/app.apk là đường dẫn bên trong vùng chứa nơi trình mô phỏng đang được chạy. Để tùy chọn này hoạt động bình thường, hãy nhớ chỉ định volumes trong browsers.json :


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        ...        "volumes": [          "/home/username/app.apk:/builds/app.apk:ro"        ]        ...      }    }  } }


Trong đó /home/username/app.apk là đường dẫn đến bản dựng trên nền tảng máy chủ.


Vậy là xong, chúng ta gần như đã thiết lập Selenoid và bây giờ chúng ta có thể thử chạy thử nghiệm:


 ./mvnw test


Nhưng thật không may, các bài kiểm tra sẽ không thể chạy. Hãy xem xét điều này và xem có gì sai.

Lần chạy thứ hai. Xem nhật ký và video

Điều đầu tiên cần làm sau khi khởi động không thành công là kiểm tra nhật ký Selenoid:


 docker logs selenoid


 [INIT] [Loading configuration files...] [INIT] [Loaded configuration from /etc/selenoid/browsers.json] [INIT] [Video Dir: /opt/selenoid/video] [INIT] [Your Docker API version is 1.41] [INIT] [Timezone: UTC] [INIT] [Listening on :4444] [NEW_REQUEST] [unknown] [172.17.0.1] [NEW_REQUEST_ACCEPTED] [unknown] [172.17.0.1] [LOCATING_SERVICE] [android] [10.0] [USING_DOCKER] [android] [10.0] [CREATING_CONTAINER] [selenoid/android:10.0] [STARTING_CONTAINER] [selenoid/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [CONTAINER_STARTED] [selenoid/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0.40s] [0] [REMOVING_CONTAINER] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [CONTAINER_REMOVED] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [SERVICE_STARTUP_FAILED] [http://172.17.0.3:4444/wd/hub does not respond in 30s]


Chúng tôi thấy rằng trạng thái là SERVICE_STARTUP_FAILED. Chuyển đến tài liệu và xem giá trị trạng thái:


 SERVICE_STARTUP_FAILED - Failed to start Docker container or driver binary


Lỗi không cho bạn biết nhiều và cần thêm thông tin. Sẽ rất tốt nếu bạn xem nhật ký vùng chứa. Hãy làm điều đó bằng cách bật ghi nhật ký:


 docker run -d \           -p 4444:4444 \           -v /var/run/docker.sock:/var/run/docker.sock \           -v "$(pwd)/selenoid/config/":/etc/selenoid/:ro \           -v "$(pwd)/selenoid/logs/":/opt/selenoid/logs/ \           aerokube/selenoid:1.10.7 \           -log-output-dir /opt/selenoid/logs


Chúng tôi cũng kích hoạt nhật ký trong phần Khả năng:


 ... capabilities.setCapability("enableLog", true) ...


Chạy thử nghiệm và xem lại nhật ký bằng trình duyệt http://localhost:4444/logs/ :


 2023-04-16T13:44:43.909768530Z Waiting X server... 2023-04-16T13:44:44.009494775Z Logging to: /tmp/fluxbox.log 2023-04-16T13:44:44.047587277Z Waiting X server... 2023-04-16T13:44:44.151933325Z Waiting X server... 2023-04-16T13:44:44.262850410Z * daemon not running; starting now at tcp:5037 2023-04-16T13:44:44.457972956Z * daemon started successfully 2023-04-16T13:44:44.458249266Z adb: no devices/emulators found 2023-04-16T13:44:45.463480812Z adb: no devices/emulators found 2023-04-16T13:44:46.471547723Z adb: no devices/emulators found 2023-04-16T13:44:47.476093515Z adb: no devices/emulators found 2023-04-16T13:44:48.481987351Z adb: no devices/emulators found 2023-04-16T13:44:49.486503149Z adb: no devices/emulators found 2023-04-16T13:44:50.492757801Z adb: no devices/emulators found 2023-04-16T13:44:51.499094108Z adb: no devices/emulators found 2023-04-16T13:44:52.505862428Z adb: no devices/emulators found 2023-04-16T13:44:53.513276412Z adb: no devices/emulators found 2023-04-16T13:44:54.520642210Z adb: no devices/emulators found 2023-04-16T13:44:55.527420189Z adb: no devices/emulators found 2023-04-16T13:44:56.534631013Z adb: no devices/emulators found 2023-04-16T13:44:57.316094939Z WARNING. Using fallback path for the emulator registration directory. 2023-04-16T13:44:57.335415397Z checkValid: hw configs not eq 2023-04-16T13:44:57.541959741Z adb: device offline 2023-04-16T13:44:58.547907700Z adb: device offline 2023-04-16T13:44:58.565504866Z emulator: WARNING: System image is writable 2023-04-16T13:44:58.565528396Z emulator: Cold boot: different AVD configuration 2023-04-16T13:44:58.565532576Z Your emulator is out of date, please update by launching Android Studio: 2023-04-16T13:44:58.565536346Z - Start Android Studio 2023-04-16T13:44:58.565539506Z - Select menu "Tools > Android > SDK Manager" 2023-04-16T13:44:58.565543076Z - Click "SDK Tools" tab 2023-04-16T13:44:58.565546216Z - Check "Android Emulator" checkbox 2023-04-16T13:44:58.565549216Z - Click "OK" 2023-04-16T13:44:58.565552146Z 2023-04-16T13:44:59.554451514Z adb: device offline 2023-04-16T13:45:00.560926060Z adb: device offline 2023-04-16T13:45:01.568777440Z adb: device offline 2023-04-16T13:45:12.124226047Z emulator: INFO: boot completed 2023-04-16T13:45:12.124251007Z emulator: INFO: boot time 27848 ms 2023-04-16T13:45:12.124255077Z emulator: Increasing screen off timeout, logcat buffer size to 2M. 2023-04-16T13:45:12.152557294Z emulator: Revoking microphone permissions for Google App.


Nhật ký bộ chứa cũng không giúp được gì nhiều ở đây vì bạn không thể xem nhật ký Appium. Bây giờ hãy thử kích hoạt chúng. Để làm điều này, hãy xem mục nhập tập lệnh point.sh :


 ... if [ -z "$VERBOSE" ]; then APPIUM_ARGS="$APPIUM_ARGS --log-level error" else EMULATOR_ARGS="$EMULATOR_ARGS -verbose" fi ...


Để bật nhật ký Appium, các tham số VERBOSE=trueAPPIUM_ARGS=--log-level debug : phải được chuyển đến vùng chứa:


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        ...        "env": [          "VERBOSE=true",          "APPIUM_ARGS=--log-level debug"        ]        ...      }    }  } }


Để kích hoạt Appium để gỡ lỗi nhật ký, bạn cần chuyển VERBOSE; trong trường hợp này, nhật ký trình mô phỏng sẽ bật và bắt đầu điền "ether"” Nhưng chúng tôi đã khắc phục điều đó cho các hình ảnh trong tương lai =)


Bây giờ nó là đủ để chuyển đến APPIUM_ARGS=-log-level debug .


 ... [HTTP] --> POST /wd/hub/session/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1/element [HTTP] {"using":"id","value":"authorization_edittext_phone"} [debug] [W3C (c89fa9c2)] Calling AppiumDriver.findElement() with args: ["id","authorization_edittext_phone"," c89fa9c2-ca2b-49cd-ab31-590eeccf77d1"] [debug] [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -and roid uiautomator [debug] [BaseDriver] Waiting up to 0 ms for condition [debug] [WD Proxy] Matched '/element' to command name 'findElement' [debug] [WD Proxy] Proxying [POST /element] to [POST http://127.0.0.1:8200/wd/hub/session/65943f03-3b35-4d3eb221-d6dc7988f935/element] with body: {"strategy":"id","selector": "authorization_edittext_phone","context":"","multiple":false} [WD Proxy] Got response with status 404: {"sessionId":"65943f03-3b35-4d3e-b221-d6dc7988f935","value":{"error" :"no such element","message":"An element could not be located on the page using the given search parameters","stacktrace":"io.appium.uiautomator2.common.exceptions.El ementNotFoundException: An element could not be located on the page using the given search parameters\n\tat io.appium.uiautomator2.handler.FindElement.safeHandle(Find Element.java:73)\n\tat io.appium.uiautomator2.handler.request.SafeRequestHandler.handle(SafeRequestHandler.java:41)\n\tat io.appium.uiautomator2.server.AppiumServlet. handleRequest(AppiumServlet.java:253)\n\tat io.appium.uiautomator2.server.AppiumServlet.handleHttpRequest(AppiumServlet.java:247)\n\tat io.appium.uiautomator2.http.Se rverHandler.channelRead(ServerHandler.java:68)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)\n\tat io .netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)\n\tat io.netty.chann... [debug] [W3C] Matched W3C error code 'no such element' to NoSuchElementError [debug] [W3C (c89fa9c2)] Encountered internal error running command: NoSuchElementError: An element could not be located on the page using the given search parameters. [debug] [W3C (c89fa9c2)] at AndroidUiautomator2Driver.findElOrEls (/opt/node_modules/appium/node_modules/appium-android-driver/lib/commands/find.js:75:11) [debug] [W3C (c89fa9c2)] at process._tickCallback (internal/process/next_tick.js:68:7) [HTTP] <-- POST /wd/hub/session/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1/element 404 23 ms - 444 ...


Như đã thấy từ nhật ký, Appium không thể tìm thấy phần tử của chúng tôi. Hãy xem điều gì đang xảy ra trên màn hình giả lập. Để làm điều này, chúng ta phải chạy giao diện người dùng Selenoid:


 docker run -d \           --name selenoid-ui \           -p 8080:8080 \           --link selenoid:selenoid \           aerokube/selenoid-ui:1.10.4 \           --selenoid-uri "http://selenoid:4444"


Truy cập http://0.0.0.0:8080 và mở Selenoid UI:


Đây là giao diện người dùng Selenoid trông như thế nào


Đảm bảo bật VNC và quay video trong các thử nghiệm:


 ... capabilities.setCapability("enableVNC", true) capabilities.setCapability("enableVideo", true) ...


Lệnh khởi động Selenoid kết thúc như thế này:


 docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "(pwd)/selenoid/logs/":/opt/selenoid/logs/ \ -v /opt/selenoid/video/:/opt/selenoid/video/ \ -e OVERRIDE_VIDEO_OUTPUT_DIR="/opt/selenoid/video/" \ -p 4444:4444 \ -name selenoid \ aerokube/selenoid:1.10.7 \ -log-output-dir /opt/selenoid/logs


Mở giao diện người dùng Selenoid sau khi thử nghiệm được thiết lập và chạy:


Đây là quy trình khởi động trong giao diện người dùng Selenoid trông như thế nào


VNC và nhật ký


Và đây là một video về nó .


Chúng tôi đã tìm ra nguyên nhân của lỗi khởi động. Tuyệt vời! Tiếp tục nào.

Lần chạy thứ ba. Xây dựng hình ảnh giả lập

Hóa ra, hình ảnh của trình giả lập Selenoid sẽ không hoạt động nếu không có dịch vụ Google Play. Để khắc phục tình trạng này, bạn phải tự xây dựng một image giả lập. Những người từ aerokube đã tập hợp mọi thứ bạn cần cho việc này: kho lưu trữ ảnhtài liệu .


  1. Đang tải xuống kho lưu trữ.
  2. Chuyển đến thư mục selenium .
  3. Chạy tập lệnh ./automate_android.sh và trả lời các câu hỏi. Đây là những gì nó trông giống như trong trường hợp của chúng tôi:


 Specify Appium version: [1.18.1] >> 1.18.1 Specify Android image type (possible values: "default", "google_apis", "google_apis_playstore", "android-tv", "android-wear"): [default] >> google_apis Specify Application Binary Interface (possible values: "armeabi-v7a", "arm64-v8a", "x86", "x86_64"): [x86] >> x86 Specify Android version: [8.1] >> 10.0 Specify device preset name if needed (eg "Nexus 4"): >> Specify SD card size, Mb: [500] >> Specify userdata.img size, Mb: [500] >> Are you building a Chrome Mobile image (for mobile web testing): [n] >> y Specify Chromedriver version if needed (required for Chrome Mobile): >> 74.0.3729.6 Specify image tag: [selenoid/chrome-mobile:74.0] >> android-emulator:10.0 Add Android quick boot snapshot? [y] >> n


Khi tôi nhìn thấy câu hỏi Thêm ảnh chụp nhanh khởi động Android?, tôi đã nghĩ đó là ảnh chụp nhanh trình giả lập . Nhưng nếu bạn xem , nó sẽ gọi một tập lệnh , cần thiết để cài đặt các ứng dụng APK. Về cơ bản, nó không mang lại cho chúng ta bất kỳ lợi ích nào.


Chúng tôi đã sử dụng trình giả lập ảnh chụp nhanh để tăng tốc độ khởi chạy vùng chứa nhưng chúng tôi sẽ nói về điều đó trong các bài viết khác.


  1. Sau khi hình ảnh được tạo, chúng tôi sẽ được nhắc đẩy nó vào sổ đăng ký. Vì chúng tôi chưa cần điều đó, chúng tôi vui lòng từ chối lời đề nghị:


 Push? >> n


Chúng tôi đã kết hợp một bản dựng với các dịch vụ của Google Play. Hãy nhớ thay đổi thông số hình ảnh trong browsers.json và khởi động lại Selenoid.


Bây giờ hãy thử chạy lại các bài kiểm tra:


 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------


đây là video chạy thử.


Tóm lại

Những gì chúng tôi đã làm:


  • Đã định cấu hình Selenoid để chạy thử nghiệm Android.
  • Đã học cách xem nhật ký và video để khắc phục sự cố.
  • Xây dựng hình ảnh giả lập của riêng chúng tôi với các dịch vụ của Google Play.


Một cái gì đó khác tôi muốn nói với bạn về:


  • Hết thời gian chờ Selenoid. Nếu ứng dụng của bạn lớn, bạn có thể gặp sự cố với thời gian chờ.
  • Cách chúng tôi cố gắng làm cho vùng chứa chạy nhanh hơn. Video cho thấy quá trình chạy mất khoảng một phút.
  • Cách chúng tôi thử chạy thử nghiệm Android gốc được viết bằng Espresso trên Selenoid. Cảnh báo spoiler: điều này hoạt động!


Đồng thời, trong phần tiếp theo, chúng tôi sẽ cho bạn biết cách chúng tôi mở rộng quy mô cơ sở hạ tầng và chạy thử nghiệm trên iOS.