Configurar o início automático de testes de interface do usuário de aplicativos Android por meio do TeamCity

Mais cedo ou mais tarde, qualquer testador que desenvolva a prática de autoteste enfrenta o problema da execução autônoma de seus testes. Além disso, se o especialista é experiente, ele tenta lidar com isso o mais cedo possível. Então, depois do primeiro autoteste de sucesso executado localmente, decidi configurar imediatamente o lançamento no TeamCity.

Observo que em nossa empresa praticamente não há experiência no lançamento remoto dos testes instrumentais do Android, por isso tive que pesquisar bastante, mas também não encontrei nenhum guia detalhado por lá. Portanto, eu decidi cortar essa instrução.

Na entrada temos:

  • teste (s) executado (s) com sucesso localmente
  • executando o servidor TeamCity
  • servidor no debian com KVM e X

A isenção de responsabilidade imediatamente sobre o servidor em que o lançamento será realizado: configuração do SO, virtualização de hardware e shell gráfico não é o assunto deste artigo e será omitida.

Instale e configure o agente TeamCity


Vamos começar com Java. A principal coisa aqui é escolher a versão certa. Eu tinha três dependências: os próprios testes, ferramentas para Android e agente da teamcity. Parei na versão 8 para usar uma JVM para todos. Se você tiver menos sorte e houver conflitos, precisará configurar o uso de várias versões do Java na mesma máquina. Mais uma observação: se você possui o debian, primeiro você precisa adicionar o repositório webupd8team (o google é muito rápido).

sudo apt-get install oracle-java8-installer sudo apt-get install oracle-java8-set-default 

Em seguida, crie um usuário sob o qual o agente será iniciado e, consequentemente, todo o resto. Não esqueça de definir uma senha.

 sudo useradd -d /home/tc_agent -s /bin/bash -m tc_agent sudo passwd tc_agent 

A distribuição de agentes pode ser feita na interface da web da sua cidade da equipe. Para fazer isso, vá para a seção Agentes e clique no link Instalar agentes de compilação no canto superior direito. Faça o download e descompacte o /home/tc_agent na pasta desejada no servidor (eu recomendo a pasta inicial do usuário - /home/tc_agent ). Em seguida, adicione os direitos para executar todos os scripts:

 sudo chmod +x /home/tc_agent/BuildAgent/bin/* 

Se a sua versão do teamcity suportar o Agent Push, ainda será mais fácil. Basta abrir a guia correspondente na interface da web, clique no botão Instalar agente ... e siga as instruções.

Nós configuramos uma configuração. Se você usou uma instalação remota, ela já foi criada e você só precisa especificar o nome do agente nela. Caso contrário, crie:

 cd /home/tc_agent/BuildAgent/conf cp buildAgent.dist.properties buildAgent.properties nano buildAgent.properties 

serverUrl= endereço da interface da web do servidor e name= nome exclusivo do agente. Se você tiver vários agentes ou a porta padrão (9090) estiver ocupada, defina a sua própria usando o parâmetro ownPort= .

Iniciamos /home/tc_agent/BuildAgent/bin/agent.sh start comando /home/tc_agent/BuildAgent/bin/agent.sh start . Se tudo estiver configurado corretamente, veremos nosso agente na guia Não autorizado . Nós autorizamos e você pode usar.

Para iniciar o agente automaticamente, crie o script /etc/init.d/teamcity_agent com o seguinte conteúdo:

 #!/bin/bash BINARY="/home/tc_agent/BuildAgent/bin/agent.sh" RUNAS="tc_agent" LOGFILE="/home/tc_agent/BuildAgent/logs/start.log" CMD="$BINARY $1 $2" runuser - "$RUNAS" -c "$CMD > $LOGFILE" cat $LOGFILE 

Adicione os direitos para executar sudo chmod +x /etc/init.d/teamcity_agent e adicione a linha /etc/init.d/teamcity_agent start ao arquivo /etc/rc.local .

Controle de reinicialização, o agente aumentou, seguimos em frente.

Instale o Android SDK e o emulador


Baixe as ferramentas android sdk (apenas ferramentas de linha de comando) e descompacte-o no diretório desejado. Crie um diretório para armazenar futuras imagens AVD (deve haver espaço suficiente). Para mim, os administradores conectaram o repositório principal ao diretório /var, e eu colocarei tudo lá. Em seguida, alteramos o proprietário dos arquivos para nosso usuário e as próximas etapas são melhor executadas sob ele.

 sudo chown tc_agent -R /var/opt/android-sdk sudo mkdir /var/opt/.android sudo chown tc_agent /var/opt/.android 

Adicione variáveis ​​de ambiente. Abra o arquivo /home/tc_agent/.bash_profile para editar e gravar:

 export ANDROID_HOME=/var/opt/android-sdk export ANDROID_AVD_HOME=/var/opt/.android/avd export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/tools:$PATH 

Reinicializamos e verificamos se as variáveis ​​são exibidas corretamente na interface da web do teamcity na guia Parâmetros do agente .

Tentamos executar o sdkmanager: o comando $ANDROID_HOME/tools/bin/sdkmanager --list deve listar os pacotes instalados e disponíveis. Se você receber um erro como Exception in thread "main" java.lang.NoClassDefFoundError , tente esta solução .

Instale as ferramentas necessárias e as imagens das máquinas virtuais.

 $ANDROID_HOME/tools/bin/sdkmanager emulator platform-tools tools $ANDROID_HOME/tools/bin/sdkmanager 'system-images;android-25;google_apis;x86' 

Crie e execute o AVD


Então, baixamos a imagem de 'system-images;android-25;google_apis;x86' (Android 7.1.1), criamos um dispositivo virtual baseado nele. Não entrarei em detalhes de todos os parâmetros possíveis do utilitário avdmanager, mostrarei na quantidade mínima possível:

 $ANDROID_HOME/tools/bin/avdmanager create avd -n avd_name -k "system-images;android-25;google_apis;x86" 

Transferimos o nome e a imagem original (ela deve ser baixada antecipadamente através do sdkmanager). Se o erro retornou, adicione o sinalizador -v para visualizar o texto.

Passamos para o emulador. Primeiro, verifique as pastas de emulador, plataformas, ferramentas de plataforma e imagens de sistema no diretório SDK. Criei plataformas com minhas mãos, o restante foi criado ao instalar pacotes através do sdkmanager. Em seguida, verifique a aceleração do hardware. Deveria haver essa resposta.

 $ANDROID_HOME/emulator/emulator -accel-check accel: 0 KVM (version 12) is installed and usable. accel 

Se houver um erro ao acessar /dev/kvm , adicione os direitos:

 addgroup kvm usermod -a -G kvm tc_agent chown root:kvm /dev/kvm 

Além disso, eu ainda precisava instalar o QEMU: sudo apt-get install qemu-kvm
Faça o logon novamente e verifique o emulador novamente.

Se estiver tudo bem, tente executar. Para ver através dos olhos, conecte-se ao servidor via vnc. E execute o emulador:

 $ANDROID_HOME/emulator/emulator @avd_name 

A seguinte janela deve aparecer:


Durante as execuções de teste, executaremos sem gráficos, portanto adicionaremos o parâmetro -no-window .

Configurar a compilação no TeamCity


Passamos para a fase final - montando um lançamento autônomo de nossos testes. Eu tenho uma compilação de 4 etapas.

1. Iniciando o emulador

 nohup /var/opt/android-sdk/emulator/emulator @avd_name -no-snapshot-save -no-boot-anim -no-window -snapshot clean_snap_1 > start_emulator.log 2>&1& 

Como o emulador "bloqueia" o terminal, você precisa desatar o processo usando o utilitário nohup (você pode fazê-lo de outra maneira - você decide). Por precaução, salve o log do emulador no arquivo start_emulator.log . Para executar os testes, criei um instantâneo limpo (veja aqui como fazer isso ) e adicionei a opção -no-snapshot-save para que não fosse substituída.

2. Aguardando a inicialização do dispositivo.

 adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' 

Primeiro, aguardamos o status de wait-for-device e, no loop, aguardamos quando a variável sys.boot_completed retornar 1.

3. Executando testes. Tudo é individual aqui, aqui está o meu exemplo:

 ./gradlew clean connectedAndroidTest 

4. Feche o emulador. Aqui, até agora, fiz um simples término do processo.

 kill -s 2 `pgrep qemu-system` 

Mas é melhor, é claro, lembrar o ID do processo ao criar o emulador. Isso será necessário quando começarmos a executar os testes em vários threads, que acidentalmente não "matam" o processo errado.

Isso é tudo, obrigado pela leitura. Se houver comentários de colegas mais experientes, terei prazer em fazer alterações no manual.

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


All Articles