Automatisiertes Testmanagement mit Telegramm

Als QS-Ingenieur habe ich ein Selbsttestsystem entwickelt. Konnte mit einer Reihe von Problemen konfrontiert:

  • Für jede Art von Test musste ich meine eigenen Jobs in CI erstellen und von Hand ausführen.
  • Die Entwickler weigerten sich, Selbsttestfälle auszuführen.
  • Die Unfähigkeit, Autotests von überall auf dem Gerät auszuführen.
  • QA manuelle Testingenieure konnten selbst keine Autotests durchführen.

Aus diesem Grund habe ich beschlossen, einen kleinen Prototyp des Bots zu erstellen, um automatisierte Tests durchzuführen, die die meisten der oben beschriebenen Probleme abdecken.

Beschreibung der Idee:

Der Benutzer sendet die erforderlichen Befehle an den Chat und startet den Build im CI-System gemäß den in der Konfiguration angegebenen Regeln. CI führt Autotests mit Pytest-Markierungen durch. Nach der Ausführung empfängt das Skript im Test-Repository Informationen zum Erstellungsstatus, sammelt Protokolle und sendet sie im Telegramm-Chat an den Benutzer zurück.

Werkzeuge:

Die Werkzeuge
  • Programmiersprache - Python
  • Test Framework - Pytest
  • HTTP-Client - Anfragen
  • Datenbank - SQLite3
  • ORM - Peewee
  • CI-System - Travis CI



Inhalt

  1. Vorbereitung
  2. Bot Registrierung
  3. Vorbereiten eines Test-Repositorys
  4. Tests und Protokollierung
  5. Berichterstellung
  6. Konfigurieren Sie Travis CI
  7. Bot-Setup
  8. Die Prinzipien des Bots
  9. Bereitstellung auf Heroku


Bot Registrierung


Zunächst müssen wir das Telegramm des Bots registrieren und seine eindeutige ID erhalten, die ein Token ist. Schreiben Sie dazu die Nachricht / start in den @ BotFather-Bot.
Unser Hauptteam ist / newbot, durch Eingabe geben wir den Namen des Bots ein.
Aber es gibt eine Regel - der Name muss mit bot enden. BotFather nimmt den Namen des Bots und gibt Ihren Token zurück. Aktivieren Sie den Bot, indem Sie mit dem Chatten beginnen. Als Nächstes müssen Sie eine API-Anforderung an die Methode getUpdates senden.

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

Erinnere dich an die empfangene hat_id.


Vorbereiten eines Test-Repositorys


Als Nächstes müssen Sie ein Repository mit Tests organisieren oder einen vorbereiteten Artikel verwenden.


Tests und Protokollierung

Erstellen Sie Testfunktionen und markieren Sie diese mit dem Pytest-Zeichen - voll, Rauch und Vogel.

Es ist wichtig, die Protokollierung zu unseren Tests hinzuzufügen, indem Sie die Datei pytest.ini erstellen und die Aufrufe der Infomethode aus der Protokollierungsbibliothek in den Testfunktionen hinzufügen.
Die Datei pytest.ini enthält Vorlagen für Live-Protokolle und eine Protokolldatei.

Testbeispiel
 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' 




Berichterstellung

Wir erstellen ein Skript, das nach Abschluss der Assembly Informationen aus dem CI-System sammelt und diese zusammen mit den Protokollen an den Telegramm-Chat sendet.
Innerhalb des Skripts müssen Sie die Werte TELEGRAM_BOT und CHAT_ID durch die zuvor erhaltenen Werte ersetzen.

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


Das Skript verwendet Systemvariablen und empfängt Werte von Travis CI.

Wenn der Wert von TRAVIS_TEST_RESULT nicht gleich Null ist, wird der Wert auf "Erfolgreich" gesetzt. Zuerst wird die Funktion send_message verarbeitet, die Assembly-Informationen an den Chat sendet (Repository-Name, ausgewählter Zweig, Name des verwendeten Commits, Link zum Webprotokoll) und dann die send_file-Funktion Protokolldatei.

