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