web-dev-qa-db-ja.com

Android Studio-インストルメンテーションテスト用のアプリケーションデータをクリアする

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です。

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

// 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をクリックさせることもできますが、その解決策は望ましくありません。

AndroidJUnitRunner AP​​Iを調べたところ、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

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

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

13
Razzle Shazl

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

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

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

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

Your test configuration

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

Simply call your gradle task from here

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

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

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

26
NSimon

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 TestOrchestratorのリンクです

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