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- Preparação
- Bot Registration
- Preparando um Repositório de Teste
- Testes e registro
- Geração de relatórios
- Configurar o Travis CI
- Configuração de bot
- Os princípios do bot
- 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 registroCrie 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óriosCriamos 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:
- main.py - script de bot;
- models.py - arquivo com modelos para ORM;
- arquivo conf.ini com variáveis de configuração;
- runtime.txt - valores fixos da versão Python para o Travis CI;
- procfile - configuração para gunicorn;
- 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:
