19

adbコマンドを手動で実行せずに、インストルメンテーション テストの前に Android Studio (AndroidJunitRunner) にアプリケーション データをクリアさせるにはどうすればよいですか?

私はその種のチートを発見しましたandroid.support.test.runner.AndroidJUnitRunner- それは決して実際に呼び出しconnectedCheckたりconnectedAndroidTest.

  1. コマンドラインから実行する場合$ gradle connectedCheck

    :MyMainApp:assembleDebug UP-TO-DATE
    :MyMainApp:assembleDebugTest UP-TO-DATE
    :MyMainApp:clearMainAppData
    :MyMainApp:connectedCheck
    
  2. インストルメンテーション テスト構成をクリックして IDE 内から実行する場合 (赤/緑の矢印が付いた緑の Android ロボット ロゴ)

    **Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
    

    ご覧のとおり、最後のgradleターゲットはassembleDebugTest

インストルメンテーション テストを開始する前に、メイン アプリのデータをクリアするためconnectedCheckのフックを追加しました。build.gradle

// Run 'adb' shell command to clear application data of main app for 'debug' variant
task clearMainAppData(type: Exec) {
    // we have to iterate to find the 'debug' variant to obtain a variant reference
    android.applicationVariants.all { variant ->
        if (variant.name.equals("debug")) {
            def clearDataCommand = ['adb', 'shell', 'pm', 'clear', getPackageName(variant)]
            println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]"
            commandLine clearDataCommand
        }
    }
}
// Clear Application Data (once) before running instrumentation test
tasks.whenTaskAdded { task ->
    // Both of these targets are equivalent today, although in future connectedCheck
    // will also include connectedUiAutomatorTest (not implemented yet)
    if(task.name.equals("connectedAndroidTest") || task.name.equals("connectedCheck" )){
        task.dependsOn(clearMainAppData)
    }
}

別の方法として、メイン アプリに「データのクリア」ボタンを実装し、インストルメンテーション アプリに UI をクリックさせることもできますが、その解決策は望ましくないと思います。

AndroidJUnitRunnerAPIを調べたところ、Runlistenerインターフェイスを介したフックがありますが、フックはテスト アプリのコンテキスト中、つまりデバイス上で実行されており、Android はあるアプリが別のアプリを変更することを禁止しています。 http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html

Android Studio 内から次のいずれかを自動的にトリガーするのを手伝っていただければ、ベストアンサーになります。

  • コマンドラインを実行しadb shell pm clear my.main.app.package
  • またはできれば私のgradleタスクを呼び出すclearMainAppData

別の方法があれば、私もすべての耳です。確かに、デバイス テストの自動化により、アプリケーション データをクリアする明確な方法があるはずですか?

ありがとうございました!

4

2 に答える 2

30

しばらく経ちましたが、今までにこの問題が解決されていることを願っています。

今日も同じ問題に遭遇し、解決策なしでここでクラッシュしました。

しかし、テスト構成から自分のタスクを呼び出すことで、なんとか機能させることができました。

ステップ 1 : テスト構成に移動します

テスト構成

ステップ 2: 作成した gradle タスクを追加するだけです

ここからgradleタスクを呼び出すだけです

ちなみに、私の場合のタスクは単純に次のようになります。

task clearData(type: Exec) {
  def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
  commandLine clearDataCommand
}

これが誰かを助けることを願っています:)

于 2016-02-02T15:13:37.643 に答える
18

Android Test Orchestrator を使用すると、gradle スクリプトを介してこのオプションを簡単に提供できます。

android {
  defaultConfig {
   ...
   testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

   // The following argument makes the Android Test Orchestrator run its
   // "pm clear" command after each test invocation. This command ensures
   // that the app's state is completely cleared between tests.
   testInstrumentationRunnerArguments clearPackageData: 'true'
 }

以下は、Android Test Orchestrator のリンクです。

https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator

于 2019-08-12T12:25:54.627 に答える