Ejecute la testing de expreso varias veces

A veces me enfrenté a errores poco comunes en mi aplicación. Pero no puedo reproducirlo, ya que es muy raro. Entonces, decidí escribir una testing simple de espresso:

@RunWith(AndroidJUnit4::class) @LargeTest class MainActivityTest { val password = "1234" @Rule @JvmField var mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java) @Test fun checkNotesListNotEmpty() { onView(withId(R.id.password_edit_text)).perform(typeText(password)) onView(withId(R.id.notes_recycler_view)).check { view, noMatchingViewException -> if (noMatchingViewException != null) throw noMatchingViewException assertThat((view as RecyclerView).adapter.itemCount, Matchers.`is`(1)) } } } 

¿Cómo puedo repetir esta testing y detenerla cuando falla la coincidencia?

Use la anotación @Repeat :

 @Test @Repeat(100) fun checkNotesListNotEmpty() { } 

Pero debes implementarlo tú mismo:

Repeat.java:

 import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.METHOD; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention( RetentionPolicy.RUNTIME ) @Target({ METHOD, ANNOTATION_TYPE }) public @interface Repeat { int value() default 1; } 

RepeatRule.java:

 import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class RepeatRule implements TestRule { private static class RepeatStatement extends Statement { private final Statement statement; private final int repeat; public RepeatStatement(Statement statement, int repeat) { this.statement = statement; this.repeat = repeat; } @Override public void evaluate() throws Throwable { for (int i = 0; i < repeat; i++) { statement.evaluate(); } } } @Override public Statement apply(Statement statement, Description description) { Statement result = statement; Repeat repeat = description.getAnnotation(Repeat.class); if (repeat != null) { int times = repeat.value(); result = new RepeatStatement(statement, times); } return result; } } 

¿No puedes hacer una testing por separado que bucle esa? (si es una situación única en su tipo):

 @RunWith(AndroidJUnit4::class) @LargeTest class MainActivityTest { ... @Test fun checkNotesListNotEmpty() {...} @Test fun loopCheckNotesListNotEmpty() { while(true) checkNotesListNotEmpty() } } 

Solución presentada por @mklimek en Kotlin.

Cómo utilizar:

 @Rule @JvmField var repeatRule: RepeatRule = RepeatRule() @Test @RepeatTest(100) fun checkNotesListNotEmpty() { 

RepeatRule.kt

 class RepeatRule : TestRule { private class RepeatStatement(private val statement: Statement, private val repeat: Int) : Statement() { @Throws(Throwable::class) override fun evaluate() { for (i in 0..repeat - 1) { statement.evaluate() } } } override fun apply(statement: Statement, description: Description): Statement { var result = statement val repeat = description.getAnnotation(RepeatTest::class.java) if (repeat != null) { val times = repeat.value result = RepeatStatement(statement, times) } return result } } 

RepeatTest.kt

 @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.ANNOTATION_CLASS) annotation class RepeatTest(val value: Int = 1) 

Android Studio le permite ejecutar una testing N veces o ejecutar hasta que falle. Haga clic en "Editar configuraciones" para su regla de testing y busque la configuration "Repetir:".

Captura de pantalla

  • Cómo get references de identificadores personalizados en values ​​/ ids.xml
  • No se pueden agregar las extensiones de Kotlin para Android a mi proyecto
  • Cómo fusionar 2 flujos separados, almacenar los datos rellenos y subscribirlos después de un time corto
  • Usar Kotlin para pasar Image from ImageView a otra actividad en Android
  • Constructores en Kotlin
  • logging de kotlin con parameters lambda
  • Verificación de nulidad de Kotlin si el enfoque es funcional ... ¿Cómo?
  • Lista vista: desplazamiento suave hacia abajo
  • No se puede usar getter personalizado con propiedad delegada
  • La function en línea de Kotlin no funciona correctamente
  • Gestionar ACTION_UP en OnLongPress Android