Como ingeniero de control de calidad, desarroll茅 un sistema de autocomprobaci贸n. Enfrent茅 una serie de problemas:
- Para cada tipo de prueba, tuve que crear mis propios trabajos en CI y ejecutarlos a mano.
- Los desarrolladores se negaron a ejecutar casos de autocomprobaci贸n.
- La imposibilidad de ejecutar autotests desde cualquier parte del dispositivo.
- Los ingenieros de pruebas manuales de control de calidad no pod铆an ejecutar las pruebas autom谩ticas ellos mismos.
Por lo tanto, decid铆 crear un peque帽o prototipo del bot para ejecutar pruebas automatizadas, que cubrir铆an la mayor铆a de los problemas descritos anteriormente.
Descripci贸n de la idea:El usuario env铆a los comandos necesarios al chat, inicia la compilaci贸n en el sistema CI, de acuerdo con las reglas especificadas en la configuraci贸n. CI ejecuta pruebas autom谩ticas con marcas pytest. Despu茅s de la ejecuci贸n, el script dentro del repositorio de prueba recibe informaci贸n sobre el estado de compilaci贸n, recopila registros y lo env铆a de vuelta al usuario en el chat de telegramas.
Herramientas:Las herramientas- Lenguaje de programaci贸n - Python
- Marco de prueba - Pytest
- Cliente HTTP - Solicitudes
- Base de datos - SQLite3
- ORM - Peewee
- Sistema CI - Travis CI
Contenido- Preparaci贸n
- Registro de bot
- Preparando un repositorio de prueba
- Pruebas y registro
- Generaci贸n de informes
- Configurar Travis CI
- Configuraci贸n de bot
- Los principios del bot
- Despliegue en Heroku
Registro de bot
En primer lugar, necesitamos registrar el telegrama del bot y obtener su identificaci贸n 煤nica, que es un token. Para hacer esto, escriba el mensaje / inicio en el bot @BotFather.
Nuestro equipo principal es / newbot, al ingresar, se nos pedir谩 que propongamos el nombre del bot.
Pero hay una regla: el nombre debe terminar en bot. BotFather toma el nombre del bot y devuelve tu token. Active el bot comenzando a chatear. A continuaci贸n, debe enviar una solicitud de API al m茅todo getUpdates.
https://api.telegram.org/bot{_}/getUpdates
Recuerda el hat_id recibido.
Preparando un repositorio de prueba
A continuaci贸n, debe organizar un repositorio con pruebas o utilizar un art铆culo
preparado previamente.
Pruebas y registroCree funciones de prueba y m谩rquelas con la marca pytest: completa, humo y p谩jaro.
Es importante agregar el registro a nuestras pruebas creando un archivo pytest.ini y agregando llamadas al m茅todo de informaci贸n desde la biblioteca de registro en las funciones de prueba.
El archivo pytest.ini contiene plantillas para registros en vivo y un archivo de registro.
Ejemplo de prueba 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'
Generaci贸n de informesCreamos un script que, una vez que se completa el ensamblaje, recopila informaci贸n del sistema de CI y los env铆a al chat de telegramas, junto con los registros.
Dentro del script, debe reemplazar los valores TELEGRAM_BOT y CHAT_ID por los valores que recibi贸 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()
El script usa variables del sistema y recibe valores de Travis CI.
Si el valor de TRAVIS_TEST_RESULT no es igual a cero, el valor se establece en "Correcto", primero se procesa la funci贸n send_message, que env铆a informaci贸n de ensamblaje al chat (nombre del repositorio, rama seleccionada, nombre del compromiso utilizado, enlace al registro web), luego la funci贸n send_file que env铆a archivo de registro
En el repositorio de prueba, agregue el archivo de configuraci贸n - travis.yml. En el interior describimos la tuber铆a a trav茅s de la cual funcionar谩 el ensamblaje.
travis.yml language: python python: - "3.7" install: - pip install -r requirements.txt script: pytest -m smoke after_script: - python tg_command.py
A continuaci贸n, debemos implementar el repositorio en GitHub para agregarlo a Travis CI.
Configurando TRAVIS_CI
Vamos al
sitioInicie sesi贸n con su cuenta de GitHub. Cambie a la pesta帽a Panel de control. Habiendo abierto previamente DevTools (Red), en la subpesta帽a Repositorios en el sitio opuesto al repositorio de prueba, mueva el control deslizante - active su ensamblaje. En la pesta帽a Red (DevTools), llega una solicitud activa, en la vista previa de la cual hay informaci贸n sobre la identificaci贸n del repositorio, el n煤mero debe ser recordado (copiar / escribir). Cambiando al sitio en la pesta帽a Configuraci贸n. Copiamos o recordamos el token, lo necesitamos.
Configuraci贸n de bot
En este art铆culo no nos detendremos en el an谩lisis del c贸digo, puede verlo en el
repositorio . Ahora es importante que comprendamos los conceptos b谩sicos del tema, as铆 que pasemos a configurar nuestro bot:
Dentro del repositorio est谩n los archivos:
- main.py - script de bot;
- models.py - archivo con modelos para ORM;
- conf.ini - archivo con variables de configuraci贸n;
- runtime.txt: valores fijos de la versi贸n de Python para Travis CI;
- procfile - ajuste para gunicorn;
- wsgi.py: archivo de inicio de la aplicaci贸n con gunicorn.
Para que su bot funcione, debe reemplazar los datos en conf.ini, a saber:
- travis_token - indica el token recibido a Travis CI;
- travis_base_url: especifique la direcci贸n de la API de Travis CI;
- travis_repository_id - especifica la identificaci贸n del repositorio con autotest, dentro de Travis CI;
- telegram_chat_id: especifique la identificaci贸n de chat del telegrama donde se enviar谩n los mensajes del bot;
- telegram_bot_url - especifica la url al bot.
Ejemplo de 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/
Los principios del botEs importante que cada solicitud d茅 un estado de respuesta de 200. De lo contrario, el telegrama comenzar谩 a enviar solicitudes c铆clicamente hasta que reciba una respuesta v谩lida.
El bot tiene un conjunto de comandos:
El delimitador puede ser cualquier car谩cter especial, excepto el gui贸n bajo.
- add_m: agrega un kit de prueba (marcas de python).
Plantilla: * comando * {descripci贸n del kit} {delimitador} {marca de nombre}.
Ejemplo: add_m Prueba de aves / ave. - add_b: agrega una rama para probar.
Plantilla: * comando * {descripci贸n de la rama} {delimitador} {nombre de la rama de git}.
Ejemplo: add_b Master. - select: le permite seleccionar una rama para probar de forma predeterminada.
Plantilla: * comando *.
Ejemplo: despu茅s de ingresar el comando de selecci贸n, aparecen botones para seleccionar las ramas que se agregaron a la base de datos con el comando add_b. - ejecutar: el comando para iniciar el ensamblaje.
Plantilla: * comando *.
Ejemplo: despu茅s de ingresar el comando de ejecuci贸n, aparecen los botones para seleccionar los conjuntos de autotests que se agregaron a la base de datos con el comando add_m. Al inicio, la rama especificada por el comando select se selecciona autom谩ticamente. - del_m: elimina un conjunto de pruebas.
Plantilla: * comando * {marcas de nombre}.
Ejemplo: del_m bird. - del_b: elimina las ramas ingresadas en la base de datos.
Plantilla: * comando * {branch from git}.
Ejemplo: del_b master.
驴C贸mo funciona el bot?1. El usuario agrega un conjunto de pruebas (add_m):
El comando divide los datos del usuario en 2 partes: la descripci贸n y el nombre de la rama en git. El nombre se escribe en la columna mark_name dentro de la base de datos, y la descripci贸n en la columna mark_description.
2. El usuario agrega ramas (add_b):
El comando divide los datos del usuario en 2 partes: la descripci贸n y el nombre de la rama en git. El nombre se escribe en la columna branch_name dentro de la base de datos, y la descripci贸n en la columna branch_description.
3. El usuario selecciona la rama predeterminada (seleccionar):
El usuario recibe botones en el chat, formados seg煤n los datos de las tablas branch_description y branch_name. El usuario selecciona un bot贸n con la rama deseada. Est谩 escrito en la tabla favorite_branch.
4. El usuario inicia la inicializaci贸n de la compilaci贸n (ejecuci贸n):
El usuario recibe botones en el chat, formados seg煤n los datos de las tablas.
mark_description y mark_name. El usuario selecciona un bot贸n con un kit para ejecutar pruebas autom谩ticas.
Seg煤n los datos seleccionados por el usuario, el bot genera una solicitud en el m茅todo de activaci贸n en la clase TravisCI y la env铆a a Travis para su ejecuci贸n. Dentro del sistema Travis, se activa el disparador de una opci贸n de construcci贸n. Esta opci贸n anula el archivo travis.yml, cambiando la secci贸n del script a los datos seleccionados por el usuario.
Despliegue en HEROKU
Para que el bot funcione, debe implementarse en el alojamiento. Recomiendo usar Heroku, porque esta plataforma tiene una tarifa gratuita, que proporciona la potencia necesaria para que funcione el bot.
驴C贸mo implementar un bot?Para no describir todo el proceso, dejar茅 un enlace a la
documentaci贸n oficial para comenzar:
Si desea trabajar con Heroku a trav茅s de la GUI, complete el c贸digo en Github. Debe registrarse a trav茅s de la interfaz web de Heroku. Despu茅s del registro, haga clic en Nuevo -> Crear nueva aplicaci贸n -> Ingrese el nombre de la aplicaci贸n y seleccione una regi贸n. Vaya a la pesta帽a Implementar y seleccione la integraci贸n con Github en el m茅todo de Implementaci贸n.
Ante nosotros aparece un bloque para buscar en el repositorio. Ingrese el nombre del repositorio y haga clic en el bot贸n Buscar. En los resultados de b煤squeda, frente al nombre del repositorio, haga clic en el bot贸n Conectar. En el bloque Implementaci贸n manual, seleccione la rama y haga clic en "Implementar".
脷ltimo momento: debe activar webhooks mediante una solicitud GET:
https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot
Se puede usar el bot. Verificamos que todo funcion贸 para nosotros:
