Cómo detectar si la aplicación de Android está ejecutando la prueba de interfaz de usuario con Espresso

Estoy escribiendo algunas pruebas de Espresso para Android. Estoy corriendo en el el problema siguiente:

Para que un determinado caso de prueba funcione correctamente, necesito desactivar algunas funciones de la aplicación. Por lo tanto, en mi aplicación, tengo que detectar si estoy corriendo Espresso prueba para que pueda desactivar. Sin embargo, no quiero utilizar BuildConfig.DEBUG porque no quiero que esas características se deshabiliten en una compilación de depuración. Además, me gustaría evitar crear un nuevo buildConfig para evitar que muchas variantes de construcción se creen (ya tenemos muchos sabores definidos).

Yo estaba buscando una manera de definir buildConfigField para la prueba, pero no pude encontrar ninguna referencia en Google.

Combinado con la respuesta de CommonsWare. Aquí está mi solución:

AtomicBoolean una variable AtomicBoolean y una función para comprobar si está ejecutando test:

 private AtomicBoolean isRunningTest; public synchronized boolean isRunningTest () { if (null == isRunningTest) { boolean istest; try { Class.forName ("myApp.package.name.test.class.name"); istest = true; } catch (ClassNotFoundException e) { istest = false; } isRunningTest = new AtomicBoolean (istest); } return isRunningTest.get (); } 

Esto evita realizar el cheque try-catch cada vez que necesite verificar el valor y sólo ejecuta el cheque la primera vez que llame a esta función.

Combinar el comentario de Commonsware + La solución de Comtaler aquí es una manera de hacerlo para cualquier clase de prueba usando el framework Espresso.

 public static synchronized boolean isRunningTest () { if (null == isRunningTest) { boolean istest; try { Class.forName ("android.support.test.espresso.Espresso"); istest = true; } catch (ClassNotFoundException e) { istest = false; } isRunningTest = new AtomicBoolean (istest); } return isRunningTest.get(); } 

Basándose en las respuestas anteriores, el siguiente código de Kotlin es equivalente:

 val isRunningTest : Boolean by lazy { try { Class.forName("android.support.test.espresso.Espresso") true } catch (e: ClassNotFoundException) { false } } 

A continuación, puede comprobar el valor de la propiedad:

 if (isRunningTest) { // Espresso only code } 

Puede utilizar SharedPreferences para esto.

Establecer modo de depuración:

 boolean isDebug = true; SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt("DEBUG_MODE", isDebug); editor.commit(); 

Compruebe si el modo de depuración:

 SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); boolean isDebug = sharedPref.getBoolean("DEBUG_MODE", false); if(isDebug){ //Activate debug features }else{ //Disable debug features } 
  • No se puede ejecutar Robotium en Android Studio con sólo APK
  • La ejecución falló para la tarea 'app: prepareDebugAndroidTestDependencies'
  • No se puede conseguir que Robotium funcione en Android Studio
  • Error de prueba Espresso: AppNotIdleException
  • Prueba de centrifugadoras dinámicas espresso
  • ¿Cómo usar Espresso UI Testing for React Native?
  • No hay identificación para mi prueba de interfaz de usuario de Android
  • Prueba del espresso del androide: prueba vacía suite. No se encontraron pruebas
  • Tiempo de espera de espera para el resultado de ClearAppData2 al ejecutar Xamarin UI Tests for Android
  • Prueba de la interfaz de usuario de Android con Expresso: No hay actividades en la etapa REANUDADO
  • Android: Robotium vs marco de prueba de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.