Capturas de tela automáticas do iOS usando o XCTestplan e o Xcode 11

Existem várias aplicações móveis no Raiffeisenbank que devem funcionar em uma ampla variedade de dispositivos e sistemas operacionais; portanto, tentamos automatizar os processos de rotina nos testes. Este artigo nos pareceu útil e decidimos traduzi-lo. fonte da foto: unsplash.com Se o seu aplicativo for multilíngue, universal e projetado para diferentes dispositivos, você poderá gastar muito tempo criando capturas de tela para cada configuração. Imagine que você tem quatro idiomas, suporte para iPad e iPhone e precisa salvar 4 telas cada - estas são 32 capturas de tela. O processo deve ser automatizado para não perder tempo toda vez que as interfaces são atualizadas.






A ferramenta XCTestPlan, que apareceu no Xcode 11, permite criar várias configurações para testes. Atualmente, as configurações são usadas com mais frequência para determinar como os testes serão executados, incluindo a escolha do idioma para o aplicativo. Neste artigo, você aprenderá como usar o XCTestPlan para automatizar capturas de tela.

Iniciar o XCTestplan


Vamos definir um destino UITests separado para automatizar a criação de capturas de tela, o que é especialmente útil se você não planeja executar seus principais testes com essas configurações. Para criar um novo destino, selecione Arquivo -> Novo -> Destino e crie um novo Pacote de Teste de UI . Depois disso, você precisará adicionar um novo plano XCTest a esse destino. Para fazer isso, você pode usar o menu Produto -> Plano de teste -> Novo plano de teste ou, no Editor de esquema, selecionar Converter para usar planos de teste . Se você fizer isso através do menu, precisará garantir que o novo alvo esteja na guia `Testar '.

Como queremos definir apenas as configurações de idioma, podemos deixar inalteradas as configurações compartilhadas e simplesmente adicionar uma nova configuração para cada idioma que suportamos. É assim que as configurações de um aplicativo que suporta inglês, alemão e francês são:

imagem

Essa é toda a configuração e o lançamento necessários do XCTestplan.

Automação de capturas de tela


Seus testes de interface do usuário criando capturas de tela praticamente não diferem dos testes usuais, exceto que eles criarão anexos. Você também pode adicionar verificações XCTAssert para que os testes falhem se algo der errado.

Outro ponto importante: pode ser necessário waitForExpectations caso a sua interface do usuário não esteja pronta no momento em que a captura de tela for feita ( teclado mostrando / ocultando, conclusão da animação).

Abaixo está um exemplo com todos os métodos auxiliares:

func testScreenshots() {
    let app = XCUIApplication()
    let searchButton = app.buttons["search"]
    searchButton.tap()
    
    let keyboard = app.keyboards.firstMatch
    waitForExistence(of: keyboard)
    app.typeText("Cupertino")
    add(takePromoShot(name: "Search"))
    
    let firstResult = app.cells.firstMatch
    firstResult.tap()
    waitForDisappearance(of: keyboard)
    add(takePromoShot(name: "Result"))
}

func waitForExistence(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == TRUE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func waitForDisappearance(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == FALSE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func takePromoShot(name: String) -> XCTAttachment {
    let lang = Locale.preferredLanguages[0]
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    attachment.name = "\(lang)-\(name)"
    return attachment
}

Preste atenção ao último recurso. Ele pega o nome do instantâneo, adiciona o identificador de idioma, captura uma captura de tela e retorna um XCTAttachment com o valor do parâmetro .keepAlways . Isso é importante porque, por padrão, as capturas de tela capturadas durante os testes são excluídas se os testes forem bem-sucedidos. O Lifiteme é um parâmetro importante, pois garante que a captura de tela seja salva após a conclusão do teste. Durante os testes de interface do usuário, as capturas de tela são feitas constantemente. Eles são muito úteis quando você precisa determinar por que e quando o teste caiu; mas, por padrão, as capturas de tela serão excluídas se os testes forem bem-sucedidos. Assim, quando testScreenshots () for bem-sucedido, você terá apenas as capturas de tela necessárias.

Barra de status habitual


A maioria dos desenvolvedores prefere ver nas telas uma barra de status com a hora certa, um sinal de rede completo e outros detalhes. No Xcode 11, isso é ainda mais fácil. Existe um utilitário xcrun simctl status_bar , que permite especificar essas configurações. Isso pode ser adicionado como fase de construção :

xcrun simctl status_bar booted override --time 9:41 --operatorName ' ' --cellularMode active --cellularBar 4 --wifiBars 3 --batteryState charged

Após esse comando, a barra de status terá a mesma aparência dos materiais de marketing da Apple. Infelizmente, a equipe não trabalha em um dispositivo real, apenas em um simulador. Observe também que o simulador que você usa deve estar em execução antes de iniciar os testes para coletar capturas de tela.

Coletando as capturas de tela resultantes


Agora podemos executar nossos testes de interface do usuário. Quando eles passarem, veremos os resultados no Navegador de relatórios no Xcode. Também haverá testes contendo procedimentos agrupados por configurações de idioma. Os procedimentos que possuem anexos são marcados com um clipe de papel. As próprias imagens podem ser abertas no QuickLook .

imagem

A coleta separada de todas as imagens resultantes pode consumir muito tempo, principalmente se o seu aplicativo suportar muitos idiomas. Infelizmente, esses anexos não aparecem como png ou jpg entre os resultados do teste (outra alteração no Xcode 11). Mas você pode analisar os resultados do teste e encontrar o JSON que aponta para os anexos reais e os coleta. Isso pode ser feito usando o utilitário xcparse.. É instalado usando o Homebrew e iniciado pelo comando:

xcparse screenshots /path/to/Test.xcresult /path/to/outputDirectory

Sinalizadores adicionais agruparão arquivos por dispositivo, SO ou configuração. Os nomes de nossos arquivos contêm um identificador de idioma, para que você possa simplesmente classificá-los por nome.

Conclusão


A abordagem descrita já nos permitiu economizar tempo suficiente, especialmente em situações em que havia um requisito para oferecer suporte ao dispositivo com uma nova resolução ou a interface foi significativamente atualizada. No WWDC20, gostaria de ver a escolha dos dispositivos como parte da configuração do XCTestplan, mas, por enquanto, você deve escolher manualmente ou usar um script que colete as capturas de tela necessárias na AppStore.

All Articles