Suche…


Testen Sie unsere Hello World App

Einführung

In diesem minimalistischen Beispiel werden wir mit pytest testen, dass unsere Hello World-App tatsächlich "Hallo, Welt!" pytest mit einem HTTP-OK-Statuscode von 200, wenn eine GET-Anforderung über die URL getroffen wird /

Lassen Sie uns zunächst pytest in unsere Virtualenv installieren

pip install pytest

Und als Referenz, dies ist unsere Hallo Welt App:

# hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

Test definieren

Neben unserem hello.py definieren wir ein Testmodul namens test_hello.py , das von py.test entdeckt wird

# test_hello.py
from hello import app

def test_hello():
    response = app.test_client().get('/')

    assert response.status_code == 200
    assert response.data == b'Hello, World!'

Um es noch einmal zu überprüfen, lautet unsere Projektstruktur, die Sie mit dem tree :

.
├── hello.py
└── test_hello.py

Test ausführen

Jetzt können wir diesen Test mit dem Befehl py.test , der automatisch test_hello.py und die darin enthaltene Testfunktion test_hello.py

$ py.test

Sie sollten eine Ausgabe und einen Hinweis sehen, dass 1 Test bestanden ist, z

=== test session starts ===
collected 1 items 
test_hello.py .
=== 1 passed in 0.13 seconds ===

Testen einer in Flask implementierten JSON-API

In diesem Beispiel wird vorausgesetzt, dass Sie wissen, wie Sie eine Flask-App mit pytest testen

Im Folgenden ist eine API , die einen JSON Eingang mit ganzzahligen nehmen Werte a und b zum Beispiel {"a": 1, "b": 2} , fügt sie auf und kehrt Summe a + b in einer JSON Antwort zB {"sum": 3} .

# hello_add.py
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/add', methods=['POST'])
def add():
    data = request.get_json()
    return jsonify({'sum': data['a'] + data['b']})

Testen dieser API mit pytest

Wir können es mit pytest

# test_hello_add.py
from hello_add import app
from flask import json

def test_add():        
    response = app.test_client().post(
        '/add',
        data=json.dumps({'a': 1, 'b': 2}),
        content_type='application/json',
    )

    data = json.loads(response.get_data(as_text=True))

    assert response.status_code == 200
    assert data['sum'] == 3

Führen Sie nun den Test mit py.test Befehl py.test .

Zugriff und Bearbeitung von Sitzungsvariablen in Ihren Tests mit Flask-Testing

Die meisten Webanwendungen verwenden das Sitzungsobjekt, um wichtige Informationen zu speichern. Diese Beispiele zeigen, wie Sie eine solche Anwendung mit Flask-Testing testen können. Ein voll funktionsfähiges Beispiel ist auch auf Github verfügbar.

Installieren Sie also zuerst Flask-Testing in Ihrer Virtualenv

pip install flask_testing

Um das Sitzungsobjekt verwenden zu können, müssen Sie den geheimen Schlüssel festlegen

app.secret_key = 'my-seCret_KEy'

Stellen wir uns vor, Sie haben in Ihrer Anwendung Funktionen, die einige Daten in Sitzungsvariablen wie diesen speichern müssen

@app.route('/getSessionVar', methods=['GET', 'POST'])
def getSessionVariable():
  if 'GET' == request.method:
    session['sessionVar'] = 'hello'
  elif 'POST' == request.method:
    session['sessionVar'] = 'hi'
  else:
    session['sessionVar'] = 'error'

  return 'ok'

Um diese Funktion zu testen, können Sie flask_testing importieren und Ihre Testklasse flask_testing.TestCase erben lassen. Importieren Sie auch alle notwendigen Bibliotheken

import flask
import unittest
import flask_testing
from myapp.run import app
    
class TestMyApp(flask_testing.TestCase):

Bevor Sie mit dem Testen beginnen, ist es sehr wichtig, die Funktion create_app zu implementieren. Andernfalls gibt es eine Ausnahme.

  def create_app(self):
    return app

Um zu testen, ob Ihre Anwendung wie gewünscht funktioniert, haben Sie mehrere Möglichkeiten. Wenn Sie lediglich sicherstellen möchten, dass Ihre Funktion bestimmte Werte für eine Sitzungsvariable einstellt, können Sie den Kontext beibehalten und auf flask.session zugreifen

def testSession1(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.get('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hello')

Ein weiterer nützlicher Trick besteht darin, wie bei der nächsten Testfunktion zwischen GET- und POST- Methoden zu unterscheiden

def testSession2(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.post('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hi')

Stellen Sie sich nun vor, Ihre Funktion erwartet, dass eine Sitzungsvariable gesetzt wird, und reagiert auf bestimmte Werte wie diese anders

@app.route('/changeSessionVar')
def changeSessionVariable():
  if session['existingSessionVar'] != 'hello':
    raise Exception('unexpected session value of existingSessionVar!')

  session['existingSessionVar'] = 'hello world'
  return 'ok'

Um diese Funktion zu testen, müssen Sie eine so genannte Sitzungstransaktion verwenden und die Sitzung im Kontext des Testclients öffnen. Diese Funktion ist seit Flask 0.8 verfügbar

def testSession3(self):
    with app.test_client() as lTestClient:
      #keep the session
      with lTestClient.session_transaction() as lSess:
        lSess['existingSessionVar'] = 'hello'

      #here the session is stored
      lResp = lTestClient.get('/changeSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['existingSessionVar'], 'hello world')

Das Ausführen der Tests ist wie üblich für die Besten

if __name__ == "__main__":
    unittest.main()

Und in der Kommandozeile

python tests/test_myapp.py

Eine weitere gute Möglichkeit, Ihre Tests auszuführen, ist die Verwendung der einzigen Erkennung wie folgt:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow