[PYTHON] Führen Sie flake8 und pytest auf GitLab CI aus

Was ist in diesem Artikel zu tun?

Wie haben Sie diesen Artikel geschrieben?

Ich 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.

Ausführungsumgebung

--GitLab.com (Cloud-Dienst)

1. Umgebungskonstruktion und Flake8-Check

1-1. Erstellen Sie ein Repository in GitLab

Erstellen Sie ein Repository in GitLab, um eine Reihe von Aufgaben auszuführen. Es ist privat und okay.

1-2. Zugabe von Gitlab-Yml und PUSH

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.

2. Test hinzufügen

Nachdem wir flake8 beendet haben, führen wir einen Test mit pytest durch.

2-1. Tests lokal erstellen und ausführen

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 =========================

2-2. Abdeckungsmessung

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 =============================================

2-3. Ausführung auf GitLab CI / CD

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.

2-4. Anzeige der Abdeckung zur Pipeline hinzugefügt

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.

3. Ändern Sie den Ausführungszeitpunkt der Pipeline

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.

3-1. Modifikation von Yaml

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.

3-2. Ausführung der Zusammenführungsanforderung

Senden Sie eine Zusammenführungsanforderung vom neu geschnittenen Zweig an den Master.

Nach dem Absenden der Zusammenführungsanforderung (in der Pipeline)

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.

Nach dem Absenden der Zusammenführungsanforderung (nachdem die Pipeline in Betrieb ist)

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.

3-3. Ausführung der Zusammenführungsanforderung (Fehler)

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

Führen Sie flake8 und pytest auf GitLab CI aus
Führen Sie py.test unter Windows Anaconda und MinGW aus
Installieren Sie Dropbox und führen Sie es unter Ubuntu 20.04 aus
Installieren Sie Python3.5 + NumPy + SciPy und führen Sie es unter Windows 10 aus
Führen Sie OpenVino unter macOS und pyenv und pipenv aus
Führen Sie die Kolben-App auf Cloud 9 und Apache Httpd aus
Installieren Sie Apache 2.4 unter Ubuntu 19.10 Eoan Ermine und führen Sie CGI aus
Installieren Sie Docker unter Arch Linux und führen Sie es remote aus
Führen Sie Django auf PythonAnywhere aus
Führen Sie mysqlclient auf Lambda aus
Führen Sie OpenMVG auf einem Mac aus
Bis der Infrastrukturingenieur GitLab erstellt, um CI / CD auszuführen