Faça você mesmo o instalador Python para Android criado a partir do TeamCity


O público


Engenheiros de controle de qualidade, testadores de aplicativos móveis, automação.


O problema


Durante o teste de aplicativos para Android (não apenas, mas falaremos mais sobre esta plataforma), você deve instalar muitos conjuntos de produtos / produtos testados. Esse processo leva tempo e esforço, o que é mais eficiente para encontrar bugs.


Neste artigo, examinaremos uma solução existente, escreveremos a nossa em Python e compará-las.


Solução chave na mão


Talvez a solução mais popular para esse problema no momento seja fornecida pelo serviço Crashlytics, que inclui o instalador Beta.


Considere um processo típico de instalação de aplicativos usando o Crashlytics Beta:


  • Encontramos o ícone Beta (1) → pressione (2) = o aplicativo inicia.
  • Encontramos o projeto desejado (3) → toque em (4) = uma tela com uma lista de montagens é aberta.
  • Encontre a montagem desejada (5) → toque em “Download” (6) = o arquivo de instalação é baixado no dispositivo.
  • Uma tela é exibida com uma proposta para instalar o aplicativo → toque em “Instalar” (7) = a tela de instalação é exibida.
  • Encontre o aplicativo instalado (8) → pressione (9) = o aplicativo inicia; pronto para teste.

Portanto, para instalar e executar uma compilação de aplicativo usando o Crashlytics Beta, é necessário executar um total de pelo menos nove ações. Vamos nos concentrar nesses indicadores e tentar criar um instalador que exija menos ações para resolver problemas semelhantes.


Solução personalizada


Escolhemos o Python como a linguagem de programação, porque é adequada para a nossa tarefa e é muito popular, inclusive entre os engenheiros de controle de qualidade.
Para interagir com o Android, usaremos o adb, que faz parte do SDK padrão do Android.
Para baixar arquivos - Wget.
No nosso caso, as montagens são realizadas no TeamCity.


Agora vamos passar a escrever código.


Antes de tudo, como importamos o módulo subprocesso no projeto, é necessário executar os comandos wget e adb .


import subprocess 

Adicione as configurações necessárias para o Wget.


 settings = {'user': '—user=__teamcity', 'password': '—password=__teamcity', 'way': '____'} 

Instalaremos os aplicativos pelo número da compilação, portanto ensinaremos o script a solicitar esse parâmetro.


 number = input(' № : ') 

Digamos que precisamos instalar dois conjuntos ao mesmo tempo: teste e combate. Vamos baixá-los do TeamCity. Para fazer isso, descobrimos o caminho completo para os arquivos, abrindo a página de serviço e localizando a montagem nos artefatos. O URL de pré-montagem será mais ou menos assim:


 https://teamcity.mysite.com/repository/app/_/_/myapp-_-_.apk 

No endereço, em vez do número da montagem, você pode ver a identificação, por exemplo, / 1234: id /. Aqui, indicaremos não o ID, mas o número da montagem.


Escreveremos uma função para baixar os conjuntos fornecidos.


 def download(type_b): url = 'http://teamcity.mysite.com/repository/app/{0}/{1}/myapp-{0}-{1}.apk'.format(number, type_b) #    — ,  ,    —   , #     —  subprocess.check_output(['wget', '-N', '--cache=off', '--progress=bar', settings['user'], settings['password'], '-P', settings['way'], url]) 

Escreveremos uma função para instalar e executar aplicativos. Primeiro, remova os conjuntos instalados anteriormente. Não esqueça que, se pelo menos um aplicativo não estiver no dispositivo, o script terminará com um erro. Para evitar isso, ignoraremos erros.


Neste exemplo imaginário, dois pacotes:


  • com.myapp.prod
  • com.myapp.test

Atividades Iniciais:


  • com.myapp.prod/com.myapp.StartActivity
  • com.myapp.test / com.myapp.StartActivity

Os nomes dos seus pacotes e atividades serão diferentes.


 def install(type_b): try: #   ,  package name subprocess.check_output(['adb', 'uninstall', 'com.myapp.{0}'.format(type_b)]) except: #     —  . pass finally: #    subprocess.check_output(['adb', 'install', '{0}/myapp-{1}-{2}.apk'.format(settings['way'], number, type_b)]) #   ,  activity name subprocess.check_output(['adb', 'shell', 'am', 'start', 'com.myapp.{0}/com.myapp.StartActivity'.format(type_b)]) print('(^_^)  ({0}-{1})   .'.format(number, type_b)) 

Todas as funções necessárias são escritas. Agora eles podem ser aplicados.
Além disso, adicionamos um manipulador para o caso quando o assembly especificado não está no TeamCity.


 while True: try: #  ,     download('prod') #  ,     download('test') except Exception: #    —     number = input('¯\_(ツ)_/¯   .\n  №: ') else: print(' …') #      install('prod') #      install('test') #    —       print('! (_8(|)\n') break 

O script está pronto. Nós o salvamos, por exemplo, sob o nome installer.py
Adicione alias, por exemplo, alias inst = 'python ~ / scripts / installer.py'


Verifique


Portanto, para instalar um assembly usando o Crashlytics Beta, você precisa executar 9 ações. Para comparação, medimos esse indicador no script.


  • Iniciamos o script com o comando inst (1) = uma sugestão é exibida para definir o número da compilação.
  • Defina o número da montagem (2) = montagens antigas são excluídas; Baixe, instale e inicie novos. O aplicativo está pronto para teste.

Resultado


Beta (1 build) - 9 ações (não incluindo a exclusão de builds antigos).
Seu próprio script (quantas montagens quiser) - 2 ações.


Um bônus adicional da solução personalizada é que ela é dimensionada (adicionando a instalação de vários produtos a vários dispositivos etc.) e também se adapta facilmente às tarefas de teste automático.


Fontes


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


All Articles