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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow