-
Grave, reproduza e revise: automação de interface com o Xcode
Aprenda a gravar, executar e manter testes do XCUIAutomation no Xcode. Reproduza seus testes de interface de usuário do XCTest em dezenas de idiomas, tipos de dispositivos e condições de sistema usando as configurações do plano de teste. Revise os resultados dos testes usando o relatório de testes do Xcode e baixe capturas de tela e vídeos das execuções. Também abordaremos as melhores práticas para preparar seu app para automação com acessibilidade e para escrever código de automação estável e de alta qualidade.
Capítulos
- 0:00 - Introdução
- 3:58 - Visão geral da automação da interface de usuário
- 6:26 - Preparar seu app para automação
- 11:32 - Gravar suas interações
- 17:30 - Reproduzir em várias configurações
- 20:54 - Revisar vídeos e resultados
- 24:16 - Próximas etapas
Recursos
- Performing accessibility testing for your app
- Improving code assessment by organizing tests into test plans
- Delivering an exceptional accessibility experience
Vídeos relacionados
WWDC24
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
WWDC21
-
Buscar neste vídeo...
-
-
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 - Introdução
A automação da interface do Xcode, impulsionada pelo framework XCUIAutomation, permite que você teste seus apps de forma abrangente. Ele funciona em conjunto com o Swift Testing e o framework XCTest, fornecendo um pacote completo de teste de app. Os testes de automação da interface validam a experiência do usuário de um app, sua integração com o hardware da Apple e o comportamento de fluxos de trabalho comuns, complementando os testes de unidade que abordam lógica e modelos de dados do app. O processo envolve três fases principais: Interações de gravação, que são automaticamente convertidas em código. Reprodução dessas interações em vários dispositivos, idiomas, regiões e orientações. Revisão de gravações de vídeo e resultados de cada teste de interface executado. Essas automações permitem que você teste seus apps como usuários reais, garantindo acessibilidade, suporte a idiomas e integração de hardware. Esse processo é compatível com todas as plataformas da Apple, permitindo que você crie e execute testes de automação uma vez para vários dispositivos, como iPhone, iPad, Mac, Apple TV e Apple Watch, com um clique.
- 3:58 - Visão geral da automação da interface de usuário
A automação da interface simula as interações do usuário com o app ao abri-lo, tocar nos botões e navegar pelas telas. São usados os recursos de acessibilidade do app, que fornecem rótulos, valores e identificadores exclusivos para elementos a fim de executar essas ações de forma independente. A acessibilidade, um dos principais valores da Apple, garante que os apps possam ser usados por todos, além de potencializar a automação da interface.
- 6:26 - Preparar seu app para automação
Para preparar a automação do app, várias etapas estão envolvidas. Primeiro, adicione identificadores de acessibilidade aos elementos do app. Esses identificadores são rótulos exclusivos escritos em SwiftUI, UIKit ou AppKit que ajudam as ferramentas de automação a reconhecer e interagir com partes específicas do app. Eles são particularmente úteis para elementos com strings localizadas ou conteúdo dinâmico e precisam ser descritivos, estáticos e exclusivos em todo o app. Depois, faça uma revisão rápida da acessibilidade do app usando o Inspetor de Acessibilidade. Essa ferramenta ajuda a identificar e corrigir eventuais problemas de acessibilidade, garantindo que o app esteja preparado para a automação. O Inspetor de Acessibilidade permite que você visualize e modifique as propriedades de acessibilidade de cada visualização, tornando o app mais funcional para tecnologias assistivas e scripts de automação. Por fim, adicione um novo destino de teste de interface ao projeto do Xcode. Esse destino fornece um espaço dedicado para armazenar o código de automação. Assim que o destino estiver configurado, você pode começar a gravar as interações com o app, que serão automaticamente traduzidas em código Swift, agilizando o processo de automação.
- 11:32 - Gravar suas interações
O projeto modelo Landmarks, mostrado no Xcode e Simulador, demonstra o planejamento de férias virtuais na Austrália. As gravações da interface capturam as interações dentro do app como código. O exemplo adiciona uma nova coleção, renomeia-a como “Max's Australian Adventure” e a preenche com pontos de referência como a Grande Barreira de Corais e Uluru. Quando a gravação é interrompida, o exemplo revisa o código gerado, seleciona as consultas de interface apropriadas e adiciona validações usando o XCTest para garantir a funcionalidade do app. O teste é então executado novamente, verificando a criação da coleção e a adição dos pontos de referência. É possível aprimorar ainda mais os testes ao ajustar estados de dispositivo específicos, simular locais e realizar auditorias de acessibilidade.
- 17:30 - Reproduzir em várias configurações
O Xcode Cloud permite testes automatizados do app em várias configurações na mesa e na nuvem, bem como em diferentes idiomas e dispositivos. Os planos de teste organizam os testes, definem os ajustes do sistema e gerenciam propriedades. As configurações permitem o teste em locais específicos, incluindo idiomas com strings mais longas ou scripts da direita para a esquerda. O Xcode Cloud executa testes na nuvem, salvando vídeos e capturas de tela de falhas para análise. Uma equipe inteira pode visualizar o histórico, os registros e os resultados, o que facilita a colaboração e o monitoramento remoto. Configurações avançadas e mais detalhes estão disponíveis na Documentação do Desenvolvedor.
- 20:54 - Revisar vídeos e resultados
O relatório de teste do Xcode fornece uma ferramenta abrangente para analisar os resultados do teste. Ao identificar uma execução de teste com falha, é possível acessar gravações de vídeo e descrições detalhadas. O relatório sobrepõe interações da interface ao vídeo e inclui uma linha do tempo com marcadores de falha para navegação rápida. É possível exibir os elementos da interface presentes no ponto de falha, receber sugestões de código e editar o código de teste diretamente. Após as correções, o teste pode ser executado novamente, e o relatório permite que você verifique a funcionalidade em diferentes idiomas e layouts, melhorando a qualidade e a acessibilidade do app.
- 24:16 - Próximas etapas
Para ter mais informações sobre teste de unidade e teste do Swift, consulte a sessão “Meet Swift Testing” da WWDC24. Se tiver dúvidas ou comentários, acesse os Fóruns para desenvolvedores.