flake8
und pytest
in der GitLab-Pipeline ausIch weiß, dass statische Analysen, die Verwendung von Formatierern und das Schreiben von Testcode nützlich sind, um die Qualität von Software sicherzustellen, aber es ist schwierig (oder einfach), sie in die Teamentwicklung einzuführen. Ich habe mich gefragt, was ich tun soll.
Da ich GitLab in meiner täglichen Arbeit verwende, dachte ich, dass es möglich sein würde, schnell einen einfachen Mechanismus zu erstellen, abgesehen von schwierigen Dingen, und fasste ihn kurz zusammen.
Solange Sie sich für GitLab registrieren, können Sie es mit dem kostenlosen Plan ausführen, sodass Sie es sofort ausprobieren können.
--GitLab.com (Cloud-Dienst)
Erstellen Sie ein Repository in GitLab, um eine Reihe von Aufgaben auszuführen. Es ist privat und okay.
Ohne das Konzept der Bühnenteilung ist es extrem einfach. Ziehen Sie das Image von Python3 und führen Sie flake8 für den folgenden Code im Verzeichnis src aus.
image: python:3
before_script:
- pip install flake8
test:
script:
- flake8 src/
Als ich CI / CD nach PUSH überprüfte, konnte ich bestätigen, dass die Pipeline lief und eine Analyse mit flake8 durchgeführt wurde.
Nachdem wir flake8 beendet haben, führen wir einen Test mit pytest durch.
Erstellen wir einen Testcode mit einer Verzeichnisstruktur, die die Testdateien wie unten gezeigt trennt.
.
├── __init__.py
├── poetry.lock
├── pyproject.toml
├── src
│ └── main.py
│ └── __init__.py
├── tests #hinzufügen
│ └── test_main.py #hinzufügen
│ └── __init__.py #hinzufügen
└── venv
Der Inhalt des Testcodes lautet wie folgt. Der Inhalt ist mir diesmal nicht wirklich wichtig, daher ist er durchaus angemessen.
import sys, os
current_path = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, current_path + '/../')
from src import main
def test_add():
result = main.add(3, 5)
expected = 8
assert result == expected
def test_substract():
result = main.substract(10, 5)
expected = 5
assert result == expected
def test_multiply():
result = main.multiply(4, 5)
expected = 20
assert result == expected
Ich habe den erstellten Test lokal ausgeführt und bestätigt, dass alles bestanden hat.
$ pytest tests
======================== test session starts ========================
platform darwin -- Python 3.7.6, pytest-5.3.2, py-1.8.1, pluggy-0.13.1
collected 3 items
tests/test_main.py ... [100%]
========================= 3 passed in 0.01s =========================
Ich werde auch versuchen, die Abdeckung mit pytest-cov zu messen.
$ pytest --cov=src tests/
======================== test session starts ========================
...
collected 3 items
tests/test_main.py ... [100%]
---------- coverage: platform darwin, python 3.7.6-final-0 -----------
Name Stmts Miss Cover
-------------------------------------
src/__init__.py 0 0 100%
src/main.py 6 0 100%
-------------------------------------
TOTAL 6 0 100%
========================= 3 passed in 0.03s =========================
Das ist langweilig, deshalb füge ich main.py neuen Code hinzu, um die Abdeckung absichtlich zu reduzieren.
...
def divide(x, y):
return x / y
--Pytest -cov Ausgabeergebnis
% pytest --cov=src tests/
============================================ test session starts ============================================
...
collected 3 items
tests/test_main.py ... [100%]
---------- coverage: platform darwin, python 3.7.6-final-0 -----------
Name Stmts Miss Cover
-------------------------------------
src/__init__.py 0 0 100%
src/main.py 8 1 88%
-------------------------------------
TOTAL 8 1 88%
============================================= 3 passed in 0.03s =============================================
Fügen Sie der yaml-Datei einen neuen Lauf von pytest-cov hinzu und drücken Sie ihn.
image: python:3
before_script:
- pip install flake8 pytest pytest-cov
test:
script:
- flake8 src/
- pytest --cov=src tests/
Als ich den Code gepusht und das Ausführungsergebnis der Pipeline überprüft habe, wurde die Pipeline gestoppt, da der neu hinzugefügte Code wie folgt von flake8 überprüft wurde.
Ändern Sie den Code erneut und drücken Sie.
Diesmal endete es normal.
Selbst wenn Sie die Abdeckung messen, müssen Sie nacheinander zum JOB-Protokoll gehen Es entspricht der Anzeige der Abdeckung mit der Funktion von GitLab.
Verwenden Sie insbesondere die Funktion zur Analyse der Testabdeckung auf der Seite mit den GitLab-Einstellungen. Es scheint eine Funktion zu sein, die Abdeckungsrate aus dem Protokoll mit einem regulären Ausdruck anzuzeigen, aber im Fall von pytest-cov ist dies im Beispiel der Fall. Kopieren Sie sie und speichern Sie sie so, wie sie ist.
Als ich den Code erneut drückte, konnte ich bestätigen, dass die Abdeckungsrate wie unten gezeigt angezeigt wurde.
Im Moment ist der Ablauf PUSH → Pipeline-Ausführung direkt zum Master, In der tatsächlichen Entwicklung denke ich, dass Überprüfungen häufig in Zusammenführungsanfragen enthalten sind.
Daher möchte ich die Pipeline beim Senden einer Zusammenführungsanforderung ausführen und einen Überprüfungs- und Zusammenführungsfluss erstellen, wenn die Analyse von flake8 und der Test von pytest erfolgreich sind.
Schneiden Sie einen neuen Zweig aus und ändern Sie den Inhalt der Yaml-Datei wie folgt. Die einzige Lösung besteht darin, nur merge_request mit anzugeben.
Weitere Informationen finden Sie auf der GitLab-Seite. Pipelines for Merge Requests
image: python:3
before_script:
- pip install flake8 pytest pytest-cov
test:
script:
- flake8 src/
- pytest --cov=src tests/
only:
- merge_requests
Stellen Sie nach dem Drücken zunächst sicher, dass die Pipeline nicht wie zuvor ausgeführt wird.
Senden Sie eine Zusammenführungsanforderung vom neu geschnittenen Zweig an den Master.
Es wurde bestätigt, dass die Pipeline wie folgt funktioniert. Sie sehen eine Schaltfläche mit dem Namen "Zusammenführen, wenn die Pipeline erfolgreich ist", die normalerweise nicht angezeigt wird.
Die Anzeige ändert sich ab dem Zeitpunkt, an dem die Pipeline ausgeführt wird, und das Ausführungsergebnis (Erfolg) und die Abdeckung der Pipeline werden ausgegeben.
Versuchen Sie, ein neues Commit zu erstellen, indem Sie einen Testfall hinzufügen, der absichtlich fehlschlägt. Wie unten gezeigt, wurde bestätigt, dass die Pipeline nicht nur für neue Zusammenführungsanforderungen, sondern auch für zusätzliche Commits funktioniert.
Nachdem die Pipeline live gegangen war, wurde die Anzeige wie folgt geändert. Mit den aktuellen Einstellungen (Standardeinstellung) ist das Zusammenführen auch dann möglich, wenn die Pipeline ausfällt.
GitLab scheint in der Lage zu sein, festzulegen, dass das Zusammenführen nur möglich ist, wenn die Pipeline erfolgreich ist Aktivieren Sie "Pipelines müssen erfolgreich sein", um die Einstellungen zu speichern.
Dann wurde, wie unten gezeigt, das Zusammenführen unmöglich. Ich denke, es hängt vom Projekt ab, wie es betrieben wird, aber es wäre einfacher, die Qualität zu garantieren, wenn es eine Regel gibt, dass nur der Code zusammengeführt wird, der statische Analysen und Tests bestanden hat.
Recommended Posts