tipos progressbar menus ejemplos android android-espresso

progressbar - menus en android ejemplos



Barras de progreso y espresso (5)

Cuando tengo una Barra de progreso en los diseños que se muestran al ejecutar algunas pruebas de espresso, me encuentro con:

Caused by: android.support.test.espresso.AppNotIdleException: Looped for 1670 iterations over 60 SECONDS. The following Idle Conditions failed .

¿Cuál es una buena manera de evitar esto? Encontré algunas cosas piratas pero buscando una buena manera.


Basado en la solución de Thomas R. , otro enfoque es cambiar el diseño de la Barra de progreso en la prueba, para evitar modificar el código de producción.

Ejemplo:

Activity activity = startActivity(); // override progress bar infinite animation with a simple image ProgressBar progressBar = (ProgressBar) activity.findViewById(R.id.loading_progressbar); progressBar.setIndeterminateDrawable(activity.getDrawable(android.R.drawable.ic_lock_lock)); // click on the button that triggers the display of the progress bar onView(withId(R.id.login_button)).perform(click());


Esta respuesta puede ser tarde. Con el espresso, debes desactivar la animación.

En su dispositivo, en Configuración> Opciones de desarrollador, deshabilite las siguientes 3 configuraciones:

Escala de animación de ventana, Escala de animación de transición, Escala de duración del animador

https://developer.android.com/training/testing/espresso/setup.html#set-up-environment

Hay una respuesta en Prueba de la barra de progreso en Android con Espresso por riwnodennyk

Pero ten cuidado con UIAnimator

Precaución: Recomendamos probar su aplicación utilizando UI Automator solo cuando su aplicación debe interactuar con el sistema para cumplir un caso de uso crítico. Debido a que UI Automator interactúa con las aplicaciones del sistema y las UI, debe volver a ejecutar y corregir sus pruebas de UI Automator después de cada actualización del sistema. Dichas actualizaciones incluyen actualizaciones de la versión de la plataforma Android y nuevas versiones de los servicios de Google Play. Como alternativa al uso de UI Automator, recomendamos agregar pruebas herméticas o separar su prueba grande en un conjunto de pruebas pequeñas y medianas. En particular, concéntrese en probar una pieza de la comunicación entre aplicaciones a la vez, como enviar información a otras aplicaciones y responder a los resultados esperados. La herramienta Espresso-Intents puede ayudarlo a escribir estas pruebas más pequeñas.

https://developer.android.com/training/testing/fundamentals.html#large-tests


Si el ProgressBar es invisible cuando se inicia la prueba, el Drawable puede ser reemplazado por un ViewAction personalizado:

// Replace the drawable with a static color onView(isAssignableFrom(ProgressBar.class)).perform(replaceProgressBarDrawable()); // Click a button (that will make the ProgressBar visible) onView(withText("Show ProgressBar").perform(click());

La ViewAction personalizada:

public static ViewAction replaceProgressBarDrawable() { return actionWithAssertions(new ViewAction() { @Override public Matcher<View> getConstraints() { return isAssignableFrom(ProgressBar.class); } @Override public String getDescription() { return "replace the ProgressBar drawable"; } @Override public void perform(final UiController uiController, final View view) { // Replace the indeterminate drawable with a static red ColorDrawable ProgressBar progressBar = (ProgressBar) view; progressBar.setIndeterminateDrawable(new ColorDrawable(0xffff0000)); uiController.loopMainThreadUntilIdle(); } }); }


Tengo el mismo problema. La prueba falló tan pronto como la primera llamada getActivity (). Por lo tanto, el dibujo indeterminado de ProgressBar debe ser reemplazado después de que la actividad haya comenzado.

Application application = (Application)this.getInstrumentation().getTargetContext().getApplicationContext(); application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { //not here, it''s too early } @Override public void onActivityStarted(Activity activity) { //find the progressBar in your activity ProgressBar progressBar = ((ProgressBar) activity.findViewById(R.id.progress_bar)); if(progressBar != null) { //replace progress bar drawable as not animated progressBar.setIndeterminateDrawable(new ColorDrawable(0xffff0000)); } } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); //Now you can start the activity getActivity();


Tengo el mismo problema. No pude encontrar una solución totalmente elegante, pero también publicaré mi enfoque.

Lo que intenté hacer es anular el indeterminateDrawable en la barra de progreso. Al tener un dibujo simple no se realiza ninguna animación y la prueba Espresso no se ejecuta en el problema de inactividad.

Desafortunadamente main y androidTest son tratados de la misma manera. No encontré una forma de anular los estilos de mi Barra de progreso.

Ahora terminó combinando algunas ideas de https://gist.github.com/Mauin/62c24c8a53593c0a605e#file-progressbar-java y Cómo detectar si la aplicación de Android ejecuta la prueba de IU con Espresso .

Al principio creé para personalizar las clases de ProgressBar, una para la depuración y otra para el lanzamiento. La versión de lanzamiento solo llama a los súper constructores y no hace nada más. La versión de depuración anula el método setIndeterminateDrawable . Con esto pude establecer un dibujo simple en lugar de uno animado.

Código de liberación:

public class ProgressBar extends android.widget.ProgressBar { public ProgressBar(Context context) { super(context); } public ProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } }

Código de depuración:

public class ProgressBar extends android.widget.ProgressBar { public ProgressBar(Context context) { super(context); } public ProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @SuppressWarnings("deprecation") @Override public void setIndeterminateDrawable(Drawable d) { if (isRunningTest()) { d = getResources().getDrawable(R.drawable.ic_replay); } super.setIndeterminateDrawable(d); } private boolean isRunningTest() { try { Class.forName("base.EspressoTestBase"); return true; } catch (ClassNotFoundException e) { /* no-op */ } return false; } }

Como puede ver, también agregué un cheque si mi aplicación está ejecutando una prueba de Espresso, mientras que la clase que estoy buscando es la base de mis pruebas de Espresso.

Lo malo es que debes actualizar todo el código para usar tu ProgressBar personalizado. Pero lo bueno es que su código de lanzamiento no tiene un gran impacto con esta solución.