繁体   English   中英

从 Android 中的应用程序执行检测测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM