Appium et les frameworks mobiles modernes : comprendre les défis de l’automatisation

L'automatisation mobile a considérablement mûri au cours de la dernière décennie, notamment grâce à des frameworks comme Appium qui permettent aux équipes d'automatiser des applications à l'aide de langages et d'outils familiers. Parallèlement, les frameworks d'interface utilisateur modernes tels que React Native, Flutter et Jetpack Compose ont transformé la façon dont les applications mobiles sont conçues en masquant une grande partie de la couche d'interface utilisateur native.

Bien que ces frameworks accélèrent le développement, ils peuvent également introduire des défis inattendus pour l'automatisation des tests, en particulier lorsque les éléments d'interface utilisateur sont générés dynamiquement ou ne possèdent pas d'identifiants stables.

Comprendre comment les frameworks modernes exposent les éléments d'interface utilisateur aux outils d'automatisation peut aider les équipes à concevoir des applications à la fois conviviales pour les développeurs et adaptées à l'automatisation.

Comment les outils d'automatisation mobile identifient les éléments d'interface utilisateur

Les frameworks d'automatisation tels que Appium interagir avec les applications mobiles via les frameworks d'automatisation natifs fournis par le système d'exploitation.

Par exemple :

  • Android: UIAutomator2
  • iOS: XCUITest

Ces frameworks natifs exposent la hiérarchie de l'interface utilisateur de l'application aux outils d'automatisation. Les scripts de test interagissent avec les éléments de cette hiérarchie à l'aide de localisateurs tels que :

  • Identifiants d'accessibilité
  • Identifiants de ressources
  • Expressions XPath
  • Noms de classe

Parmi ceux-ci, les identificateurs d'accessibilité sont largement recommandés car ils ont tendance à rester stables d'une version à l'autre et malgré les modifications de l'interface utilisateur.

Pour les lecteurs qui découvrent Appium, vous pouvez consulter une présentation de Architecture Appium ici.

Stabilité des frameworks d'interface utilisateur modernes et du localisateur

Des frameworks comme React Native, Flutter et Jetpack Compose fournissent des couches d'abstraction qui permettent aux développeurs d'écrire du code d'interface utilisateur plus efficacement. Cependant, ces frameworks génèrent souvent des composants d'interface utilisateur natifs de manière dynamique lors de l'exécution.

Par conséquent:

  • La structure de la hiérarchie de l'interface utilisateur peut changer d'une version à l'autre.
  • Certains éléments peuvent ne pas exposer d'identifiants stables.
  • Les structures de vue générées automatiquement peuvent affecter la fiabilité du localisateur

Cela ne signifie pas que ces frameworks sont difficiles à automatiser. Au contraire, cela souligne l'importance de définition explicite d'identifiants stables pour les éléments d'interface utilisateur dont dépendent les tests d'automatisation.

Cela a également des conséquences sur les nouvelles fonctionnalités telles que l'autoréparation basée sur l'IA. Ces systèmes reposent sur une certaine stabilité de la structure de l'application pour détecter les modifications réelles d'un localisateur. Si les identifiants et les hiérarchies d'interface utilisateur varient considérablement d'une version à l'autre, chaque exécution peut nécessiter une « réparation », ce qui réduit l'efficacité des mécanismes de récupération automatique.

Instabilité des identifiants entre les versions

L'une des sources fréquentes d'instabilité de l'automatisation survient lorsque les éléments d'interface utilisateur dépendent d'identifiants qui changent d'une version à l'autre.

Voici quelques exemples:

  • Éléments sans identifiants d'accessibilité définis
  • Structures de vue générées dynamiquement
  • Identifiants dérivés de la hiérarchie interne des composants

Dans de tels cas, les tests d'automatisation peuvent réussir dans une version mais échouer dans une autre car la structure de l'interface utilisateur sous-jacente a changé.

Ceci est particulièrement fréquent dans les frameworks d'interface utilisateur modernes où les composants natifs rendus peuvent différer en fonction des mises à jour de la mise en page ou des optimisations du framework.

Exemple : Identifiants stables dans React Native

Les frameworks comme React Native offrent des propriétés qui permettent aux développeurs d'exposer des identifiants stables pour l'automatisation.

Par exemple :

<Button 
  testID="login_button" 
  title="Login" 
/>

Cet identifiant devient accessible aux frameworks d'automatisation et permet aux tests de localiser l'élément de manière fiable.

L'utilisation de tels identifiants explicites garantit la stabilité des tests même si la mise en page de l'interface utilisateur évolue au fil du temps.

Accessibilité et testabilité vont souvent de pair.

L’utilisation d’identificateurs d’accessibilité n’est pas seulement bénéfique pour l’automatisation. Elle améliore également l’expérience utilisateur pour les personnes qui utilisent des technologies d’assistance telles que les lecteurs d’écran.

Le Apple et Google recommande d'afficher des étiquettes et des identifiants d'accessibilité significatifs dans des applications mobiles pour améliorer l'accessibilité.

En pratique, cela signifie que concevoir des éléments d'interface utilisateur en tenant compte de l'accessibilité améliore souvent la fiabilité de l'automatisation en même temps.

Conseil pratique de débogage : inspectez la hiérarchie de l’interface utilisateur

Lorsque les localisateurs se comportent de manière incohérente d'une version à l'autre, l'inspection de la hiérarchie de l'interface utilisateur peut révéler comment les éléments sont exposés aux outils d'automatisation.

Les outils qui permettent de réaliser cela comprennent :

  • Inspecteur Appium
  • Inspecteur d'accessibilité Xcode
  • Visionneuse Android UIAutomator
  • Inspecteur de mise en page d'Android Studio

Ces outils permettent aux testeurs d'examiner l'arborescence de l'interface utilisateur et de vérifier :

  • Les éléments exposent-ils des identifiants d'accessibilité stables ?
  • Si les identifiants changent d'une version à l'autre
  • Si la hiérarchie de l'interface utilisateur contient des composants générés dynamiquement

Souvent, le simple fait d'inspecter la hiérarchie de l'interface utilisateur permet d'identifier beaucoup plus facilement la cause première de l'instabilité du localisateur.

Meilleures pratiques pour les ingénieurs QA

Les ingénieurs en assurance qualité peuvent améliorer la fiabilité de l'automatisation en suivant quelques pratiques clés :

  • Préférez identificateurs d'accessibilité sur les localisateurs XPath
  • Valider la stabilité du localisateur sur plusieurs versions
  • Collaborer avec les développeurs pour définir des identifiants stables
  • Utilisez des outils d'inspection d'interface utilisateur pour vérifier les stratégies de localisation.

Les frameworks d'automatisation sont puissants, mais ils dépendent fortement de la manière dont les éléments d'interface utilisateur sont exposés par l'application.

Meilleures pratiques pour les développeurs mobiles

Les développeurs peuvent améliorer considérablement la testabilité en envisageant l'automatisation lors du développement de l'interface utilisateur.

Les pratiques utiles comprennent :

  • Définition d'identifiants d'accessibilité explicites pour les éléments d'interface utilisateur importants
  • Éviter les identifiants générés dynamiquement
  • Assurer la cohérence des identifiants entre les différentes versions
  • Documenter les identifiants utilisés par les tests d'automatisation

Lorsque les développeurs intègrent la testabilité au processus de conception de l'interface utilisateur, l'automatisation devient beaucoup plus stable et maintenable.

L'automatisation en tant que partie intégrante de Continuous Testing

Dans les pipelines de livraison modernes, l'automatisation mobile fait souvent partie d'une stratégie de tests continus plus large, où les tests automatisés s'exécutent tout au long du cycle de vie du développement.

Les équipes souhaitant étendre l'automatisation à de vastes parcs d'appareils combinent souvent des frameworks comme Appium avec des plateformes de fermes d'appareils prenant en charge l'exécution d'automatisations mobiles à grande échelle. Cela permet de réaliser des tests sur plusieurs appareils et versions de systèmes d'exploitation.

En savoir plus sur le Digital.ai Plateforme de test ici : https://docs.digital.ai/continuous-testing/

Conclusion

Les frameworks mobiles modernes tels que React Native, Flutter et Jetpack Compose ont considérablement amélioré la productivité des développeurs. Cependant, leurs couches d'abstraction peuvent parfois complexifier l'automatisation si la testabilité n'est pas prise en compte lors du développement.

Pour une automatisation fiable, les ingénieurs QA et les développeurs ont tous deux intérêt à traiter Les identifiants de test constituent un élément essentiel de la conception de l'interface utilisateur., plutôt qu’une réflexion après coup.

Des identifiants d'accessibilité stables améliorent la fiabilité de l'automatisation avec des outils comme Appium tout en assurant une meilleure accessibilité pour les utilisateurs réels.

Lorsque les équipes collaborent dès le début sur la testabilité (en exposant des identifiants stables, en évitant les localisateurs dynamiques et en validant la hiérarchie de l'interface utilisateur), l'automatisation mobile devient beaucoup plus prévisible et maintenable d'une version à l'autre.

Dans de nombreux cas, la différence entre une automatisation fragile et une automatisation fiable ne réside pas dans l'outil de test lui-même, mais dans la capacité de l'interface utilisateur de l'application à être testée.

Vous aimerez aussi