[英]Execute instrumented test from app in Android
首先很抱歉,如果我的问题是无知的,我不是 Android 开发人员。 我必须构建一个机器人应用程序(在另一个应用程序中自动执行操作),并发现使用UIAutomator
可以做到这一点。 (我知道我在滥用框架,但是我看到它的方式是我试图实现的,这是任何其他方式都不可能的。)
我开始构建应用程序并且它可以工作,但是,我希望能够在没有将设备连接到 Android Studio 的情况下运行它。 是否可以通过按按钮或其他方式从应用程序执行测试?
UIautomation 依赖于 android.app.Instumentation 只能通过 adb 或从 System App 中启动。 出于安全原因,除非用户明确授予访问权限,否则系统不会授予“在其他应用程序上执行操作”的权限。
由于这个原因,我担心如果没有“连接到 android 工作室”就无法使用 UIAutomator(这种连接是通过 adb 精确实现的,Android 工作室用来连接手机)。 如果需要,您也可以直接使用 adb,但必须连接到计算机和 adb 可执行文件。
有关 UIAutomator 和 AccessibilityService 差异的更多信息在这里。
更新:即使没有 adb 连接就无法使用 UIAutomator,您仍然可以使用此详细指南编写自己的无障碍服务。 请注意,它不允许您“执行检测测试”,而是“在另一个应用程序中执行操作”。
您是否必须在某个设备/通过应用程序中运行它? 我会做的(这将需要一两天(如果您不熟悉它,则需要更多时间,但有很多好的中等帖子等))将设置一个 CI 环境,如Jenkins并触发Jenkins 随时工作,或者引入每隔 X 小时执行一次的定期工作。
如果您对通过手机运行它一无所知,那么这里的好处是您可以设置一个 webhook 并通过您的应用程序触发它,然后 jenkins 将触发您想要的工作。
这种方法的另一个优点是,理论上您可以将其扩展到无穷大,并且您的机器人在 X 个不同的设备中并行运行测试
设置 Jenkins 并下载 Android 命令行工具后,您将需要创建一个作业,在其中构建一个普通 apk 和一个测试 apk 并将其安装到目标设备。
这是运行 ui 测试需要提供的构建命令的一个小示例(您可以使用Emulator Plugin或下载您自己的仿真器和 avd 从 Firebase 测试实验室等连接真实设备。它还包括禁用锁定屏幕的方法/animations 这会破坏 ui 测试。不幸的是,Jenkins/Android 命令行工具的整个设置远远超过了这个问题的 scope 这里有一些有用的内容
在 Ubuntu 上设置 Jenkins 在 Jenkins 上 设置 Android
./gradlew clean myapp:assembleDebug --no-daemon -Dkotlin.compiler.execution.strategy="in-process"
./gradlew myapp:assembleDebugAndroidTest --no-daemon -Dkotlin.compiler.execution.strategy="in-process"
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 install -r myapp/build/outputs/apk/debug/myapp-debug.apk
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 install -r -t myapp/build/outputs/apk/androidTest/debug/myapp-debug-androidTest.apk
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell input keyevent KEYCODE_MENU
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global window_animation_scale 0 &
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global transition_animation_scale 0 &
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global animator_duration_scale 0 &
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell am instrument -w -e clearPackageData true --no-window-animation -e package com.mypackage.testcases.tests -e debug false com.mypackage.test/androidx.test.runner.AndroidJUnitRunner
是的,有可能。
可以通过两种方式实现:
在第一个应用程序中实现基于意图的框架,并从您的第二个应用程序发送定制的意图,将它们与第一个应用程序或 adb 可以理解的数据捆绑在一起
正在广播 -a com.android.example --es KEY some_key --es VALUE some_value
使用 JAVA 套接字通信和 UiAutomator 框架实现 TCP 服务器,该框架识别并在第一个应用程序的 UI 对象上执行操作,并将其编译为仪器测试 apk,并从您的第二个应用程序发送命令到此服务器应用程序以控制它(总共 3 个应用程序:第一,第二(客户端)和服务器)
我知道一开始听起来很混乱,但它确实有效!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.