2017-01-28 1 views
0

J'utilise la technique ci-dessus mentionnée dans le blog, mais j'ai remarqué qu'il n'attend pas les 15 secondes nécessaires que j'essaie de régler. Ma question ici, si toute la tâche backend est terminée avant 15 secondes, l'espresso l'identifie-t-il et commence les opérations consécutives suivantes? Toute piste sur ceci est appréciée.Comment se comporte l'expresso?

public class ElapsedTimeIdlingResource implements IdlingResource { 
    private final long startTime; 
    private final long waitingTime; 
    private ResourceCallback resourceCallback; 

    public ElapsedTimeIdlingResource(long waitingTime) { 
    this.startTime = System.currentTimeMillis(); 
    this.waitingTime = waitingTime; 
    } 

    @Override 
    public String getName() { 
    return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime; 
    } 

    @Override 
    public boolean isIdleNow() { 
    long elapsed = System.currentTimeMillis() - startTime; 
    boolean idle = (elapsed >= waitingTime); 
    if (idle) { 
     resourceCallback.onTransitionToIdle(); 
    } 
    return idle; 
    } 

    @Override 
    public void registerIdleTransitionCallback(
     ResourceCallback resourceCallback) { 
    this.resourceCallback = resourceCallback; 
    } 
    } 

== 

long waitingTime = DateUtils.MINUTE_IN_MILLIS/4; 

IdlingPolicies.setMasterPolicyTimeout(
    waitingTime * 2, TimeUnit.MILLISECONDS); 
IdlingPolicies.setIdlingResourceTimeout(
    waitingTime * 2, TimeUnit.MILLISECONDS); 

IdlingResource idlingResource 
    = new ElapsedTimeIdlingResource(waitingTime); 
Espresso.registerIdlingResources(idlingResource); 
+0

Je soupçonne que c'est ce qui se passe, mais pourriez-vous poster votre code pertinent ici afin que nous puissions le confirmer? –

+0

Je ne peux pas poster le code, c'est sur le compte d'entreprise. Mais j'ai utilisé l'approche mentionnée dans le blog ci-dessous. [link] http://blog.sqisland.com/2015/06/espresso-elapsed-time.html –

+0

Je voulais dire le code que vous utilisez dans votre propre application, sauf si vous avez directement copié le code dans ce blog, mais changé le délai d'attente à 15 secondes? –

Répondre

1

Vous devez exécuter une commande Espresso, toute commande Espresso, en suivant registerIdlingResources(). J'ai créé cet exemple de test unitaire sur mon propre PC et cela fonctionne très bien.

@RunWith(AndroidJUnit4.class) 
public class ExampleInstrumentedTest { 
    @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class); 

    private final long waitingTime = DateUtils.MINUTE_IN_MILLIS/4; 

    @Before public void setUp() { 
     IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS); 
     IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS); 
    } 

    @Test public void useAppContext() throws Exception { 
     IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime); 

     Espresso.registerIdlingResources(idlingResource); 
     onView(withId(R.id.btnStart)).perform(click()); 
     Espresso.unregisterIdlingResources(idlingResource); 

     assertTrue(true); 
    } 
} 

Test results

Dans mon exemple, j'ai un bouton appelé btnStart que j'effectuer un clic, mais il peut être tout objet utile à votre application. Laissez-moi savoir si cela fonctionne pour vous.


Et pour répondre directement à vos autres questions dans les commentaires:

  1. isIdleNow() est constamment interrogé par Espresso après une ressource Idling est enregistrée. Lorsque idle est true, c'est le signal pour Espresso à passez à la commande suivante. Vous avez besoin de isIdleNow() pour renvoyer false si vous voulez bloquer.
  2. Dans ce cas spécifique, non, la ressource Idling est purement basée sur l'heure, pas sur l'état d'un processus d'arrière-plan, mais peut faire des ressources inactive qui interrogent l'état des threads/processus en cours d'exécution. À moins que votre processus ne se termine par la fermeture de l'activité, Espresso attendra, mais ne bloquera que lui-même (par exemple des éléments comme ViewMatchers, des clics, etc.), pas d'autres threads. L'activité continuera à fonctionner normalement.
+0

Attend-il 15 secondes, puis clique sur un bouton? Existe-t-il des opérations d'arrière-plan effectuées après .registerIdlingResrouces (idlingResource) –

+0

Oui. Le bouton est cliqué après que la ressource Idling a attendu 15 secondes. Les opérations d'arrière-plan qui commencent avant 'registerIdlingResrouces()' continueront à s'exécuter pendant qu'Espresso est en attente (c'est-à-dire qu'Espresso se bloque uniquement).Idéalement, vous devriez vérifier votre résultat après 'registerIdlingResrouces()' e. un 'TextView' contient le texte que vous attendez. –

+0

J'ajoute le temps d'attente à 2 endroits, 15 secondes chacun. Mon observation est que le temps d'attente n'est pas complet 15 secondes. Après tous les éléments dans les charges de vue liste 1) isIdleNow est appelée même après idle = true; 2) les commandes espresso après l'exécution de registerIdlingResources. Ce comportement ramène à ma vraie question - si toute la tâche backend est terminée avant 15 secondes, espresso l'identifie-t-il et commence les prochaines opérations consécutives? Sur la base de notre observation, espresso identifie et commence à exécuter les commandes suivantes une fois que toutes les opérations d'arrière-plan sont terminées. –