Fügen Sie im Test-Repository die Konfigurationsdatei travis.yml hinzu. Im Inneren beschreiben wir die Pipeline, über die die Baugruppe arbeiten wird.

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


Als Nächstes müssen wir das Repository auf GitHub bereitstellen, um es Travis CI hinzuzufügen.


Einstellen von TRAVIS_CI


Wir gehen zur Seite .
Melden Sie sich mit Ihrem GitHub-Konto an. Wechseln Sie zur Registerkarte Dashboard. Nachdem Sie zuvor DevTools (Netzwerk) geöffnet haben, verschieben Sie den Schieberegler auf der Unterregisterkarte Repositorys auf der Site gegenüber dem Test-Repository. Aktivieren Sie die Assembly. Auf der Registerkarte Netzwerk (DevTools) kommt eine aktive Anfrage an, in deren Vorschau Informationen zur ID des Repositorys enthalten sind. Die Nummer muss gespeichert werden (Kopieren / Schreiben). Wechseln zur Site auf der Registerkarte Einstellungen. Wir kopieren oder erinnern uns an das Token - wir brauchen es.


Bot-Setup


In diesem Artikel werden wir uns nicht mit der Analyse des Codes befassen, Sie können ihn im Repository sehen . Jetzt ist es wichtig, dass wir die Grundlagen des Themas verstehen. Fahren wir also mit der Einrichtung unseres Bots fort:

Im Repository befinden sich die Dateien:

  1. main.py - Bot-Skript;
  2. models.py - Datei mit Modellen für ORM;
  3. conf.ini - Datei mit Konfigurationsvariablen;
  4. runtime.txt - feste Python-Versionswerte für Travis CI;
  5. procfile - Einstellung für Gunicorn;
  6. wsgi.py - Anwendungsstartdatei mit Gunicorn.

Damit Ihr Bot funktioniert, müssen Sie die Daten in conf.ini ersetzen, nämlich:

  • travis_token - zeigt Travis CI das empfangene Token an;
  • travis_base_url - Geben Sie die Adresse der Travis CI-API an.
  • travis_repository_id - Geben Sie die ID des Repositorys mit Autotests in Travis CI an.
  • telegram_chat_id - Geben Sie die Chat-ID des Telegramms an, an das Nachrichten vom Bot gesendet werden sollen.
  • telegram_bot_url - Geben Sie die URL zum Bot an.

Conf.ini Beispiel
 [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/ 



Die Prinzipien des Bots

Es ist wichtig, dass jede Anforderung einen Antwortstatus von 200 aufweist. Andernfalls beginnt das Telegramm, Anforderungen zyklisch zu senden, bis es eine gültige Antwort erhält.

Der Bot hat eine Reihe von Befehlen:

Das Trennzeichen kann ein beliebiges Sonderzeichen außer dem Unterstrich sein.

  • add_m - Füge ein Testkit hinzu (Python-Markierungen).
    Vorlage: * Befehl * {Kitbeschreibung} {Trennzeichen} {Namensmarke}.
    Beispiel: add_m Vögel / Vogel testen.
  • add_b - Füge einen Zweig zum Testen hinzu.
    Vorlage: * Befehl * {Beschreibung des Zweigs} {Trennzeichen} {Name des Zweigs von git}.
    Beispiel: add_b Master.
  • select - Mit dieser Option können Sie standardmäßig einen Zweig zum Testen auswählen.
    Vorlage: * Befehl *.
    Beispiel: Nach Eingabe des Befehls select werden Schaltflächen zum Auswählen von Zweigen angezeigt, die mit dem Befehl add_b zur Datenbank hinzugefügt wurden.
  • run - Der Befehl zum Starten der Assembly.
    Vorlage: * Befehl *.
    Beispiel: Nach Eingabe des Befehls run werden die Schaltflächen zum Auswählen der Autotests angezeigt, die mit dem Befehl add_m zur Datenbank hinzugefügt wurden. Beim Start wird automatisch der durch den Befehl select angegebene Zweig ausgewählt.
  • del_m - Entfernt eine Reihe von Tests.
    Vorlage: * Befehl * {Namensmarken}.
    Beispiel: del_m Vogel.
  • del_b - löscht die in der Datenbank eingegebenen Zweige.
    Vorlage: * Befehl * {Zweig von Git}.
    Beispiel: del_b master.

Wie funktioniert der Bot?

1. Der Benutzer fügt eine Testsuite (add_m) hinzu:
Der Befehl teilt die Benutzerdaten in zwei Teile auf - die Beschreibung und den Namen des Zweigs in git. Der Name wird in die Spalte mark_name in der Datenbank und die Beschreibung in die Spalte mark_description geschrieben.

2. Der Benutzer fügt Zweige hinzu (add_b):
Der Befehl teilt die Benutzerdaten in zwei Teile auf - die Beschreibung und den Namen des Zweigs in git. Der Name wird in die Spalte branch_name in der Datenbank und die Beschreibung in die Spalte branch_description geschrieben.

3. Der Benutzer wählt den Standardzweig aus (auswählen):
Der Benutzer erhält im Chat Schaltflächen, die sich aus den Daten aus den Tabellen branch_description und branch_name ergeben. Der Benutzer wählt eine Schaltfläche mit dem gewünschten Zweig. Es wird in die Tabelle favor_branch geschrieben.

4. Der Benutzer startet die Build-Initialisierung (Ausführen):
Der Benutzer erhält im Chat Schaltflächen, die sich nach den Daten aus den Tabellen richten
mark_description und mark_name. Der Benutzer wählt eine Schaltfläche mit einem Kit aus, um Autotests auszuführen.

Basierend auf den vom Benutzer ausgewählten Daten generiert der Bot eine Anforderung in der Triggermethode in der TravisCI-Klasse und sendet sie zur Ausführung an Travis. Innerhalb des Travis-Systems ist der Auslöser eine Build-Option aktiviert. Diese Option überschreibt die Datei travis.yml und ändert den Skriptabschnitt in vom Benutzer ausgewählte Daten.


Bereitstellung auf HEROKU


Damit der Bot funktioniert, muss er auf dem Hosting bereitgestellt werden. Ich empfehle die Verwendung von Heroku, da diese Plattform einen kostenlosen Tarif hat, der die notwendige Leistung für das Funktionieren des Bots bietet.

Wie stelle ich einen Bot bereit?

Um den gesamten Prozess nicht zu beschreiben, werde ich zunächst einen Link zur offiziellen Dokumentation hinterlassen:

Wenn Sie mit Heroku über die GUI arbeiten möchten, geben Sie den Code auf Github ein. Sie müssen sich über die Heroku-Weboberfläche registrieren. Klicken Sie nach der Registrierung auf Neu -> Neue App erstellen -> Geben Sie den Namen der App ein und wählen Sie eine Region aus. Wechseln Sie zur Registerkarte Bereitstellen, und wählen Sie die Integration mit Github in der Bereitstellungsmethode aus.

Vor uns erscheint ein Block zum Durchsuchen des Repositorys. Geben Sie den Namen des Repositorys ein und klicken Sie auf die Schaltfläche Suchen. Klicken Sie in den Suchergebnissen neben dem Repository-Namen auf die Schaltfläche Verbinden. Wählen Sie im Block Manuelle Bereitstellung den Zweig aus und klicken Sie auf "Bereitstellen".

Letzter Moment - Sie müssen Webhooks mithilfe einer GET-Anfrage aktivieren:
 https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot 


Der Bot kann verwendet werden. Wir überprüfen, ob alles für uns geklappt hat:

Bild

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


All Articles