2011-01-31 22 views
143

Estoy desarrollando pruebas automatizadas para una aplicación de Android (usando Robotium). Para garantizar la consistencia y confiabilidad de las pruebas, me gustaría comenzar cada prueba con estado limpio (de la aplicación bajo prueba). Para hacerlo, necesito borrar los datos de la aplicación. Esto se puede hacer manualmente en Configuración/Aplicaciones/Administrar aplicaciones/[Mi aplicación]/Borrar datosCómo borrar mediante programación los datos de la aplicación

¿Cuál es la forma recomendada de hacerlo mediante programación?

+0

Esto sería tan grande. Al depurar problemas con la base de datos, tengo que navegar mucho hacia la opción Borrar datos y realmente rompe mi flujo. –

+0

¿Es factible usar la herramienta adb para borrar los datos entre lanzamientos de aplicaciones?adb -w – smith324

+0

Desafortunadamente, esta opción no está disponible (la ayuda de adb está desactualizada). – user597603

Respuesta

20

puede borrar SharedPreferences app-datos con este

Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit(); 
editor.clear(); 
editor.commit(); 

y para despejar db aplicación, esta respuesta es correcta ->Clearing Application database

8

Compruebe que este código:

@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(); 
} 
166

Usted puede usar la herramienta de administrador de paquetes para borrar los datos de las aplicaciones instaladas (similar a presionar el botón 'borrar datos' en la configuración de la aplicación en su dispositivo). Así usando adb que podría hacer:

adb shell pm clear my.wonderful.app.package 
+1

En Android 2.1-update1, esto lamentablemente produce 'Error: comando desconocido 'clear''. –

+0

No funciona con sdk android-14 – Palani

+0

@Palani: funciona para cualquier versión anterior 2.1-r1 (andoid-7). cualquier mensaje de error? – edovino

6

Si usted tiene sólo un par de preferencias compartidas para borrar, y luego this solution is much nicer.

@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()); 
} 
+0

¿Esto no requiere que * "modo de instrumentación" * esté habilitado? ¿Cuál es ese modo de todos modos? – ADTC

+0

Sí, requiere una aplicación "instrumentada", es decir, su prueba se ejecuta junto con su código de aplicación en un dispositivo real _en proceso_, lo que significa que puede acceder a todo el estado de su aplicación y modificarla en tiempo de ejecución para fines de prueba. –

+0

¿qué debería estar en (...)? – NickUnuchek

31

En seguimiento a la respuesta de @ edovino, la forma de despejar todas de las preferencias de una aplicación mediante programación sería

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(); 
    } 
} 

Advertencia: la aplicación obligará cerca.

+5

Si tiene un código de prueba ejecutándose después de esto, falla. – rajath

+0

¿La ejecución de esto requiere y se declaran los permisos en el manifiesto? – reubenjohn

+0

No, no requiere ningún permiso especial. – Sebastiano

9

Desde la API 19, es posible llamar a ActivityManager.clearApplicationUserData().

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData(); 
+8

Solo para su información, llamar a esto terminará su aplicación. –

2

Usando Context, podemos borrar archivos de aplicaciones específicas como la preferencia, archivo de base de datos. He utilizado el siguiente código para la prueba de IU con Espresso.

@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"); 
    } 
1

si la versión androide está por encima de KitKat puede utilizar este, así

if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) { 
     ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE)) 
       .clearApplicationUserData(); 
     return; 
    } 
2

La forma más sencilla de hacerlo es

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(); 
    } 
} 

Esto borrará los datos y eliminar la aplicación de memoria. Es equivalente a la opción de borrar datos en Configuración -> Administrador de aplicaciones -> Su aplicación -> Borrar datos.

Esto eliminará completamente los datos, así como la fuerza cerrar la aplicación

+0

No agregue [la misma respuesta] (http://stackoverflow.com/a/42228794/4687348) a varias preguntas. Responda el mejor y marque el resto como duplicados. Ver [¿Es aceptable agregar una respuesta duplicada a varias preguntas?] (Http://meta.stackexchange.com/q/104227/347985) – FelixSFD

0

What is the recommended way to get this done programmatically?

La única opción posible es ejecutar comandos ADB adb shell pm clear package antes de la prueba. El mayor problema es que es una especie de dolor de cabeza que combina la ejecución de pruebas y comandos de shell.

Sin embargo, nosotros (en Mediafe) hemos encontrado una solución que puede funcionar para usted en un dispositivo normal sin raíz. Todo lo que necesitas hacer es agregar una anotación. Todo lo demás se hace ejecutando el simple bash script.

Simplemente agregue la anotación @ClearData ANTES DE CUALQUIERA de sus pruebas y tada, el comando de borrado de ADB se ejecutará antes de la ejecución de la prueba.

Este es un ejemplo de tal ensayo:

@Test 
@ClearData 
public void someTest() { 
    // your test 
} 

La idea es la siguiente

  1. Leer todas las pruebas mediante el uso de plan de ejecución adb shell am instrument -e log true
  2. Construir analizando la salida de (1)
  3. Ejecute el plan de ejecución línea por línea

Usando la misma idea son todas las opciones puede soportar fácilmente:

  • datos claros
  • barra de notificaciones Claro
  • Parameterize
  • Filtrar y correr por las etiquetas

Use solo anotaciones. De esta manera:

@Test 
@ClearData 
@Tags(tags = {"sanity", "medium"}) 
@Parameterized.Repeat(count = 3) 
public void myTest() throws Exception { 
    String param = params[index]; 
    // ... 
} 

Bono! Para cada fallaron la prueba:

  • Logcat Collect + StackTrace
  • vídeo
  • Record (mp4)
  • volcado DB (sqlite)
  • preferencias por defecto volcado compartidos (XML)
  • Recopilación de archivos dumpsys como: batería, netstats y otros.

En general, es fácil agregar más opciones, ya que las pruebas se ejecutan una por una desde el script bash en lugar de desde la tarea gradle.

El post completo el blog: https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

El código fuente con ejemplos: https://github.com/medisafe/run-android-tests

la esperanza que esto responda a 6 años que se trate;)

Cuestiones relacionadas