Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как почистить данные приложения перед выполнением теста

mobile
java
android
Теги: #<Tag:0x00007f7b63fb0258> #<Tag:0x00007f7b63fb0118> #<Tag:0x00007f7b63fb16f8>

(Alex) #1

Ситуация:
Автоматизация тестирования adnroid приложения, перед выполнением теста нужно почистить данные приложения. Что бы авто-тест начал работу с “чистого листа”, в ручную это можно сделать перейдя в настройки приложения и нажать кнопку “Очистить данные”. Вопрос в том как это сделать программно?
Использую UiAutomator 2.0. Так как apk с тестами собирается отдельно от тестируемого приложения, фактически это другое android приложение и например удалить папку с данными тестируемого приложения из /data/data для apk с тестами требуются права системного приложения.

Код типа:
((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();
тоже требует прав системного приложения

Вопрос как почистить данные другого приложения не имея системных прав? или быть может можно при запуске указать приложению стартовать как будто с нуля не обращая на имеющиеся сохраненные данные.
Запуск приложения у меня выполняется так(может кому-то понадобится)

public static void launchPackage(UiDevice mDevice, String packageName) {
    mDevice.pressHome();
    Context context = InstrumentationRegistry.getContext();

    final String launcherPackage = getLauncherPackageName();
    mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), 5000);
    final Intent intent = context.getPackageManager()
            .getLaunchIntentForPackage(packageName);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    context.startActivity(intent);      
    mDevice.wait(Until.hasObject(By.pkg(packageName).depth(0)), 5000);
}

private static String getLauncherPackageName() {
    // Create launcher Intent
    final Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);

    // Use PackageManager to get the launcher package name
    PackageManager pm = InstrumentationRegistry.getContext().getPackageManager();
    ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return resolveInfo.activityInfo.packageName;
}

(Goshko Nazar) #2

Используйте нативный adb.

https://developer.android.com/tools/help/shell.html


(Alex) #3

А вы можете показать как это будет выглядеть в коде?
Например после каждого теста я вызываю метод:

 public static void clearData() {
     что здесь написать?
}

Делал вот так:

 public static void clearData() {
    try {
        Runtime runtime = Runtime.getRuntime();            
        runtime.exec("pm clear myPackageName");
    } catch (Exception e) {
        e.printStackTrace();
    }
 }

не помогло :frowning:


(Goshko Nazar) #4

adb shell pm clear my.wonderful.app.package


(Alex) #5

Спасибо, заработало.
Но заработало только на эмуляторе, на телефоне не работает. Я так думаю на эмуляторе работает потому что он рутованый, а телефон нет. Не знаете как это обойти на телефоне, кроме как получить root права?


(Goshko Nazar) #6

USB отладку включи, поставь adb driver. Для самсунга есть свой, для остальных - универсальный есть.


(Alex) #7

Спасибо за помощь, буду пробовать.