Gerenciamento automatizado de testes com o Telegram

Como engenheiro de controle de qualidade, desenvolvi um sistema de autoteste. Enfrentou uma série de problemas:

  • Para cada tipo de teste, tive que criar meus próprios trabalhos no CI e executá-los manualmente.
  • Os desenvolvedores se recusaram a executar casos de autoteste.
  • A incapacidade de executar autotestes de qualquer lugar no dispositivo.
  • Os engenheiros de teste manual de controle de qualidade não puderam executar os autotestes.

Portanto, decidi criar um pequeno protótipo do bot para executar testes automatizados, que cobririam a maioria dos problemas descritos acima.

Descrição da ideia:

O usuário envia os comandos necessários para o bate-papo, inicia a compilação no sistema de CI, de acordo com as regras especificadas na configuração. O CI executa autotestes com marcas pytest. Após a execução, o script dentro do repositório de teste recebe informações sobre o status da compilação, coleta logs e os envia de volta ao usuário no bate-papo por telegrama.

Ferramentas:

As ferramentas
  • Linguagem de Programação - Python
  • Estrutura de teste - Pytest
  • Cliente HTTP - Solicitações
  • DataBase - SQLite3
  • ORM - Peewee
  • Sistema CI - Travis CI



Conteúdo

  1. Preparação
  2. Bot Registration
  3. Preparando um Repositório de Teste
  4. Testes e registro
  5. Geração de relatórios
  6. Configurar o Travis CI
  7. Configuração de bot
  8. Os princípios do bot
  9. Implantação no Heroku


Bot Registration


Primeiro de tudo, precisamos registrar o telegrama do bot e obter seu ID exclusivo, que é um token. Para fazer isso, escreva a mensagem / start no bot @BotFather.
Nossa equipe principal é / newbot, digitando a qual seremos solicitados a criar o nome do bot.
Mas há uma regra - o nome deve terminar em bot. BotFather pega o nome do bot e retorna seu token. Ative o bot iniciando a conversa. Em seguida, você precisa enviar uma solicitação de API para o método getUpdates.

https://api.telegram.org/bot{_}/getUpdates 

Lembre-se do hat_id recebido.


Preparando um Repositório de Teste


Em seguida, você precisa organizar um repositório com testes ou usar um artigo pré- preparado .


Testes e registro

Crie funções de teste e marque-as com a marca pytest - cheia, fumaça e pássaro.

É importante adicionar log aos nossos testes criando um arquivo pytest.ini e adicionando chamadas ao método info da biblioteca de log nas funções de teste.
O arquivo pytest.ini contém modelos para logs ativos e um arquivo de log.

