Wir bringen Ihnen insgesamt fünfmal das Know-how bei, das für eine testgetriebene Entwicklung mit Flask erforderlich ist (geplant und Änderungen vorbehalten). In diesem Artikel werde ich den minimalen Beispielcode und sein Ausführungsbeispiel zum automatischen Testen von mit Flask entwickelten Web-Apps und APIs vorstellen.
Der Mindesttest der von Flask erstellten API mit "Hello, World!" Als Rückgabewert wird automatisch mit dem Testclient durchgeführt.
Platzieren Sie den in diesem Artikel verwendeten Beispielcode in der folgenden Verzeichnisstruktur.
flask_01/
├── Dockerfile
└── app
├── flask_app.py
└── test
└── test.py
$ docker --version
Docker version 19.03.12, build 48a66213fe
Dockerfile
Dockerfile
FROM python:3.6
USER root
RUN apt update
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install flask==1.1.2
COPY ./app /root/
WORKDIR /root/test
Verwenden Sie eine einfache API, die "Hallo Welt!" Ausgibt.
flask_app.py
from flask import Flask
app = Flask(__name__)
@app.route('/hello_world')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host="0.0.0.0",port=5000)
Details finden Sie im letzten Abschnitt.
test.py
import sys
sys.path.append('../')
#Aus dem Dateinamen der Kolbenanwendung.Was löschte py
import flask_app
import unittest
#Der Klassenname funktioniert auf Japanisch
class Test_flask_app_Normales System(unittest.TestCase):
# 1.Stellen Sie allgemeine Parameter ein
def setUp(self):
self.ENDPOINT = "http://localhost:5000/{}"
self.DATA = None
self.STATUS = "200 OK"
self.STATUS_CODE = 200
self.ROUTE = None
#Testfall funktioniert auf Japanisch
def test_1_hello_Zugang zur Welt haben(self):
#Stellen Sie für jeden Fall die erforderlichen Parameter ein
self.DATA = b"Hello, World!"
self.ROUTE = "hello_world"
# 2.Verbinden Sie Testclient und Kontext mit mit Minuten
with flask_app.app.test_client() as client:
# 3.Führen Sie die API mit dem Testclient aus
response = client.get(self.ENDPOINT.format(self.ROUTE))
# 4.Führen Sie einen Test mit der assert-Anweisung durch
assert response.data == self.DATA
assert response.status == self.STATUS
assert response.status_code == self.STATUS_CODE
return
if __name__ == '__main__':
unittest.main()
Überprüfen Sie [Verzeichnisstruktur](# Verzeichnisstruktur) und führen Sie den folgenden Befehl aus.
$ ls
Dockerfile app
$ docker build -t pytest .
~Kürzung~
$ docker run -it pytest /usr/local/bin/python /root/test/test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.004s
OK
Klassen, die von "unittest.TestCase" erben, führen immer "setUp (self)" aus, bevor sie den Testfall ausführen.
Insbesondere wird "setUp (self)" ausgeführt, bevor "test_1_flask_app" ausgeführt wird, um zugänglich zu sein (self).
Selbst wenn mehrere Testfälle vorhanden sind, werden sie daher auf dieselbe Weise ausgeführt. Daher ist es sinnvoll, die in der Klasse verwendeten allgemeinen Parameter zu initialisieren.
Streng anders ist es gut zu erkennen, dass die in setUp (self)
initialisierten Variablen in allen Testfällen in der Klasse gemeinsam verwendet werden können.
Es ist möglich, einen Testclient mithilfe der with-Syntax zu verwenden.
Der Anfang von flask_app.app.test_client ()
ist der Basisname der zu testenden Python-Datei mit entfernter Erweiterung.
Dieses Mal ist das Testziel "flask_app.py", also "flask_app".
Führen Sie die API für flask_app.py
mit der get-Methode des Testclients in
2 aus.
Das Ausführungsergebnis wird in der "Antworteigenschaft" gespeichert.
Verwenden Sie die assert-Anweisung, um die response-Eigenschaft
mit der erwarteten Ergebnismenge in 1 zu vergleichen. In diesem Testcode werden nur drei Arten von API-Rückgabewerten (
response.data), Status (
response.status) und Statuscode (
response.status_code`) verglichen.
Wenn Sie es mit anderen Ausführungsergebnissen vergleichen möchten, können Sie die "Antworteigenschaft" mithilfe der folgenden Python-Funktion überprüfen.
dir(response)
Daher ist es ratsam, Eigenschaften auszuwählen, die entsprechend bestätigt werden müssen, und sie mit der assert-Anweisung zu vergleichen.
Im Testcode habe ich die mysteriöse Verwendung des Testclients von Flask vorgestellt.
Tutorial für die testgetriebene Entwicklung (TDD) mit Flask-2-Dekoratoren
Recommended Posts