web-dev-qa-db-fra.com

Différence entre le test d'instrumentation Android et le test d'unité dans Android Studio?

Depuis Android Studio 1.1rc, il existe Prise en charge des tests unitaires et Je me demande quelle est la différence entre les tests d'instrumentation Android et les tests unitaires.

Si je comprends bien:
Tests unitaires sont utiles pour tester du code qui n'appelle pas l'API Android, ni les tests d'instrumentation Android sont plutôt des tests d'intégration Pour tester l'API Android. éléments spécifiques ou composants d'interface graphique.

Cependant, si vous utilisez un framework tel que Robolectric ou Mockito dans vos tests unitaires , Vous pouvez tester le code Android (sans avoir besoin d'un appareil) si je ne me trompe pas.


Est-ce correct ou existe-t-il une plus grande différence? Si oui, quelle est l'utilisation de chacun?

54
Joen93

Unit tests isolent le composant testé, et c’est la raison pour laquelle ils sont souvent utilisés avec les frameworks Mocks comme Mockito: parce qu’ils isolent l’unité de leurs dépendances. Notez que ce que vous dites concernant l’API Android est partiellement vrai, car il existe également Instrumented Unit tests , à savoir Instrumentation fait également partie du paquet Junit, ainsi que les classes qui étendent TestCase à la classe. AndroidTestCase fait partie du paquet Junit mais permet l'utilisation de A) Context, que vous pouvez appeler avec getContext (), et B) Des ressources faisant partie de l'API Android! Veuillez également considérer que AndroidTestCase est une classe de base et qu'il existe plusieurs autres classes très utiles qui étendent cette classe. Ils testent spécifiquement les chargeurs, les fournisseurs de contenu et même les services et ont également accès à l'API Android. ces classes fournissent donc un cadre de test JUnit ainsi que des méthodes spécifiques à Android. Maintenant, avec Junit4, il existe la ServiceTestRule qui s'étend directement d’Object et vous permet de tester un service plus facilement, bien que vous ne puissiez pas démarrer une intention directement dans cette classe.

Les tests d’instrumentation font également partie du paquet Junit, mais le contrôle de l’API Android est assez complet, car les tests d’instrumentation sont instanciés dans le système avant l’exécution du code de l’application. Pour tester, vous devez ouvrir l’application réelle ( émulateur ou un téléphone connecté via USB). Ils accèdent aux composants Android (par exemple, un bouton) et au cycle de vie des applications. Ils sont généralement plus lents que les tests Junit qui étendent TestCase (ceux examinés ci-dessus). L’utilisation typique est ActivityystrumentationTestCase2 qui utilise une approche de test fonctionnel, plus orientée utilisateur. 

EDIT: En ce qui concerne Roboelectric et Mockito, qui sont liés avec Espresso entre les frameworks de test les plus populaires du moment (13 juillet 2016), Roboelectric vous permet d'exécuter plusieurs tests en quelques secondes au lieu de quelques minutes, ce qui s'avère très utile pour les équipes qui doivent exécuter des tests continus et font l’objet d’une intégration continue.

Du site de Robolectric:

Une autre approche de Robolectric consiste à utiliser des structures fictives telles que Mockito ou pour se moquer du SDK Android. Bien que ceci soit valide approche, il donne souvent des tests qui sont essentiellement inversés implémentations du code de l'application . Roboelectric permet un style de test plus proche du test de la boîte noire, rendre les tests plus efficaces pour la refactorisation et permettre les tests se concentrer sur le comportement de l'application au lieu du mise en œuvre d'Android. Vous pouvez toujours utiliser un cadre moqueur avec avec Robolectric si vous voulez.

Mockito, qui peut également être utilisé avec Junit, est vraiment utilisé à l'exception des cas où il faut gérer des classes finales, des classes anonymes ou des types primitifs.

27
trocchietto

Il me semble que les tests d'instrumentation sont des tests d'intégration permettant de contrôler le cycle de vie et les événements (onStart, onCreate, etc.) de l'application. 

Si je comprends bien, le test des unités consiste à tester une unité (par exemple une classe) pour ses données et son comportement. 

Par exemple, disons que vous avez un jeu: ce jeu fonctionne sur une activité (activité principale) et vous avez un personnage basé sur une classe de robots, qui a 2 méthodes (feu et mouvement). Vous testez l'activité principale avec un test d'instrumentation pour voir si elle est enregistrée correctement lorsque vous quittez l'application, si elle est restaurée correctement après l'avoir restaurée, etc., puis testez Robot avec un test unitaire pour tester ses attributs et son comportement.

Disclaimer: Je ne suis pas une personne de Java, mais je me suis intéressé à votre question et j'y ai répondu sur la base d'une recherche mineure en ligne. Vous devrez probablement creuser davantage pour trouver une réponse plus détaillée.

40
gemantzu

TEST UNITAIRE

Tests unitaires exécutés uniquement sur votre ordinateur local. Ces tests sont compilé pour s'exécuter localement sur la machine virtuelle Java afin de réduire le temps d'exécution. Utilisation Cette approche permet d’exécuter des tests unitaires ne dépendant pas du fichier Cadre Android ou avoir des dépendances que les objets fictifs peuvent satisfaire.

En résumé, vous exécutez du code Java simple pour tester, par exemple, un fournisseur de contenu, les connexions à une base de données, l'entrée et la sortie de méthodes. Cela ne fonctionne pas sur Android. Pour l'exécuter, vous n'avez PAS besoin d'un appareil.

ESSAI D'INSTRUMENTATION

Tests unitaires exécutés sur un périphérique ou un émulateur Android. Ces tests ont accès aux informations d'instrumentation, telles que le contexte de l'application sous test. Utilisez cette approche pour exécuter des tests unitaires sous Android dépendances que les objets fictifs ne peuvent pas facilement satisfaire.

Donc, il se moque de la façon dont l'utilisateur utilisera l'application réelle, donc vous avez besoin d'un périphérique (physique ou émulateur) pour l'exécuter. Il a accès aux vues, activités, contexte, etc.

Référence: http://developer.Android.com/tools/testing/testing_Android.html

21
Isaac Urbina

 enter image description here 

Tests unitaires

Il s'agit de petits tests hautement ciblés pouvant s'exécuter directement sur votre ordinateur de développement local. Comme ils s'exécutent directement sur votre environnement local, ils sont très rapides et leur temps d'exécution est très inférieur.

Tests d'intégration

Ce sont les tests qui s'exécutent réellement sur un périphérique réel et non sur une machine locale et sont conçus pour tester l'intégration entre différents modules fonctionnant ensemble.

Tests de bout en bout

Mais la fidélité de ces tests est beaucoup plus grande, car ces tests sont également exécutés sur un périphérique réel et leur portée est beaucoup plus vaste car ils testent une fonctionnalité complète ou un flux de bout en bout.

Test unitaire:

  • JUnit
  • Mockito
  • PowerMock

Test de l'interface utilisateur:

  • Expresso
  • UIAutomator
  • Robotium, Appium, Calebasse, Robolectric

Lire plus ici et ici

3
yoAlex5

https://developer.Android.com/training/testing/fundamentals.html#testing-pyramid

Les petits tests sont des tests unitaires que vous pouvez exécuter indépendamment des systèmes de production. Ils se moquent généralement de tous les composants principaux et devraient fonctionner rapidement sur votre ordinateur.

Les tests moyens sont des tests d'intégration qui se situent entre de petits tests et de grands tests. Ils intègrent plusieurs composants et fonctionnent sur des émulateurs ou de vrais périphériques.

Les tests volumineux sont des tests d'intégration et d'interface utilisateur exécutés en complétant un flux de travail d'interface utilisateur. Ils veillent à ce que les tâches clés de l'utilisateur final fonctionnent comme prévu sur des émulateurs ou des appareils réels.

0
ViT-Vetal-

Test unitaire:

Souvent, les tests unitaires sont appelés «tests locaux» ou «tests unitaires locaux». La raison principale semble être que vous voulez pouvoir exécuter des tests sans périphérique ni émulateur connecté.

Les tests unitaires ne peuvent pas tester l'interface utilisateur de votre application sans se moquer d'objets tels qu'une activité.


Tests d'instrumentation:

Les tests d'instrumentation sont exécutés sur un périphérique ou un émulateur. En arrière-plan, votre application sera installée, puis une application de test permettant de contrôler votre application, de la lancer et de lancer des tests d'interface utilisateur selon les besoins.

Les tests d'instrumentation peuvent également être utilisés pour tester aucune logique d'interface utilisateur. Ils sont particulièrement utiles lorsque vous devez tester du code dépendant d'un contexte.


Lien de référence par exemple

0
akhilesh0707

Tests unitaires

Il fonctionne uniquement sur la machine locale.

Instrumentation Test case

Il fonctionne sur le périphérique ou l'émulateur Android .si vous cochez la case test, il fonctionne sur un émulateur ou un périphérique Android

0
mathi