Gestion automatisée des tests avec Telegram

En tant qu'ingénieur QA, j'ai développé un système d'auto-test. Face à un certain nombre de problèmes:

  • Pour chaque type de test, j'ai dĂ» crĂ©er mes propres emplois dans CI et les exĂ©cuter Ă  la main.
  • Les dĂ©veloppeurs ont refusĂ© d'exĂ©cuter des cas d'auto-test.
  • L'incapacitĂ© d'exĂ©cuter des autotests de n'importe oĂą sur l'appareil.
  • Les ingĂ©nieurs de test manuel QA ne pouvaient pas exĂ©cuter eux-mĂŞmes les autotests.

Par conséquent, j'ai décidé de créer un petit prototype du bot pour exécuter des tests automatisés, qui couvriraient la plupart des problèmes décrits ci-dessus.

Description de l'idée:

L'utilisateur envoie les commandes nécessaires au chat, lance la construction dans le système CI, selon les règles spécifiées dans la configuration. CI exécute des autotests avec des marques de pytest. Après l'exécution, le script à l'intérieur du référentiel de test reçoit des informations sur l'état de la génération, recueille les journaux et les renvoie à l'utilisateur dans le chat par télégramme.

Outils:

Les outils
  • Langage de programmation - Python
  • Cadre de test - Pytest
  • Client HTTP - Demandes
  • DataBase - SQLite3
  • ORM - Peewee
  • Système CI - Travis CI



Table des matières

  1. La préparation
  2. Enregistrement du bot
  3. Préparation d'un référentiel de test
  4. Tests et journalisation
  5. Génération de rapports
  6. Configurer Travis CI
  7. Configuration du bot
  8. Les principes du bot
  9. DĂ©ploiement sur Heroku


Enregistrement du bot


Tout d'abord, nous devons enregistrer le télégramme du bot et obtenir son identifiant unique, qui est un jeton. Pour ce faire, écrivez le message / start dans le bot @BotFather.
Notre équipe principale est / newbot, en entrant dans laquelle il nous sera demandé de fournir le nom du bot.
Mais il y a une règle - le nom doit se terminer par bot. BotFather prend le nom du bot et retourne votre jeton. Activez le bot en commençant à discuter. Ensuite, vous devez envoyer une demande d'API à la méthode getUpdates.

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

Rappelez-vous le hat_id reçu.


Préparation d'un référentiel de test


Ensuite, vous devez organiser un référentiel avec des tests ou utiliser un article pré- préparé .


Tests et journalisation

Créez des fonctions de test et marquez-les avec la marque Pytest - pleine, fumée et oiseau.

Il est important d'ajouter la journalisation à nos tests en créant le fichier pytest.ini et en ajoutant les appels à la méthode info depuis la bibliothèque de journalisation dans les fonctions de test.
Le fichier pytest.ini contient des modèles de journaux en direct et un fichier journal.

Exemple de test
 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' 




Génération de rapports

Nous créons un script qui, une fois l'assemblage terminé, recueille les informations du système CI et les envoie au chat télégramme, avec les journaux.
Dans le script, vous devez remplacer les valeurs TELEGRAM_BOT et CHAT_ID par celles que vous avez reçues plus tôt.

Code 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() 


Le script utilise des variables système et reçoit des valeurs de Travis CI.

Si la valeur de TRAVIS_TEST_RESULT n'est pas égale à zéro, la valeur est définie sur "Successfully", la fonction send_message est d'abord exécutée, qui envoie les informations d'assembly au chat (nom du référentiel, branche sélectionnée, nom de la validation utilisée, lien vers le journal Web), puis la fonction send_file qui envoie fichier journal.

Dans le référentiel de test, ajoutez le fichier de configuration - travis.yml. À l'intérieur, nous décrivons le pipeline à travers lequel l'assemblage fonctionnera.

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


Ensuite, nous devons déployer le référentiel sur GitHub pour l'ajouter à Travis CI.


DĂ©finition de TRAVIS_CI


Nous allons sur le site .
Connectez-vous en utilisant votre compte GitHub. Basculez vers l'onglet Dashboard. Après avoir ouvert DevTools (Network), dans le sous-onglet Repositories sur le site en face du référentiel de test, déplacez le curseur - activez son assemblage. Dans l'onglet Réseau (DevTools), une demande active arrive, dans l'aperçu dont il y a des informations sur l'id du référentiel, le numéro doit être mémorisé (copier / écrire). Passer au site dans l'onglet Paramètres. Nous copions ou nous souvenons du jeton - nous en avons besoin.


Configuration du bot


Dans cet article, nous ne nous attarderons pas sur l'analyse du code, vous pouvez le voir dans le référentiel . Maintenant, il est important pour nous de comprendre les bases du sujet, alors passons à la configuration de notre bot:

À l'intérieur du référentiel se trouvent les fichiers:

  1. main.py - script bot;
  2. models.py - fichier avec des modèles pour ORM;
  3. conf.ini - fichier avec des variables de configuration;
  4. runtime.txt - valeurs de version Python fixes pour Travis CI;
  5. procfile - réglage pour gunicorn;
  6. wsgi.py - fichier de lancement d'application avec gunicorn.

