私は(Robotiumを使用して)Androidアプリケーションの自動テストを開発しています。テストの一貫性と信頼性を確保するために、各テストを(テスト対象のアプリケーションの)クリーンな状態で開始したいと思います。そのためには、アプリのデータを消去する必要があります。これは、設定/アプリケーション/アプリケーションの管理/ [マイアプリ] /データのクリアで手動で行うことができます
これをプログラムで実行するための推奨される方法は何ですか?
私は(Robotiumを使用して)Androidアプリケーションの自動テストを開発しています。テストの一貫性と信頼性を確保するために、各テストを(テスト対象のアプリケーションの)クリーンな状態で開始したいと思います。そのためには、アプリのデータを消去する必要があります。これは、設定/アプリケーション/アプリケーションの管理/ [マイアプリ] /データのクリアで手動で行うことができます
これをプログラムで実行するための推奨される方法は何ですか?
回答:
パッケージマネージャーツールを使用して、インストールされているアプリのデータを消去できます(デバイスのアプリ設定で[データの消去]ボタンを押すのと同じです)。したがって、adbを使用すると、次のことができます。
adb shell pm clear my.wonderful.app.package
Error: unknown command 'clear'ます。
@edovinoの回答に続き、プログラムでアプリケーションの設定をすべてクリアする方法は
private void clearPreferences() {
try {
// clearing app data
Runtime runtime = Runtime.getRuntime();
runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");
} catch (Exception e) {
e.printStackTrace();
}
}
警告:アプリケーションは強制終了します。
これでSharedPreferences app-dataをクリアできます
Editor editor =
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
アプリのデータベースをクリアするには、この答えは正しいです-> アプリケーションデータベースのクリア
APIバージョン19以降では、ActivityManager.clearApplicationUserData()を呼び出すことができます。
((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();
このコードをチェックして:
@Override
protected void onDestroy() {
// closing Entire Application
android.os.Process.killProcess(android.os.Process.myPid());
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
trimCache(this);
super.onDestroy();
}
public static void trimCache(Context context) {
try {
File dir = context.getCacheDir();
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// <uses-permission
// android:name="android.permission.CLEAR_APP_CACHE"></uses-permission>
// The directory is now empty so delete it
return dir.delete();
}
クリアする共有設定がいくつかある場合は、このソリューションの方がはるかに優れています。
@Override
protected void setUp() throws Exception {
super.setUp();
Instrumentation instrumentation = getInstrumentation();
SharedPreferences preferences = instrumentation.getTargetContext().getSharedPreferences(...), Context.MODE_PRIVATE);
preferences.edit().clear().commit();
solo = new Solo(instrumentation, getActivity());
}
コンテキストを使用して、設定、データベースファイルなどのアプリ固有のファイルをクリアできます。Espressoを使用したUIテストに以下のコードを使用しました。
@Rule
public ActivityTestRule<HomeActivity> mActivityRule = new ActivityTestRule<>(
HomeActivity.class);
public static void clearAppInfo() {
Activity mActivity = testRule.getActivity();
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(mActivity);
prefs.edit().clear().commit();
mActivity.deleteDatabase("app_db_name.db");
}
これを行う最も簡単な方法は
private void deleteAppData() {
try {
// clearing app data
String packageName = getApplicationContext().getPackageName();
Runtime runtime = Runtime.getRuntime();
runtime.exec("pm clear "+packageName);
} catch (Exception e) {
e.printStackTrace();
}
}
これにより、データが消去され、アプリがメモリから削除されます。これは、[設定]-> [アプリケーションマネージャー]-> [アプリ]-> [データの消去]の[データを消去]オプションと同じです。
これにより、データが完全に削除され、アプリが強制的に終了します
このソリューションは本当に私を助けました:
以下の2つの方法を使用して、プログラムでデータをクリアできます
public void clearApplicationData() {
File cacheDirectory = getCacheDir();
File applicationDirectory = new File(cacheDirectory.getParent());
if (applicationDirectory.exists()) {
String[] fileNames = applicationDirectory.list();
for (String fileName : fileNames) {
if (!fileName.equals("lib")) {
deleteFile(new File(applicationDirectory, fileName));
}
}
}
}
public static boolean deleteFile(File file) {
boolean deletedAll = true;
if (file != null) {
if (file.isDirectory()) {
String[] children = file.list();
for (int i = 0; i < children.length; i++) {
deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
}
} else {
deletedAll = file.delete();
}
}
return deletedAll;
}
Androidバージョンがキットカットより上にある場合は、これも使用できます
public void onClick(View view){
Context context = getApplicationContext(); // add this line
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
.clearApplicationUserData();
return;
}
これをプログラムで実行するための推奨される方法は何ですか?
可能な唯一のオプションはadb shell pm clear package、テストの前にADBコマンドを実行することです。最大の問題は、テストの実行とシェルコマンドを組み合わせると頭痛の種になることです。
ただし、私たちは(Mediafeで)通常のルート化されていないデバイスで動作するいくつかのソリューションを用意しました。アノテーションを追加するだけです。残りはすべて、単純なbashスクリプトを実行することによって行われます。
@ClearDataテストとtada🎉の前に注釈を追加するだけで、ADBのclearコマンドがテストの実行前に実行されます。
これはそのようなテストの例です:
@Test
@ClearData
public void someTest() {
// your test
}
アイデアは次のとおりです
adb shell am instrument -e log true同じアイデアを使用して、これらはすべて簡単にサポートできるすべてのオプションです。
注釈のみを使用します。このような:
@Test
@ClearData
@Tags(tags = {"sanity", "medium"})
@Parameterized.Repeat(count = 3)
public void myTest() throws Exception {
String param = params[index];
// ...
}
ボーナス!failed失敗した各テストについて:
一般に、gradleタスクからではなくbashスクリプトからテストが1つずつ実行されるため、オプションを追加するのは簡単です。
📗 完全なブログ投稿:https : //medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8
examples ソースコードと例:https : //github.com/medisafe/run-android-tests
これが6年の質問に答えることを願っています;)