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