2016-08-28 4 views
4

Manchmal habe ich mit seltenen Fehler in meiner Anwendung konfrontiert. Aber ich kann es nicht reproduzieren, da es sehr selten ist. So entschied ich mich einfach Espresso Test zu schreiben:Führen Sie espresso Test mehrmals

@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)) 
     } 
    } 
} 

Wie kann ich Schleife dieser Test und es stoppen, wenn passender nicht funktioniert?

+0

Versuchen 'Spaß checkNotesListNotEmpty() throws InterruptedException' – piotrek1543

+0

@ piotrek1543 das Hauptproblem ist, dass ich nicht einen Weg zu laufen Espresso Test mehrmals (in Schleife) finden kann. Wie kann ich es tun? – Alexandr

Antwort

5

Verwenden @Repeat Anmerkung:

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

Aber Sie haben es selbst zu implementieren:

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

Ich werde es überprüfen, danke. – Alexandr

+1

@Alexandr Hast du das überprüft? Akzeptiere eine Antwort, um diese Seite besser zu machen :) – mklimek

+0

gib mir ein paar Tage :) – Alexandr

1

Can Bist du? Haben Sie einen separaten Test, der diese Schleife wiederholt? (Wenn es eine one-of-its-kind-Situation):

@RunWith(AndroidJUnit4::class) 
@LargeTest 
class MainActivityTest { 
    ... 

    @Test fun checkNotesListNotEmpty() {...} 

    @Test fun loopCheckNotesListNotEmpty() { 
     while(true) 
      checkNotesListNotEmpty() 
    } 
} 
0

Lösung von @mklimek in Kotlin präsentiert.

Wie verwenden:

@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) 
0

Android Studio ermöglicht es Ihnen, einen Test N-mal oder laufen laufen, bis er versagt . Klicken Sie auf "Konfigurationen bearbeiten" für Ihre Testregel und suchen Sie nach der Einstellung "Wiederholen:".

Screenshot