簡體   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