adb
コマンドを手動で実行せずに、Android Studio(AndroidJunitRunner)でインストルメンテーションテストの前にアプリケーションデータをクリアするにはどうすればよいですか?
Android.support.test.runner.AndroidJUnitRunner
の種類のチートを発見しました。実際にはconnectedCheck
またはconnectedAndroidTest
を呼び出すことはありません。
コマンドラインから実行する場合$ gradle connectedCheck
:MyMainApp:assembleDebug UP-TO-DATE
:MyMainApp:assembleDebugTest UP-TO-DATE
:MyMainApp:clearMainAppData
:MyMainApp:connectedCheck
IDEインストルメンテーションテスト構成をクリックして実行する場合(緑Android赤/緑の矢印の付いたロボットロゴ)
**Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
ご覧のとおり、最後のgradleターゲットはassembleDebugTest
です。
インストルメンテーションテストを開始する前に、メインアプリのデータをクリアするためにbuild.gradle
のconnectedCheck
にフックを追加しました。
// 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
APIを調べたところ、Runlistener
インターフェースを介したフックがありますが、フックはテストアプリのコンテキスト中、つまりデバイス上で実行されており、Android禁止)あるアプリが別のアプリを変更することから。 http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html
ベストアンサーは、次のいずれかをAndroid Studio:
adb Shell pm clear my.main.app.package
、clearMainAppData
別の方法があれば私もすべての耳です。確かに、デバイステストの自動化では、アプリケーションデータをクリアする明確な方法があるはずですか?
ありがとうございました!
しばらく経ちましたが、この問題が解決されることを願っています。
私は今日同じ問題に遭遇し、解決策なしでここでクラッシュしました。
しかし、テスト構成からタスクを呼び出すことで、なんとか機能させることができました。
ステップ1:テスト構成に移動します
ステップ2:作成したgradleタスクを追加するだけです
ちなみに、私の場合のタスクは単純に次のようになります。
task clearData(type: Exec) {
def clearDataCommand = ['adb', 'Shell', 'pm', 'clear', 'com.your.application']
commandLine clearDataCommand
}
これが誰かを助けることを願っています:)
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