Flask
Testning
Sök…
Testa vår Hello World-app
Introduktion
I detta minimalistiska exempel, med pytest
vi att testa att verkligen vår Hello World-app returnerar "Hej, värld!" med en HTTP OK-statuskod på 200, när den träffas med en GET-förfrågan på URL /
Låt oss först installera pytest
i vår virtualenv
pip install pytest
Och bara för referens, denna vår hej världs-app:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Definiera testet
Längs vår hello.py
definierar vi en test_hello.py
som heter test_hello.py
som kommer att upptäckas av 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!'
Bara för att översyn, vid denna punkt vår projektstruktur som erhållits med tree
kommandot är:
.
├── hello.py
└── test_hello.py
Kör testet
Nu kan vi köra detta test med kommandot py.test
som automatiskt kommer att upptäcka vår test_hello.py
och testfunktionen inuti det
$ py.test
Du bör se lite output och en indikation på att ett test har gått, t.ex.
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Testa ett JSON API implementerat i Flask
Detta exempel antar att du vet hur du testar en Flask-app med pytest
Nedan visas ett API som tar en JSON-ingång med heltal a
och b
t.ex. {"a": 1, "b": 2}
, lägger till dem och returnerar summan a + b
i ett JSON-svar, t.ex. {"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']})
Testa detta API med pytest
Vi kan testa det med 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
py.test
nu testet med kommandot py.test
.
Få åtkomst till och manipulera sessionvariabler i dina test med hjälp av Flask-Testing
De flesta webbapplikationer använder sessionobjektet för att lagra viss viktig information. Dessa exempel visar hur du kan testa en sådan applikation med Flask-Testing. Fullständigt fungerande exempel finns också på github .
Så installera först Flask-Testing i din virtualenv
pip install flask_testing
För att kunna använda sessionobjektet måste du ställa in den hemliga nyckeln
app.secret_key = 'my-seCret_KEy'
Låt oss föreställa oss att du har i din applikationsfunktion som måste lagra en del data i sessionvariabler som denna
@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'
För att testa den här funktionen kan du importera flask_testing och låta din testklass erva flask_testing.TestCase. Importera också alla nödvändiga bibliotek
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Mycket viktigt innan du börjar testa är att implementera funktionen create_app annars kommer det att finnas undantag.
def create_app(self):
return app
För att testa din ansökan fungerar som önskat har du ett par möjligheter. Om du bara vill försäkra att din funktion ställer in specifika värden till en sessionvariabel kan du bara hålla sammanhanget runt och få tillgång till 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')
Ett mer användbart trick är att skilja mellan GET- och POST- metoder som i nästa testfunktion
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')
Föreställ dig nu att din funktion förväntar sig att en sessionvariabel ska ställas in och reagerar olika på specifika värden som denna
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
För att testa den här funktionen måste du använda så kallad sessionstransaktion och öppna sessionen i samband med testklienten. Denna funktion är tillgänglig sedan Flask 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')
Att köra testen är som vanligt för otest
if __name__ == "__main__":
unittest.main()
Och i kommandoraden
python tests/test_myapp.py
Ett annat trevligt sätt att köra dina tester är att använda unittest Discovery så här:
python -m unittest discover -s tests