Execute testes instrumentais no Firebase Test Lab. Parte 1: projeto iOS

imagem

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.

imagem

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

imagem

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.

imagem

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.

imagem

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.

imagem

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.

imagem

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" # Bundle ID apple_dev_portal_id "infrastructureaccount@your.company.domain" #   ,     iOS   Apple Developer Program. team_id "LSDY3IFJAY9" # Your Developer Portal Team ID 

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") #       . type("development") # The default type, can be: appstore, adhoc, enterprise or development app_identifier("com.company.amazingapp") username("infrastructureaccount@your.company.domain") # Your Infrastructure account Apple Developer Portal username 

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" #     development     . ) end 

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.

imagem

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', # UI Test scheme clean: true, # Recommended: This would ensure the build would not include unnecessary files skip_detect_devices: true, # Required build_for_testing: true, # Required sdk: 'iphoneos', # Required should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab ) firebase_test_lab_ios_xctest( gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (    ) devices: [ # Device(s) to run tests on { ios_model_id: 'iphonex', # Device model ID, see gcloud command above ios_version_id: '12.0', # iOS version ID, see gcloud command above locale: 'en_US', # Optional: default to en_US if not set orientation: 'portrait' # Optional: default to portrait if not set } ] ) end 

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 #   - run: name: install gcloud-sdk #  mac    gcloud command: | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null brew cask install google-cloud-sdk - run: name: build app for testing command: fastlane testing_build_for_firebase #  lane     firebase 

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.

imagem

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.

imagem

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.

imagem

Crie uma chave de API no formato JSON

imagem

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

imagem
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.

Source: https://habr.com/ru/post/pt451786/


All Articles