Pour faire fonctionner votre bot, vous devez remplacer les données dans conf.ini, à savoir:

  • travis_token - indique le jeton reçu Ă  Travis CI;
  • travis_base_url - spĂ©cifiez l'adresse de l'API Travis CI;
  • travis_repository_id - spĂ©cifiez l'ID du rĂ©fĂ©rentiel avec les autotests, Ă  l'intĂ©rieur de Travis CI;
  • telegram_chat_id - spĂ©cifiez l'identifiant de chat du tĂ©lĂ©gramme oĂą les messages du bot seront envoyĂ©s;
  • telegram_bot_url - spĂ©cifiez l'URL du bot.

Exemple 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/ 



Les principes du bot

Il est important que chaque demande donne un état de réponse de 200. Sinon, le télégramme commence à envoyer cycliquement des demandes jusqu'à ce qu'il reçoive une réponse valide.

Le bot a un ensemble de commandes:

Le délimiteur peut être n'importe quel caractère spécial à l'exception du trait de soulignement.

  • add_m - ajoute un kit de test (marques python).
    Modèle: * commande * {description du kit} {délimiteur} {marque de nom}.
    Exemple: add_m Test des oiseaux / oiseau.
  • add_b - ajoute une branche pour le test.
    Modèle: * commande * {description de la branche} {délimiteur} {nom de la branche de git}.
    Exemple: maître add_b.
  • select - vous permet de sĂ©lectionner une branche Ă  tester par dĂ©faut.
    Modèle: * commande *.
    Exemple: après avoir entré la commande select, des boutons apparaissent pour sélectionner les branches qui ont été ajoutées à la base de données avec la commande add_b.
  • run - La commande pour dĂ©marrer l'assemblage.
    Modèle: * commande *.
    Exemple: après avoir entré la commande d'exécution, les boutons de sélection des ensembles d'autotests ajoutés à la base de données avec la commande add_m apparaissent. Au démarrage, la branche spécifiée par la commande select est automatiquement sélectionnée.
  • del_m - supprime un ensemble de tests.
    Modèle: * commande * {marques de nom}.
    Exemple: del_m oiseau.
  • del_b - supprime les branches entrĂ©es dans la base de donnĂ©es.
    Modèle: * commande * {branche de git}.
    Exemple: del_b master.

Comment fonctionne le bot?

1. L' utilisateur ajoute une suite de tests (add_m):
La commande divise les données utilisateur en 2 parties - la description et le nom de la branche dans git. Le nom est écrit dans la colonne mark_name à l'intérieur de la base de données et la description dans la colonne mark_description.

2. L' utilisateur ajoute des branches (add_b):
La commande divise les données utilisateur en 2 parties - la description et le nom de la branche dans git. Le nom est écrit dans la colonne branch_name à l'intérieur de la base de données et la description dans la colonne branch_description.

3. L' utilisateur sélectionne la branche par défaut (sélectionner):
L'utilisateur reçoit des boutons dans le chat, formés en fonction des données des tables branch_description et branch_name. L'utilisateur sélectionne un bouton avec la branche souhaitée. Il est écrit dans la table favorite_branch.

4. L' utilisateur démarre l'initialisation de la génération (exécution):
L'utilisateur reçoit des boutons dans le chat, formés en fonction des données des tables
mark_description et mark_name. L'utilisateur sélectionne un bouton avec un kit pour exécuter les autotests.

Sur la base des données sélectionnées par l'utilisateur, le bot génère une requête dans la méthode de déclenchement de la classe TravisCI et l'envoie à Travis pour exécution. À l'intérieur du système Travis, le déclencheur d'une option de construction est activé. Cette option remplace le fichier travis.yml, modifiant la section de script en données sélectionnées par l'utilisateur.


DĂ©ploiement sur HEROKU


Pour que le bot fonctionne, il doit être déployé sur l'hébergement. Je recommande d'utiliser Heroku, car cette plateforme a un tarif gratuit, qui fournit la puissance nécessaire pour que le bot fonctionne.

Comment déployer un bot?

Afin de ne pas décrire l'ensemble du processus, je vais laisser un lien vers la documentation officielle pour le début:

Si vous souhaitez travailler avec Heroku via l'interface graphique, remplissez le code sur Github. Vous devez vous inscrire via l'interface Web Heroku. Après l'enregistrement, cliquez sur Nouveau -> Créer une nouvelle application -> Entrez le nom de l'application et sélectionnez une région. Accédez à l'onglet Déployer et sélectionnez l'intégration avec Github dans la méthode de déploiement.

Devant nous apparaît un bloc de recherche dans le référentiel. Saisissez le nom du référentiel et cliquez sur le bouton Rechercher. Dans les résultats de la recherche, en face du nom du référentiel, cliquez sur le bouton Connecter. Dans le bloc Déploiement manuel, sélectionnez la branche et cliquez sur «Déployer».

Dernier moment - vous devez activer les webhooks Ă  l'aide d'une demande GET:
 https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot 


Le bot peut être utilisé. Nous vérifions que tout a bien fonctionné pour nous:

image

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


All Articles