
Meu nome é Dmitry, trabalho como testador na
MEL Science . Mais recentemente, acabei lidando com um recurso relativamente novo do
Firebase Test Lab - ou seja, com testes instrumentais de aplicativos iOS usando a estrutura de teste XCUITest nativa.
Antes disso, eu já havia experimentado o Firebase Test Lab para Android e realmente gostei de tudo, então decidi tentar colocar a infraestrutura de teste do projeto iOS na mesma trilha. Eu tive que pesquisar muito no google e nem tudo funcionou direito da primeira vez, então decidi escrever um artigo de tutorial para quem ainda precisa.
Portanto, se você possui testes de interface do usuário em um projeto iOS, hoje pode tentar executá-los em dispositivos reais, gentilmente fornecidos pela Good Corporation. Interessado - bem-vindo ao gato.
Na história, decidi criar alguns dados de origem - um repositório privado no GitHub e no sistema de construção CircleCI. O nome do aplicativo é AmazingApp, bundleID é com.company.amazingapp. Cito esses dados imediatamente, para reduzir a confusão subsequente.
Se você implementou soluções diferentes em seu projeto de maneira diferente - compartilhe sua experiência nos comentários.
1. Os próprios testes
Crie uma nova ramificação do projeto para testes de interface do usuário:
$ git checkout develop $ git pull $ git checkout -b “feature/add-ui-tests”
Abra o projeto no Xcode e crie um novo Destino com os testes de interface do usuário [XCode -> Arquivo -> Novo -> Destino -> Pacote de Teste iOS], dê o nome falante AmazingAppUITests.

Vá para a seção Fases de Construção do Destino criado e verifique a presença de Dependências de Destino - AmazingApp, em Fontes de Compilação - AmazingAppUITests.swift.
É uma boa prática isolar as várias opções de montagem em esquemas separados. Criamos um esquema para nossos testes de interface do usuário [XCode -> Produto -> Esquema -> Novo esquema] e atribuímos o mesmo nome: AmazingAppUITests.
A criação do esquema criado deve incluir o destino do aplicativo principal - testes AmazingApp e UI de destino - AmazingAppUITests - ver captura de tela

Em seguida, crie uma nova configuração de compilação para testes de interface do usuário. No Xcode, clique no arquivo do projeto, vá para a seção Informações. Clique em "+" e crie uma nova configuração, por exemplo, XCtest. Nós precisaremos disso no futuro para evitar dançar com um pandeiro quando se trata de assinatura de código.

Seu projeto possui pelo menos três destinos: o aplicativo principal, testes de unidade (porque são, certo?) E os testes de UI de destino que criamos.
Vá para Target AmazingApp, guia Build Settings, seção Identidade de assinatura de código. Para configurar o XCtest, selecione iOS Developer. Na seção Estilo de assinatura de código, selecione Manual. Ainda não geramos o perfil de provisionamento, mas um pouco mais tarde retornaremos definitivamente a ele.
Para Target AmazingAppUITests, fazemos o mesmo, mas na coluna Product Bundle Identifier, inserimos com.company.amazingappuitests.
2. Configurando um projeto no Apple Developer Program
Vamos para a página do Programa para desenvolvedores da Apple, para a seção Certificados, identificadores e perfis e, em seguida, para a coluna IDs do aplicativo do item Identificadores. Crie um novo ID de aplicativo chamado AmazingAppUITests e bundleID com.company.amazingappuitests.

Agora temos a oportunidade de assinar nossos testes com um certificado separado, mas ... O procedimento de compilação para teste envolve a construção do próprio aplicativo e a execução do executor de testes. Portanto, enfrentamos o problema de assinar dois IDs de pacote configurável com um perfil de provisionamento. Felizmente, existe uma solução simples e elegante - Wildcard App ID. Repetimos o procedimento para criar um novo ID do aplicativo, mas, em vez do ID explícito do aplicativo, selecione ID do curinga como na captura de tela.

Terminamos de trabalhar com developer.apple.com neste momento, mas não minimizaremos a janela do navegador. Vamos ao
site com a documentação do Fastlane e lemos sobre o utilitário Match de capa a capa.
Um leitor atento percebeu que, para usar esse utilitário, precisaremos de um repositório privado e de uma conta que tenha acesso ao Apple Developer Program e ao Github. Criamos (se de repente isso não for) uma conta no formato InfrastructureAccount@your.company.domínio, criamos uma senha poderosa, registramos em developer.apple.com e a designamos como administrador do projeto. Em seguida, conceda à sua conta acesso ao repositório github da sua empresa e crie um novo repositório privado com um nome como AmazingAppMatch.
3. Configurando o Fastlane e o utilitário de correspondência
Abra o terminal, vá para a pasta do projeto e inicialize a fastlane conforme indicado no
manual oficial . Depois de inserir o comando
$ fastlane init
Você será solicitado a selecionar as configurações de uso disponíveis. Selecionamos o quarto item - configuração manual do projeto.

Um novo diretório de fastlane apareceu no projeto, no qual existem dois arquivos - Appfile e Fastfile. Em poucas palavras - no Appfile, armazenamos dados de serviço e, no Fastfile, escrevemos trabalhos, na terminologia do Fastlane chamada lanes. Eu recomendo a leitura da documentação oficial:
um ,
dois .
Abra o Appfile no seu editor de texto favorito e leve-o para o seguinte formulário:
app_identifier "com.company.amazingapp"
Voltamos ao terminal e, de acordo com o manual oficial, começamos a configurar a partida.
$ fastlane match init $ fastlane match development
Em seguida, insira os dados solicitados - repositório, conta, senha etc.
Importante: na primeira vez em que você iniciar o utilitário de correspondência, será solicitado que você digite uma senha para descriptografar o repositório. É muito importante manter essa senha; no estágio de configuração do servidor de IC, será útil para nós!
Um novo arquivo apareceu na pasta fastlane - Matchfile. Abra no seu editor de texto favorito e leve para o formulário:
git_url("https://github.com/YourCompany/AmazingAppMatch")
Nós o preenchemos dessa maneira se queremos usar a correspondência para assinar compilações para postar no Crashlytics e / ou AppStore, ou seja, para assinar o ID do pacote do seu aplicativo.
Mas, como lembramos, para criar uma compilação de teste, criamos um ID curinga especial. Portanto, abra o Fastfile e insira uma nova pista:
lane :testing_build_for_firebase do match( type: "development", readonly: true, app_identifier: "com.company.*", git_branch: "uitests"
Salvar, entre no terminal
fastlane testing_build_for_firebase
e veja como a fastlane criou um novo certificado e o colocou no repositório. Ótimo!
Abra o Xcode. Agora, temos o perfil de provisionamento necessário da Match Development com.company. * Tipo, que deve ser especificado na seção Perfil de provisionamento para os destinos AmazingApp e AmazingAppUITests.

Resta adicionar a pista para criar os testes. Vamos ao
repositório do projeto de plug-in para fastlane, que facilita a configuração da exportação para o Firebase Test Lab e segue as instruções.
Copie do exemplo original para que nossa pista testing_build_for_firebase acabe com a seguinte aparência:
lane :testing_build_for_firebase do match( type: "development", readonly: true, app_identifier: "com.company.*", git_branch: "uitests" ) scan( scheme: 'AmazingAppUITests',
Para obter informações completas sobre a configuração da fastlane no CircleCI, recomendo a leitura da documentação oficial
um, dois .
Não esqueça de adicionar nosso config.yml com uma nova tarefa:
build-for-firebase-test-lab: macos: xcode: "10.1.0" working_directory: ~/project shell: /bin/bash --login -o pipefail steps: - checkout - attach_workspace: at: ~/project - run: sudo bundle install
4. Mas e a nossa bancada de testes? Configure Firebase.
De fato, prosseguimos para o que o artigo foi escrito.
Talvez seu aplicativo use o Firebase em um plano tarifário gratuito, talvez ele não o utilize. Não há absolutamente nenhuma diferença fundamental, porque para as necessidades de teste, podemos criar um projeto separado com um ano de uso gratuito (legal, certo?)
Entre na nossa conta de infraestrutura (ou qualquer outra, sem diferença) e acesse a
página do console do Firebase . Crie um novo projeto chamado AmazingAppUITests.
Importante: Na etapa anterior no Fastfile na pista firebase_test_lab_ios_xctest, o parâmetro gcp_project deve corresponder ao nome do projeto.

As configurações padrão estão muito bem conosco.
Não fechamos a guia, com a mesma conta que registramos no
Gcloud - essa é uma medida
necessária , pois a comunicação com o Firebase ocorre usando a interface do console do gcloud.
O Google oferece US $ 300 por ano, o que, no contexto da realização de testes automáticos, é equivalente a um ano de uso gratuito do serviço. Introduzimos os dados de pagamento, aguardamos a taxa de teste de US $ 1 e recebemos US $ 300 na conta. Após um ano, o projeto será automaticamente transferido para um plano tarifário gratuito, para que você não se preocupe com uma possível perda de dinheiro.
Vamos voltar à guia com o projeto Firebase e transferi-lo para o plano tarifário do Blaze - agora temos algo a pagar caso o limite seja excedido.
Na interface gcloud, selecione nosso projeto Firebase, selecione o item de menu principal "Catálogo" e adicione a API de teste em nuvem e a API de resultado em ferramentas da nuvem.

Em seguida, vá para o item de menu "IAM e administração" -> Contas de serviço -> Criar uma conta de serviço. Nós damos o direito de editar o projeto.

Crie uma chave de API no formato JSON

Nós precisaremos do JSON baixado um pouco mais tarde, mas, por enquanto, consideraremos a configuração do Laboratório de Teste concluída.
5. Configure o CircleCI
Uma pergunta razoável está se formando - o que fazer com as senhas? Salvar com segurança nossas senhas e outros dados confidenciais nos ajudará no mecanismo das variáveis de ambiente de nossa máquina de compilação. Nas configurações do projeto CircleCI, selecione Variáveis de ambiente

E inicie as seguintes variáveis:
- chave: GOOGLE_APPLICATION_CREDENTIALS
valor: arquivo-chave da conta de serviço gcloud json - chave: MATCH_PASSWORD
value: senha para descriptografar o repositório do github com certificados - chave: FASTLANE_PASSWORD
valor: Senha da conta de infraestrutura do Apple Developer Portal
Salvamos as alterações, criamos um PR e enviamos para análise do líder da nossa equipe.
Sumário
Como resultado dessas simples manipulações, obtivemos uma posição de trabalho estável e boa com a capacidade de gravar vídeo na tela do dispositivo no momento do teste. Em um caso de teste, especifiquei um modelo de dispositivo para iPhone X, mas o farm oferece uma ampla seleção de combinações de diferentes modelos e versões do iOS.
A segunda parte será dedicada à configuração passo a passo do Firebase Test Lab para um projeto Android.