Zoeken…


Onze Hello World-app testen

Invoering

In dit minimalistische voorbeeld pytest we met behulp van pytest testen dat onze Hello World-app inderdaad "Hallo wereld!" met een HTTP OK-statuscode van 200, wanneer hit met een GET-verzoek op de URL /

Laten we eerst pytest in onze virtualenv installeren

pip install pytest

En alleen voor referentie, dit is onze hallo wereld-app:

# hello.py
from flask import Flask

app = Flask(__name__)

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

Bepaling van de test

Naast onze hello.py definiëren we een testmodule genaamd test_hello.py die wordt ontdekt door py.test

# 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!'

Even ter beoordeling, op dit punt is onze projectstructuur verkregen met het tree :

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

De test uitvoeren

Nu kunnen we deze test uitvoeren met de opdracht py.test die automatisch onze test_hello.py en de testfunctie erin ontdekt

$ py.test

Je zou wat output moeten zien en een indicatie dat 1 test geslaagd is, bijv

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

Testen van een JSON API geïmplementeerd in Flask

In dit voorbeeld wordt ervan uitgegaan dat u weet hoe u een Flask-app kunt testen met behulp van pytest

Hieronder is een API die een JSON-invoer met gehele getallen a en b bijvoorbeeld {"a": 1, "b": 2} , deze optelt en som a + b retourneert in een JSON-antwoord, bijvoorbeeld {"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 van deze API met pytest

We kunnen het testen met 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

Voer nu de test uit met de opdracht py.test .

Toegang krijgen tot en manipuleren van sessievariabelen in uw tests met behulp van Flask-Testing

De meeste webapplicaties gebruiken het sessieobject om belangrijke informatie op te slaan. Deze voorbeelden laten zien hoe u een dergelijke toepassing kunt testen met behulp van Flask-Testing. Een volledig werkend voorbeeld is ook beschikbaar op github .

Installeer daarom eerst Flask-Testing in uw virtualenv

pip install flask_testing

Om het sessieobject te kunnen gebruiken, moet u de geheime sleutel instellen

app.secret_key = 'my-seCret_KEy'

Stel je voor dat je in je applicatiefunctie een aantal gegevens moet opslaan in sessievariabelen zoals deze

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

Om deze functie te testen, kunt u flask_testing importeren en uw testklasse flask_testing.TestCase laten erven. Importeer ook alle benodigde bibliotheken

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

Heel belangrijk voordat je begint met testen is het implementeren van de functie create_app, anders is er een uitzondering.

  def create_app(self):
    return app

Om te testen of uw applicatie naar wens werkt, heeft u een aantal mogelijkheden. Als u er gewoon voor wilt zorgen dat uw functie bepaalde waarden instelt op een sessievariabele, kunt u gewoon de context behouden en toegang krijgen tot flask.session

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

Nog een handige truc is om onderscheid te maken tussen GET- en POST- methoden zoals in de volgende testfunctie

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

Stel je nu voor dat je functie verwacht dat een sessievariabele wordt ingesteld en reageert anders op bepaalde waarden zoals deze

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

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

Om deze functie te testen, moet u de zogenaamde sessietransactie gebruiken en de sessie openen in de context van de testclient. Deze functie is beschikbaar sinds fles 0.8

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

De tests uitvoeren is zoals gewoonlijk voor unittest

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

En op de opdrachtregel

python tests/test_myapp.py

Een andere leuke manier om je tests uit te voeren is om unittest Discovery als volgt te gebruiken:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow