Accueil/Cas d’usage et opérations/Automatisation d'applications mobiles sur appareils réels

Automatisation d'applications mobiles sur appareils réels

Mettez en place une automatisation d'applications mobiles fiable sur appareils réels avec Appium, ADB, UIAutomator et XCUITest, avec en plus la gestion de l'instabilité, la parallélisation sur la flotte et l'intégration CI.

Last updated 2026-07-15 · 5 min read

L'automatisation d'applications mobiles sur appareils réels utilise des frameworks comme Appium, ADB, UIAutomator et XCUITest pour piloter des téléphones physiques à travers des flux reproductibles. Fonctionner sur du matériel réel — et paralléliser sur une flotte — vous donne une couverture de régression et un signal de performance que les émulateurs ne peuvent pas égaler.

Key points
  • The core stacks are Appium (cross-platform), UIAutomator/Espresso and ADB (Android), and XCUITest (iOS); scrcpy is invaluable for observing and debugging Android runs.
  • Prefer written, versioned scripts over record-and-playback for anything you will maintain; recording is fine for one-off exploration.
  • Flakiness is the main enemy — solve it with explicit waits and stable selectors, not sleeps.
  • A fleet's value is parallelization: shard suites across devices to keep wall-clock time low.
  • Wire automation into CI so every build runs against a real-device core tier.

La pile d'automatisation

Appium

Appium est le choix multiplateforme le plus courant. Il expose le protocole W3C WebDriver, ce qui permet d'écrire les tests dans le langage de son choix et de piloter Android et iOS via une seule API. En coulisses, Appium délègue à des moteurs d'automatisation propres à chaque plateforme — UIAutomator2/Espresso sur Android, XCUITest sur iOS — vous obtenez ainsi un pilotage natif avec une interface portable. Il convient aux équipes qui veulent un seul framework et une seule base de tests sur toutes les plateformes.

ADB (Android Debug Bridge)

ADB est le couteau suisse d'Android. Au-delà de l'installation et du lancement d'applications, il pilote des actions au niveau shell : accorder des permissions, régler le réseau et la langue, simuler des événements d'entrée, capturer le logcat, récupérer des captures d'écran, activer le mode avion et créer des conditions pour les tests. La majorité de l'automatisation Android s'appuie sur ADB pour la configuration initiale, le nettoyage et le contrôle de l'état de l'appareil, même quand le pilotage de l'UI passe par un autre framework.

UIAutomator et Espresso

Pour les équipes uniquement Android, Espresso (en processus, boîte blanche, rapide et stable) couvre l'UI de votre propre application, tandis qu'UIAutomator gère les interactions inter-applications et avec l'UI système (notifications, boîtes de dialogue de permissions, paramètres). Ils sont souvent utilisés ensemble.

XCUITest

XCUITest est le framework UI natif d'Apple, exécuté via Xcode. C'est la voie la plus fiable pour l'automatisation UI sur iOS, et c'est ce qu'Appium pilote en coulisses sur iOS. Pour le comportement spécifique à chaque plateforme et les différences de configuration, voir flottes iOS vs Android.

scrcpy

scrcpy reflète et contrôle un appareil Android via USB ou TCP/IP avec une faible latence. Ce n'est pas un framework de test, mais c'est le moyen le plus rapide d'observer une exécution automatisée, de reproduire un échec de manière interactive et de déboguer des sélecteurs en direct.

Comparison
Appium vs going native — a coverage vs speed trade-off
Appium (cross-platform)Native (Espresso / XCUITest)
CodebaseOne test suite, both platformsSeparate suite per platform
Speed & stabilityGood, one layer of indirectionFastest, most stable on its platform
System UI accessVia UIAutomator delegationDirect (UIAutomator/XCUITest)
Best fitSmall team, shared flowsPlatform-specific team, max reliability
Appium trades some per-platform speed for one codebase across iOS and Android; native frameworks trade a shared codebase for maximum speed and stability on one platform.

Script ou enregistrement

Les outils d'enregistrement-lecture génèrent un script en capturant vos appuis. Ils sont séduisants pour un premier jet ou une vérification ponctuelle, mais les scripts enregistrés ont tendance à être fragiles : ils codent en dur des coordonnées ou des sélecteurs peu robustes et manquent de la structure nécessaire pour être maintenus à grande échelle.

Les scripts écrits à la main l'emportent pour tout ce qui doit durer. Ils permettent d'utiliser des localisateurs stables (identifiants d'accessibilité, ID de ressources), d'extraire des étapes réutilisables, de paramétrer les données, d'ajouter des assertions et de tout conserver dans le contrôle de version aux côtés de l'application. Une voie médiane pratique consiste à enregistrer pour explorer, puis réécrire les flux utiles sous forme de code maintenable avec des sélecteurs et des attentes appropriés.

Lutter contre l'instabilité et la synchronisation

Les tests instables détruisent la confiance dans une suite. Sur des appareils réels, le timing est véritablement variable — la latence réseau, les animations et la charge en arrière-plan fluctuent toutes — la solution est donc une synchronisation rigoureuse.

  • N'utilisez jamais de pauses fixes comme mécanisme d'attente principal. Remplacez-les par des attentes explicites qui interrogent une condition (élément présent, visible, activé) jusqu'à un délai maximal.
  • Utilisez des sélecteurs stables. Préférez les identifiants d'accessibilité et les ID de ressources à un XPath basé sur le texte ou l'index, qui casse au moindre changement de contenu ou de mise en page.
  • Attendez l'état de l'application, pas l'horloge. Les conditions d'inactivité, les signaux de quiescence réseau et les états des éléments sont plus fiables que de deviner une durée.
  • Contrôlez l'environnement. Réinitialisez l'état de l'application entre les tests, injectez des données connues, désactivez les animations quand c'est possible, et figez la langue/le fuseau horaire pour que les exécutions soient déterministes.
  • Mettez en quarantaine et relancez de façon délibérée. Isolez les tests connus pour être instables, ajoutez des relances bornées pour les étapes véritablement non déterministes, et suivez les taux d'instabilité pour corriger les causes profondes plutôt que de les masquer.

Paralléliser sur une flotte

Un appareil unique exécute les tests en série ; une flotte les exécute en parallèle. C'est la principale raison d'automatiser sur du matériel physique à grande échelle.

Le sharding répartit l'ensemble des tests entre les appareils, de sorte que le temps total diminue de façon à peu près linéaire avec le nombre d'appareils. Vous pouvez répartir par test (répartir les cas de manière équilibrée) ou par cellule de matrice (chaque appareil prend en charge une combinaison OS/modèle de vos niveaux de couverture).

Exigences pratiques pour des exécutions parallèles propres :

AspectApproche
Adressage des appareilsIdentifiants/numéros de série stables par appareil ; un registre associant les appareils à leurs capacités
IsolationUne session par appareil ; réinitialisation de l'état de l'application entre les exécutions
AllocationUn ordonnanceur qui attribue les appareils libres aux tâches et empêche les doubles réservations
FiabilitéDes contrôles de santé pour que les appareils morts ou hors ligne soient ignorés plutôt que comptés en échec

Coordonner les attributions, les files d'attente et l'échelonnement relève d'une couche d'orchestration — voir planification et orchestration. Maintenir les appareils suffisamment sains pour faire confiance aux résultats est traité dans supervision et santé de la flotte.

Intégration CI

L'automatisation apporte de la valeur quand elle s'exécute automatiquement. Le schéma type :

Architecture
From CI trigger to a leased device to a test report
1CI trigger
New build artifact
2Scheduler
Leases a matching device
3Device pool
Core-tier real hardware
4Test run
Appium / XCUITest / Espresso
5Results
Logs, screenshots, report
A build triggers the pipeline; the scheduler leases a matching device from the pool; results and artifacts flow back to CI.
  1. Construire l'artefact de l'application en CI.
  2. Provisionner un appareil de la flotte via l'ordonnanceur (attribuer un appareil du niveau principal correspondant à la cellule de matrice ciblée).
  3. Installer et exécuter la suite sur l'appareil attribué.
  4. Collecter les artefacts — journaux (logcat/syslog), captures d'écran ou vidéo, et un rapport de test structuré.
  5. Conditionner le pipeline au niveau principal ; exécuter une couverture plus large selon une cadence nocturne ou avant chaque release pour garder un retour rapide sur les PR.

Gardez le provisionnement des appareils derrière l'ordonnanceur plutôt que de coder en dur des numéros de série dans le pipeline, afin que les jobs CI se mettent proprement en file d'attente quand les appareils sont occupés et ne se percutent jamais.

Note

Règle empirique : conditionnez chaque build à une suite de niveau principal petite, rapide et stable. Repoussez la matrice large et lente vers les exécutions nocturnes ou de release. Cela garde le retour aux développeurs rapide sans sacrifier la couverture.

Questions fréquentes

Appium ou des frameworks natifs, que choisir ?
Si vous avez besoin d'une seule base de code pour iOS et Android, Appium est le choix pragmatique par défaut. Si vous ne visez qu'Android et voulez une vitesse et une stabilité maximales pour votre propre application, Espresso (associé à UIAutomator pour l'UI système) est excellent. Les équipes iOS uniquement optent souvent directement pour XCUITest.
Pourquoi mes tests passent en local mais échouent sur la flotte ?
Généralement une question de timing et d'état. Les exécutions locales sont plus « calmes », donc les hypothèses implicites sur la vitesse tiennent ; sous charge parallèle de la flotte, la latence varie. Remplacez les pauses fixes par des attentes de condition explicites, réinitialisez l'état de l'application entre les tests et figez la langue/le fuseau horaire.
L'exécution en parallèle est-elle vraiment plus rapide, et de combien ?
Approximativement linéaire selon le nombre d'appareils pour des tests bien répartis et indépendants ; dix appareils peuvent réduire le temps total d'une suite exécutée en série à près d'un dixième, moins la surcharge d'ordonnancement. Les gains diminuent si les tests partagent un état ou si l'ordonnanceur réserve deux fois le même appareil.
Puis-je automatiser des fonctions matérielles comme l'appareil photo ou le GPS ?
Partiellement. ADB et les API des frameworks permettent de simuler des coordonnées GPS et d'accorder des permissions, et vous pouvez injecter des images de test sur certaines configurations, mais le comportement optique et des capteurs réel nécessite toujours des vérifications manuelles ou semi-automatisées sur des appareils réels.
See also

© 2026 phonefarm.net. All original content, diagrams, and infographics on this site are our own work. Please do not copy, reproduce, or redistribute them without permission.

Consulting & fleet builds