10
votes

Lorsque vous testez Android UI, quelle est la bonne façon d'attendre que l'interface utilisateur soit prête?

Le test ressemble à celui (c'est ActivityInStrumentationTestcase2): XXX

Le code que j'essaie de tester des travaux. Mais le test échoue parce que activité.RunonUthread retourne immédiatement. Je peux insérer thread.sleep et le test tourne vert mais il a l'air un peu maladroit pour moi. Dois-je utiliser une certaine synchronisation de fil ou peut-être un sondage pour que certains éléments d'interface utilisateur soient prêts à être prêts?

J'ai essayé de l'annoter avec @UthReadTest mais cela ne fonctionne pas non plus. Le code dans list.show () remplit un listview via un adaptateur personnalisé et GeView est appelé un autre thread (pas le seul test s'exécute - Et je n'ai rien à voir avec ça, je n'ai pas de fil ou d'asyncaptage, sans rien). Le test échoue à nouveau car il retourne avant que l'interface utilisateur soit prête à être vérifiée.


0 commentaires

3 Réponses :


3
votes

Vous devez faire un thread.sleep. Je ne pense pas qu'il y ait un moyen de voir ça. Je ne vois pas pourquoi c'est "maladroit"; Vous faites un test, vous devez donc attendre que le système affiche l'élément UI que vous souhaitez tester.

Cela me semble que vous essayez vraiment de tester la liste de comptes ou la liste. Il y a peu de raisons de tester ListView ou FindviewyId, sauf si vous êtes paranoïaque.

Vous devez vous concentrer sur la liste des comptes de test et votre adaptateur personnalisé. Vous ne devriez pas avoir à utiliser l'interface utilisateur pour le faire.


3 commentaires

Je peux vous dire pourquoi je n'aime pas thread.sleep . Vous dormez trop - vous perdez de temps précieux à vos tests. Vous dormez trop peu - votre test échoue. Combien de sommeil est juste d'accord? En fait ça dépend. Sur le code que vous testez et sur le poste de travail, vous le testez. Vous déplacez votre projet sur un autre ordinateur et vos tests commencent à échouer. C'est thread.sleep pour vous.


En ce qui concerne ce que je devrais tester, disons simplement que mon exemple est plutôt conçu. Ne plaidons pas ici pourquoi quelqu'un voudrait-il tester l'interface utilisateur.


Je viens de relire les commentaires que j'ai faits hier et ils ressemblent pas exactement polis pour moi maintenant. Quoi que ce soit le cas, je vous assure que tout est à cause de l'anglais, ce n'est pas ma langue maternelle. J'apprécie beaucoup et j'accepterais cela (si rien de mieux pop de Pop :).



20
votes

appeler waitforidlesync () vaut mieux que dormir pour un fixe temps.


2 commentaires

Parfait. Exactement ce que je cherchais. Cela devrait être la réponse acceptée.


Aide. Mais j'ai encore besoin d'ajouter une getinStrumentation (). Waitforidlesync (); Plus tard, effectuez la vérification du travail d'élément d'interface utilisateur.



0
votes

la documentation suivante "L'une des parties clés de l'espresso est sa capacité à synchroniser toutes les actions de test. Espresso attend jusqu'à ce que l'interface utilisateur soit inactif avant de passer à l'opération suivante. De même, il attend que les opérations d'arrière-plan d'asynctacterie se terminent. Dans Général, cela devrait aborder la majorité des synchronisations de test dans votre application. Si vous avez déjà écrit des tests d'interface utilisateur, vous apprécierez cette fonctionnalité - il n'est pas nécessaire d'ajouter des sources ou des points de synchronisation à votre application!

Cependant, il n'est parfois pas possible de s'appuyer sur la synchronisation automatique, par exemple lorsque votre application effectue des opérations d'arrière-plan via des moyens non standard (gérant les threads directement ou à l'aide de services personnalisés). Si vous rencontrez une situation dans une situation où vous ne pouvez pas compter sur l'espresso pour gérer automatiquement la synchronisation pour vous, vous pouvez utiliser Ressources de ralenti et reposez-vous toujours sur l'espresso pour la synchronisation. "

Vous pouvez lire un exemple complet au Test Codelab , vous pouvez également obtenir le code source de l'échantillon dans Github .


0 commentaires