Ricerca…


Test della nostra app Hello World

introduzione

In questo esempio minimalista, usando pytest , pytest che la nostra app Hello World restituisce "Hello, World!" con un codice di stato HTTP OK di 200, quando viene colpito con una richiesta GET sull'URL /

Per prima cosa installiamo pytest nel nostro virtualenv

pip install pytest

E solo per riferimento, questa nostra app ciao mondo:

# hello.py
from flask import Flask

app = Flask(__name__)

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

Definire il test

Accanto al nostro hello.py , definiamo un modulo di test chiamato test_hello.py che verrà scoperto da 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!'

Giusto per valutare, a questo punto la nostra struttura di progetto ottenuta con il comando ad tree è:

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

Esecuzione del test

Ora possiamo eseguire questo test con il comando py.test che scoprirà automaticamente il nostro test_hello.py e la funzione di test al suo interno

$ py.test

Dovresti vedere alcuni risultati e un'indicazione che è passato 1 test, ad es

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

Test di un'API JSON implementata in Flask

Questo esempio presume che tu sappia come testare un'app Flask usando pytest

Di seguito è riportata un'API che accetta un input JSON con valori interi a e b eg {"a": 1, "b": 2} , li somma e restituisce sum a + b in una risposta JSON, ad esempio {"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']})

Testare questa API con pytest

Possiamo testarlo con 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

Ora esegui il test con il comando py.test .

Accesso e manipolazione delle variabili di sessione nei test mediante Flask-Testing

La maggior parte delle applicazioni Web utilizza l'oggetto sessione per memorizzare alcune informazioni importanti. Questo esempio mostra come testare tale applicazione utilizzando Flask-Testing. L'esempio operativo completo è disponibile anche su github .

Quindi, prima installa Flask-Testing nel tuo virtualenv

pip install flask_testing

Per poter utilizzare l'oggetto sessione è necessario impostare la chiave segreta

app.secret_key = 'my-seCret_KEy'

Immaginiamo di avere nella funzione dell'applicazione che è necessario memorizzare alcuni dati in variabili di sessione come questa

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

Per testare questa funzione è possibile importare flask_testing e lasciare che la classe di test erediti flask_testing.TestCase. Importa anche tutte le librerie necessarie

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

Molto importante prima di iniziare il test è implementare la funzione create_app altrimenti ci sarà un'eccezione.

  def create_app(self):
    return app

Per testare la tua applicazione funziona come volevi hai un paio di possibilità. Se vuoi solo assicurarti che la tua funzione stia impostando valori particolari su una variabile di sessione puoi semplicemente mantenere il contesto intorno e accedere a 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')

Un altro trucco utile è quello di differenziare tra i metodi GET e POST come nella prossima funzione di test

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

Ora immagina che la tua funzione si aspetti che una variabile di sessione sia impostata e reagisca in modo diverso su valori particolari come questo

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

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

Per testare questa funzione è necessario utilizzare la cosiddetta transazione di sessione e aprire la sessione nel contesto del client di test. Questa funzione è disponibile dal 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')

Eseguire i test è come al solito per unittest

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

E nella riga di comando

python tests/test_myapp.py

Un altro bel modo per eseguire i test consiste nell'utilizzare l'Unittest Discovery in questo modo:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow