View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Toutes les vidéos
  • À propos

Plus de vidéos

  • À propos
  • Résumé
  • Code
  • Enregistrer, revoir et réviser : Automatisation de l’interface utilisateur avec Xcode

    Apprenez à enregistrer, exécuter et gérer des tests XCUIAutomation dans Xcode. Rejouez vos tests d'interface utilisateur XCTest dans des dizaines de langues, de types d'appareils et de conditions système à l'aide de configurations de plan de test. Vérifiez les résultats de vos tests à l'aide du rapport de test Xcode, puis téléchargez des captures d'écran et des vidéos de vos exécutions. Nous aborderons également les meilleures pratiques pour préparer votre app à l'automatisation avec l'accessibilité et écrire un code d'automatisation stable et de haute qualité.

    Chapitres

    • 0:00 - Introduction et ordre du jour
    • 3:58 - Présentation de l’automatisation de l’interface utilisateur
    • 6:26 - Préparez votre app pour l’automatisation
    • 11:32 - Enregistrez vos interactions
    • 17:30 - Rejouer dans plusieurs configurations
    • 20:54 - Examiner les vidéos et les résultats
    • 24:16 - Étapes suivantes

    Ressources

    • Performing accessibility testing for your app
    • Improving code assessment by organizing tests into test plans
    • Delivering an exceptional accessibility experience
      • Vidéo HD
      • Vidéo SD

    Vidéos connexes

    WWDC24

    • Meet Swift Testing

    WWDC23

    • Build accessible apps with SwiftUI and UIKit
    • Create practical workflows in Xcode Cloud
    • Fix failures faster with Xcode test reports
    • Perform accessibility audits for your app

    WWDC22

    • Author fast and reliable tests for Xcode Cloud

    WWDC21

    • SwiftUI Accessibility: Beyond the basics
  • Rechercher dans cette vidéo…
    • 7:52 - Adding accessibility identifiers in SwiftUI

      // Adding accessibility identifiers in SwiftUI
      import SwiftUI
      
      struct LandmarkDetailView: View {
        let landmark: Landmark
        var body: some View {
          VStack {
            Image(landmark.backgroundImageName)
              .accessibilityIdentifier("LandmarkImage-\(landmark.id)")
            
            Text(landmark.description)
              .accessibilityIdentifier("LandmarkDescription-\(landmark.id)")
          }
        }
      }
    • 8:19 - Adding accessibility identifiers in UIKit

      // Adding accessibility identifiers in UIKit
      import UIKit
      
      struct LandmarksListViewController: UIViewController {
        let landmarks: [Landmark] = [landmarkGreatBarrier, landmarkCairo]
      
        override func viewDidLoad() {
          super.viewDidLoad()
      
          for landmark in landmarks {
            let button = UIButton(type: .custom)
            setupButtonView()
                      
            button.accessibilityIdentifier = "LandmarkButton-\(landmark.id)"
            
            view.addSubview(button)
          }
        }
      }
    • 13:54 - Best practice: Prefer accessibility identifiers over localized strings

      // Example SwiftUI view
      struct CollectionDetailDisplayView: View {
        var body: some View {
          ScrollView {
            Text(collection.name)
              .font(.caption)
              .accessibilityIdentifier("Collection-\(collection.id)")
          }
        }
      }
      
      // Example of a worse XCUIElementQuery
      XCUIApplication().staticTexts["Max's Australian Adventure"]
      
      // Example of a better XCUIElementQuery
      XCUIApplication().staticTexts["Collection-1"]
    • 14:09 - Best practice: Keep queries as concise as possible

      // Example SwiftUI view
      struct CollectionDetailDisplayView: View {
        var body: some View {
          ScrollView {
            Text(collection.name)
              .font(.caption)
              .accessibilityIdentifier("Collection-\(collection.id)")
          }
        }
      }
      
      // Example of a worse XCUIElementQuery
      XCUIApplication().scrollViews.staticTexts["Collection-1"]
      
      // Example of a better XCUIElementQuery
      XCUIApplication().staticTexts["Collection-1"]
    • 14:21 - Best practice: Prefer generic queries for dynamic content

      // Example SwiftUI view
      struct CollectionDetailDisplayView: View {
        var body: some View {
          ScrollView {
            Text(collection.name)
              .font(.caption)
              .accessibilityIdentifier("Collection-\(collection.id)")
          }
        }
      }
      
      // Example of a worse XCUIElementQuery
      XCUIApplication().staticTexts["Max's Australian Adventure"]
      
      // Example of a better XCUIElementQuery
      XCUIApplication().staticTexts.firstMatch
    • 15:49 - Add validations to a test case

      // Add validations to the test case
      import XCTest
      
      class LandmarksUITests: XCTestCase {
      
        func testGreatBarrierAddedToFavorites() {
          let app = XCUIApplication()
          app.launch()
          app.cells["Landmark-186"].tap()
          XCTAssertTrue(
            app.staticTexts["Landmark-186"].waitForExistence(timeout: 10.0)),
            "Great Barrier exists"
          )
      
          let favoriteButton = app.buttons["Favorite"]
          favoriteButton.tap()
          XCTAssertTrue(
            favoriteButton.wait(for: \.value, toEqual: true, timeout: 10.0),
            "Great Barrier is a favorite"
          )
        }
      }
    • 16:36 - Set up your device for test execution

      // Set up your device for test execution
      import XCTest
      import CoreLocation
      
      class LandmarksUITests: XCTestCase {
      
        override func setUp() {
          continueAfterFailure = false
          
          XCUIDevice.shared.orientation = .portrait
          XCUIDevice.shared.appearance = .light
            
          let simulatedLocation = CLLocation(latitude: 28.3114, longitude: -81.5535)
          XCUIDevice.shared.location = XCUILocation(location: simulatedLocation)
        }
        
      }
    • 16:54 - Launch your app with environment variables and arguments

      // Launch your app with environment variables and arguments
      import XCTest
      
      class LandmarksUITests: XCTestCase {
      
        func testLaunchWithDefaultCollection() {
          let app = XCUIApplication()
          app.launchArguments = ["ClearFavoritesOnLaunch"]
          app.launchEnvironment = ["DefaultCollectionName": "Australia 🐨 🐠"]
          app.launch()
      
          app.tabBars.buttons["Collections"].tap()
          XCTAssertTrue(app.buttons["Australia 🐨 🐠"].waitForExistence(timeout: 10.0))
        }
      }
    • 17:04 - Launch your app using custom URL schemes

      // Launch your app using custom URL schemes
      import XCTest
      
      class LandmarksUITests: XCTestCase {
      
        func testOpenGreatBarrier() {
          let app = XCUIApplication()
          let customURL = URL(string: "landmarks://great-barrier")!
          app.open(customURL)
      
          XCTAssertTrue(app.wait(for: .runningForeground, timeout: 10.0))
          XCTAssertTrue(app.staticTexts["Great Barrier Reef"].waitForExistence(timeout: 10.0))
        }
      }
    • 17:12 - Launch your app using custom URL schemes and the system default app

      // Launch your app using custom URL schemes
      import XCTest
      
      class LandmarksUITests: XCTestCase {
      
        func testOpenGreatBarrier() {
          let app = XCUIApplication()
          let customURL = URL(string: "landmarks://great-barrier")!
          XCUIDevice.shared.system.open(customURL)
      
          XCTAssertTrue(app.wait(for: .runningForeground, timeout: 10.0))
          XCTAssertTrue(app.staticTexts["Great Barrier Reef"].waitForExistence(timeout: 10.0))
        }
      }
    • 17:13 - Perform an accessibility audit during an automation

      // Perform an accessibility audit during an automation
      import XCTest
      
      class LandmarksUITests: XCTestCase {
        
        func testPerformAccessibilityAudit() {
          let app = XCUIApplication()
          try app.performAccessibilityAudit()
        }
      
      }
    • 0:00 - Introduction et ordre du jour
    • L’automatisation de l’interface de Xcode, optimisée par le framework XCUIAutomation, vous permet de tester vos apps de manière exhaustive. Associée à Swift Testing et au framework XCTest, elle offre une suite complète de tests d’apps. Les tests d’automatisation des interfaces valident l’expérience utilisateur d’une app, son intégration au matériel Apple et le comportement des processus courants, en complément des tests unitaires qui se concentrent sur la logique des apps et les modèles de données. Le processus comporte trois phases principales : Enregistrement des interactions, qui sont ensuite automatiquement converties en code. Répétition de ces interactions sur différents appareils, selon différentes langues, zones géographiques et orientations. Examen des enregistrements vidéo et des résultats de chaque série de tests d’interface. Ces automatisations vous permettent de tester vos apps comme le feraient de vrais utilisateurs, en garantissant l’accessibilité, la prise en charge des langues et l’intégration matérielle. Elles sont prises en charge sur toutes les plateformes Apple, ce qui vous permet de créer et d’exécuter des tests d’automatisation une seule fois, et de les appliquer à plusieurs appareils (iPhone, iPad, Mac, Apple TV et Apple Watch), en un seul clic.

    • 3:58 - Présentation de l’automatisation de l’interface utilisateur
    • L’automatisation de l’interface reproduit les interactions de l’utilisateur avec une app - lancement, appui sur les boutons, navigation sur les écrans. Elle s’appuie sur les fonctionnalités d’accessibilité de l’app qui fournissent des étiquettes, des valeurs et des ID uniques pour les éléments, afin d’effectuer ces actions indépendamment. L’accessibilité, une valeur fondamentale d’Apple, garantit que les apps sont utilisables par tout le monde et favorise également l’automatisation de l’interface.

    • 6:26 - Préparez votre app pour l’automatisation
    • Pour préparer l’automatisation de l’app, plusieurs étapes sont nécessaires. Tout d’abord, ajoutez des ID d’accessibilité aux éléments de l’app. Ces ID sont des étiquettes uniques écrites dans SwiftUI, UIKit ou AppKit qui aident les outils d’automatisation à reconnaître des parties spécifiques de l’app et à interagir avec. Ils sont particulièrement utiles pour les éléments comportant des chaînes de caractères localisées ou du contenu dynamique, et doivent être descriptifs, statiques et uniques dans l’ensemble de l’app. Ensuite, effectuez un examen rapide de l’accessibilité de l’app à l’aide d’Accessibility Inspector. Cet outil identifie et corrige les problèmes d’accessibilité, ce qui garantit une préparation correcte de l’app en vue de l’automatisation. Accessibility Inspector vous permet d’afficher et de modifier les propriétés d’accessibilité de chaque vue, ce qui rend l’app plus facilement utilisable, tant pour les technologies d’assistance que pour les scripts d’automatisation. Enfin, ajoutez une nouvelle cible de test de l’interface au projet Xcode. Cette cible fournit un espace dédié pour stocker le code d’automatisation. Une fois la cible configurée, vous pouvez commencer à enregistrer vos interactions avec l’app. Elles seront automatiquement traduites en code Swift, simplifiant ainsi le processus d’automatisation.

    • 11:32 - Enregistrez vos interactions
    • L’exemple de projet Landmarks, présenté dans Xcode et Simulator, illustre la planification de vacances virtuelles en Australie. Les enregistrements de l’interface capturent les interactions au sein de l’app sous forme de code. L’exemple ajoute une nouvelle collection, la renomme « Max’s Australian Adventure » et la renseigne avec des points de repère comme la Grande Barrière de Corail et Uluru. Une fois l’enregistrement terminé, l’exemple examine le code généré, sélectionne les requêtes d’interface appropriées et ajoute des validations à l’aide de XCTest pour garantir la fonctionnalité de l’app. Le test est ensuite relancé, vérifiant avec succès la création de la collection et l’ajout de points de repère. Vous pouvez encore améliorer les tests en configurant des états d’appareil spécifiques, en simulant des lieux et en effectuant des audits d’accessibilité.

    • 17:30 - Rejouer dans plusieurs configurations
    • Xcode Cloud permet d’automatiser les tests d’apps dans diverses configurations au bureau et dans le cloud, ainsi que pour des langues et des appareils différents. Les plans de test organisent les tests, définissent des paramètres système et gèrent les propriétés. Les configurations permettent de tester dans des langues spécifiques, y compris les langues avec des chaînes plus longues ou des scripts de droite à gauche. Xcode Cloud exécute des tests dans le cloud, en enregistrant des vidéos et des captures d’écran des échecs à des fins de vérification. Toute une équipe peut consulter l’historique des exécutions, les journaux et les résultats, ce qui facilite la collaboration et la surveillance à distance. Les configurations avancées et d’autres détails sont disponibles dans la documentation du développeur.

    • 20:54 - Examiner les vidéos et les résultats
    • Le rapport de test Xcode fournit un outil complet d’analyse des résultats de test. En cas d’identification d’un échec de test, vous pouvez accéder aux enregistrements vidéo et aux descriptions détaillées. Le rapport superpose les interactions de l’interface sur la vidéo et comprend une chronologie avec des losanges d’échec pour une navigation rapide. Vous pouvez visualiser les éléments d’interface actuels au point de défaillance, recevoir des suggestions de code et modifier directement votre code de test. Une fois les corrections apportées, le test peut être réexécuté et le rapport vous permet de vérifier les fonctionnalités dans différentes langues et mises en page, ce qui améliore la qualité et l’accessibilité de l’app.

    • 24:16 - Étapes suivantes
    • Pour plus d’infos sur les tests unitaires et les tests Swift, consultez la séance « Découvrez les tests Swift » de la WWDC24. Pour toute question ou tout commentaire, consultez les Forums des développeurs.

Developer Footer

  • Vidéos
  • WWDC25
  • Enregistrer, revoir et réviser : Automatisation de l’interface utilisateur avec Xcode
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines