paint-brush
如果每一刻在运动设施设备上使用 5000 多家測試;来 InDrive 的短剧本(第 1 部件) 通过@indrivetech
18,854 讀數
18,854 讀數

如何每天在移动设备上运行 5000 多个测试;来自 InDrive 的剧本(第 1 部分)

经历过 inDrive.Tech10m2023/05/30
Read on Terminal Reader

太長; 讀書

InDrive 每天在 iOS 和 Android 设备上运行超过 5,000 次测试。秘诀很简单:我们使用了 Selenoid。要编写 Appium 测试,我们使用:Kotlin; JUnit 5;行家。我们认为将材料分为两部分是个好主意:第一部分侧重于 Android,第二部分侧重于 iOS。
featured image - 如何每天在移动设备上运行 5000 多个测试;来自 InDrive 的剧本(第 1 部分)
inDrive.Tech HackerNoon profile picture

大家好!我的名字是塔拉斯·叶戈罗夫;我是 inDrive 的一名工程师。我将向您展示我们如何建立一个能够每天在 iOS 和 Android 设备上运行超过 5,000 次测试的基础设施。秘诀很简单:我们使用了 Selenoid。

前言

上一年,我的上司参与的了了项二手车自测设计,用于设计的十的部分,我参与的了了项统计表。

在接受调查的人中,Appium 被大约 20% 的团队使用,这是一个不错的开始。


他们互调查结局赶到信赖,故而他们决心题目自拟新闻小文章与您推荐他们的的经验并才能得到一个可以对于回报率。他们而言将板材分为俩个分是个好坏主意:一是要素核心于 Android,其次要素核心于 iOS。


使你们从安卓机开端。

在 Android 上运行测试

Selenoid 有的是种辅助工具,用来在 Docker 容器设计中开机运行和经营手机ie浏览器和 Android 模拟网器。您也可以阅读文章更好地有关的新信息。


要调用 Appium 测试图片,大家应用:
  • 科特林;
  • JUnit 5;
  • 行家。

第一次运行。设置硒

  1. 创建browsers.json配置文件:


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


模拟器图像在image中指定。 的小伙伴已经准备好了 Android 模拟器的现成镜像。您可以或查看它们。这些图像在任何方面都没有区别。


我们以图片browsers/android:10.0为例。必须预先下载图像: docker pull browsers/android:10.0 ,否则测试将无法运行:


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


  1. 下一步是运行 Selenoid。我们直接通过执行此操作,或者可以选择使用 。


 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


您可以通过浏览器中的链接//localhost:4444检查 Selenoid 是否正常工作:


 You are using Selenoid 1.10.7!


  1. 在能够方式的 Appium 测试方法大拇指定 Selenoid ip地址:


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


  1. 接下来,指定指向内置功能的链接:


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


若没有能够 提供环节,您能够 其他营造路径分析:**


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


其中/builds/app.apk是运行模拟器的容器内的路径。要使此选项正常工作,请务必在browsers.json中指定volumes


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


其中/home/username/app.apk是主机平台上构建的路径。


也是其实,企业近乎都设立了 Selenoid,现再企业还可以勇于尝试使用测试英文了:


 ./mvnw test


可是,不幸的是的是,测试软件将无非启动。令我们公司侦查一下下,了解下出了什么呢状况。

第二跑。查看日志和视频

发动无效后要做的一、件事是检测 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] [//172.17.0.3:4444/wd/hub does not respond in 30s]


.我了解到的情况是 SERVICE_STARTUP_FAILED。转到并看到的情况值:


 SERVICE_STARTUP_FAILED - Failed to start Docker container or driver binary


该错误代码并就没有问他您不要新问题,还需求大多新问题。最容易看一看收纳空间工作系统日志。叫自己凭借运用工作系统日志计录来练好这方面:


 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


他们还没有功能表环节停用系统日志:


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


使用浏览器//localhost:4444/logs/运行测试并查看日志:


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


贮罐工作记录在这个里也没有什么用,毕竟您看不足 Appium 工作记录。現在我能们再试一次停用什么和什么。因为,我能们看下js :


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


要启用 Appium 日志,必须将参数VERBOSE=trueAPPIUM_ARGS=--log-level debug传递给容器:


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


要使Appium要能程序调试记录,必须传达VERBOSE;在这个情况发生下,模拟仿真器记录开放并现在开始填色“ether””但.我为未来的发展的画像消除了它 =)


现在传递给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 //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 ...


从日记中不错发现,Appium 找不着.我的稀有元素。让.我看一下模拟机器显示屏幕上发生的了什么样。所以,.我需开机运行 Selenoid UI:


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


转到//0.0.0.0:8080并打开 Selenoid UI:


这就是 Selenoid UI 的样子


切实保障在自测中开启 VNC 手机视频图片录频:


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


Selenoid 开始命令提示符既定看好像这种:


 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


测量使用并使用后使用 Selenoid UI:


这就是 Selenoid UI 中的启动过程


VNC 和日志


这只是。


自己寻找了起动问题的根本原因。值得尊敬的!让自己再。

第三轮。构建模拟器图像

事证明信,假若假如 Google Play 服務,Selenoid 养成机器的彩色图像将时未办公。要挽救一些现状,您需要我自己倡导养成机器映像。来于 aerokube 的人以及制做了您因为想要的往往:和贮存库。


  1. 存储库。
  2. 转到selenium文件夹。
  3. 运行脚本./automate_android.sh并回答问题。这就是我们案例中的样子:


 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


在我见到问題 Add Android quick boot snapshot? 时,我为了是模拟训练器。有时候如果你您怎么查看,它会取用施工 APK 软件方式要求的。基本的上,它就不会跟他们产生其它利益。


人们现在已经用快照更新仿真模拟器,但人们将在各种短文中探讨。


  1. 建设方案镜像设备后,设备将报错人们将其新款到注册会员列表中。主要是因为人们还不还要它,人们将谢绝此提意:


 Push? >> n


咱们已为引入与 Google Play 提供服务放置在在一块。请系牢改进 browsers.json 中的图形参数表,然后呢再次再次重启 Selenoid。


现今就让们试试重复运动公测:


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



总结

人们所做的:


  • 配置 Selenoid 以运行 Android 测试。
  • 了解了如何查看日志和视频以进行故障排除。
  • 使用 Google Play 服务构建我们自己的模拟器映像。


仍有一项事想要来问我:


  • 硒超时。如果您的应用程序很大,您可能会遇到超时问题。
  • 我们如何尝试让容器运行得更快。视频显示运行大约需要一分钟左右。
  • 我们如何尝试在 Selenoid 上运行用 Espresso 编写的原生 Android 测试。剧透警报:这有效!


同样,在下是一一些中,他们将告诉他您他们怎么样才能映射理论知识构架并在 iOS 上运营各种测试。
바카라사이트 바카라사이트 온라인바카라