Exemplo de teste
 import pytest import requests import logging @pytest.mark.full @pytest.mark.smoke def test_cat_facts(): query = {"animal_type": "cat", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full @pytest.mark.smoke def test_dog_facts(): query = {"animal_type": "dog", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full def test_horse_facts(): query = {"animal_type": "horse", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.bird def test_bird_facts(): query = {"animal_type": "bird", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 



pytest.ini
 [pytest] markers = smoke: for smoking testing full: for regression testing bird: facts only bird log_cli = 1 log_cli_level=INFO log_cli_format = %(asctime)s [%(levelname)8s] %(message)s log_cli_date_format='%Y-%m-%d %H:%M:%S' log_file = test_log.log log_file_level=INFO log_file_format= %(asctime)s [%(levelname)8s] %(message)s log_file_date_format='%Y-%m-%d %H:%M:%S' 




Geração de relatórios

Criamos um script que, após a conclusão da montagem, coleta informações do sistema de IC e as envia para bate-papo por telegrama, juntamente com os logs.
Dentro do script, você precisa substituir os valores TELEGRAM_BOT e CHAT_ID pelos que você recebeu anteriormente.

Código de script
 import requests import os TRAVIS_TEST_RESULT = os.environ.get("TRAVIS_TEST_RESULT") TRAVIS_REPO_SLUG = os.environ.get("TRAVIS_REPO_SLUG") TRAVIS_BRANCH = os.environ.get("TRAVIS_BRANCH") TRAVIS_JOB_WEB_URL = os.environ.get("TRAVIS_JOB_WEB_URL") TRAVIS_COMMIT_MESSAGE = os.environ.get("TRAVIS_COMMIT_MESSAGE") TELEGRAM_TOKEN = "808619876:GHrtj9zs-KvKhhtWyu1YoxjtIikUYMGVjD8g" CHAT_ID = "272560060" if TRAVIS_TEST_RESULT != 0: build_status = "" else: build_status = "" TEXT = f" : {build_status} \n : {TRAVIS_REPO_SLUG} \n : {TRAVIS_BRANCH} \n Commit : {TRAVIS_COMMIT_MESSAGE} \n -: {TRAVIS_JOB_WEB_URL}" def send_message(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage" body = {'chat_id': CHAT_ID, 'text': TEXT} response = requests.post(url=URL, json=body) return response def send_file(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendDocument" body = {'chat_id': CHAT_ID} file = {"document": open("test_log.log")} response = requests.post(url=URL, data=body, files=file) return response send_message() send_file() 


O script usa variáveis ​​do sistema e recebe valores do Travis CI.

Se o valor de TRAVIS_TEST_RESULT não for igual a zero, o valor é definido como "Êxito", a função send_message é processada primeiro, o que envia as informações de montagem para o chat (nome do repositório, ramificação selecionada, nome da confirmação usada, link para o log da web) e a função send_file que envia arquivo de log.

No repositório de teste, adicione o arquivo de configuração - travis.yml. Dentro, descrevemos o pipeline através do qual a montagem funcionará.

travis.yml
 language: python python: - "3.7" install: - pip install -r requirements.txt script: pytest -m smoke after_script: - python tg_command.py 


Em seguida, precisamos implantar o repositório no GitHub para adicioná-lo ao Travis CI.


Definindo TRAVIS_CI


Nós vamos ao site .
Faça login usando sua conta do GitHub. Alterne para a guia Painel. Após abrir o DevTools (Rede) anteriormente, na subguia Repositórios, no site oposto ao repositório de teste, mova o controle deslizante - ative sua montagem. Na guia Rede (DevTools), chega uma solicitação ativa, na visualização com informações sobre o ID do repositório, o número deve ser lembrado (cópia / gravação). Mudando para o site na guia Configuração. Copiamos ou lembramos o token - precisamos dele.


Configuração de bot


Neste artigo, não vamos nos concentrar na análise do código, você pode vê-lo no repositório . Agora é importante entendermos o básico do tópico, então vamos à configuração do nosso bot:

Dentro do repositório estão os arquivos:

  1. main.py - script de bot;
  2. models.py - arquivo com modelos para ORM;
  3. arquivo conf.ini com variáveis ​​de configuração;
  4. runtime.txt - valores fixos da versão Python para o Travis CI;
  5. procfile - configuração para gunicorn;
  6. wsgi.py - arquivo de inicialização do aplicativo com gunicorn.

Para fazer seu bot funcionar, você precisa substituir os dados no conf.ini, a saber:

  • travis_token - indica o token recebido para o Travis CI;
  • travis_base_url - especifique o endereço da API do Travis CI;
  • travis_repository_id - especifique o ID do repositório com autotestes, dentro do Travis CI;
  • telegram_chat_id - especifique o ID de bate-papo do telegrama para o qual as mensagens do bot serão enviadas;
  • telegram_bot_url - especifique o URL para o bot.

Exemplo Conf.ini
 [travis] travis_token = token HkjhkjgGKJhjgFGfdgd travis_base_url = https://api.travis-ci.org travis_repository_id = 10898384 [telegram] telegram_chat_id = 24234234 telegram_bot_url = https://api.telegram.org/bot87543366:AAHtj9zs-Kv4zGWyu1eTXegikUYMGVjD8g/ 



Os princípios do bot

É importante que cada solicitação tenha o status de resposta 200. Caso contrário, o telegrama começará a enviar solicitações ciclicamente até receber uma resposta válida.

O bot tem um conjunto de comandos:

O delimitador pode ter qualquer caractere especial, exceto o sublinhado.

  • add_m - adicione um kit de teste (marcas python).
    Predefinição: * command * {descrição do kit} {delimitador} {marca}.
    Exemplo: add_m Testando pássaros / pássaro.
  • add_b - adicione uma ramificação para teste.
    Predefinição: * command * {descrição da ramificação} {delimitador} {nome da ramificação do git}.
    Exemplo: add_b Master.
  • selecionar - permite selecionar uma ramificação para teste por padrão.
    Predefinição: * command *.
    Exemplo: Após inserir o comando select, os botões aparecem para selecionar ramificações que foram adicionadas ao banco de dados com o comando add_b.
  • run - O comando para iniciar a montagem.
    Predefinição: * command *.
    Exemplo: Depois de inserir o comando executar, os botões para selecionar os conjuntos de autotestes que foram adicionados ao banco de dados com o comando add_m aparecem. Na inicialização, a ramificação especificada pelo comando select é selecionada automaticamente.
  • del_m - remove um conjunto de testes.
    Predefinição: * command * {name marks}.
    Exemplo: del_m bird.
  • del_b - exclui as ramificações inseridas no banco de dados.
    Predefinição: * command * {branch from git}.
    Exemplo: del_b master.

Como o bot funciona?

1. O usuário adiciona um conjunto de testes (add_m):
O comando divide os dados do usuário em 2 partes - a descrição e o nome da ramificação no git. O nome está escrito na coluna mark_name dentro do banco de dados e a descrição na coluna mark_description.

2. O usuário adiciona ramificações (add_b):
O comando divide os dados do usuário em 2 partes - a descrição e o nome da ramificação no git. O nome está escrito na coluna branch_name, dentro do banco de dados, e a descrição na coluna branch_description.

3. O usuário seleciona a ramificação padrão (selecione):
O usuário recebe botões no bate-papo, formados de acordo com os dados das tabelas branch_description e branch_name. O usuário seleciona um botão com o ramo desejado. Ele é gravado na tabela favorite_branch.

4. O usuário inicia a inicialização da compilação (execução):
O usuário recebe botões no chat, formados de acordo com os dados das tabelas
mark_description e mark_name. O usuário seleciona um botão com um kit para executar os autotestes.

Com base nos dados selecionados pelo usuário, o bot gera uma solicitação no método trigger na classe TravisCI e a envia ao Travis para execução. Dentro do sistema Travis, o gatilho é ativado. Esta opção substitui o arquivo travis.yml, alterando a seção de script para dados selecionados pelo usuário.


Implantação no HEROKU


Para que o bot funcione, ele deve ser implantado na hospedagem. Eu recomendo usar o Heroku, porque esta plataforma possui uma tarifa gratuita, que fornece a energia necessária para o bot funcionar.

Como implantar um bot?

Para não descrever todo o processo, deixarei um link para a documentação oficial para o início:

Se você deseja trabalhar com o Heroku por meio da GUI, preencha o código no Github. Você precisa se registrar através da interface da web Heroku. Após o registro, clique em Novo -> Criar novo aplicativo -> Digite o nome do aplicativo e selecione uma região. Vá para a guia Implantar e selecione a integração com o Github no método Deployment.

Diante de nós, aparece um bloco para pesquisar no repositório. Digite o nome do repositório e clique no botão Pesquisar. Nos resultados da pesquisa, ao lado do nome do repositório, clique no botão Conectar. No bloco de implantação manual, selecione a ramificação e clique em "Implementar".

Último momento - você precisa ativar os webhooks usando uma solicitação GET:
 https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot 


O bot pode ser usado. Verificamos que tudo deu certo para nós:

imagem

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


All Articles