Recherche…


Test de notre application Hello World

introduction

Dans cet exemple minimaliste, en utilisant pytest nous allons tester que notre application Hello World renvoie effectivement "Hello, World!" avec un code d'état HTTP OK de 200, lorsqu'il est frappé avec une requête GET sur l'URL /

D'abord, installons pytest dans notre virtualenv

pip install pytest

Et juste pour référence, ceci notre application du monde Bonjour:

# hello.py
from flask import Flask

app = Flask(__name__)

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

Définir le test

A côté de notre hello.py , nous définissons un module de test appelé test_hello.py qui sera découvert par 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!'

Juste pour examiner, à ce stade, notre structure de projet obtenue avec la commande tree est la suivante:

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

Lancer le test

Maintenant, nous pouvons exécuter ce test avec la commande py.test qui découvrira automatiquement notre test_hello.py et la fonction de test qu'il test_hello.py .

$ py.test

Vous devriez voir une sortie et une indication que 1 test a réussi, par exemple

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

Test d'une API JSON implémentée dans Flask

Cet exemple suppose que vous savez comment tester une application Flask en utilisant pytest

Voici une API qui prend une entrée JSON avec des valeurs entières a et b par exemple {"a": 1, "b": 2} , les ajoute et renvoie la somme a + b dans une réponse JSON, par exemple {"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']})

Test de cette API avec pytest

Nous pouvons le tester avec 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

Exécutez maintenant le test avec la commande py.test .

Accéder à et manipuler des variables de session dans vos tests en utilisant Flask-Testing

La plupart des applications Web utilisent l'objet de session pour stocker des informations importantes. Ces exemples montrent comment tester une telle application à l'aide de Flask-Testing. L'exemple de travail complet est également disponible sur github .

Donc, installez d'abord Flask-Testing dans votre virtualenv

pip install flask_testing

Pour pouvoir utiliser l'objet de session, vous devez définir la clé secrète

app.secret_key = 'my-seCret_KEy'

Imaginons que vous ayez dans votre application la fonction de stocker des données dans des variables de session comme celle-ci

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

Pour tester cette fonction, vous pouvez importer flask_testing et laisser votre classe de test hériter de flask_testing.TestCase. Importer aussi toutes les librairies nécessaires

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

Avant de commencer le test, il est très important d’implémenter la fonction create_app sinon il y aura des exceptions.

  def create_app(self):
    return app

Pour tester votre application fonctionne comme vous le souhaitez, vous avez plusieurs possibilités. Si vous voulez simplement vous assurer que votre fonction attribue des valeurs particulières à une variable de session, vous pouvez simplement conserver le contexte et accéder à 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')

Une autre astuce utile consiste à différencier les méthodes GET et POST comme dans la prochaine fonction de 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')

Maintenant, imaginez que votre fonction attend une variable de session à définir et réagit différemment sur des valeurs particulières comme celle-ci

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

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

Pour tester cette fonction, vous devez utiliser la transaction dite de session et ouvrir la session dans le contexte du client de test. Cette fonction est disponible depuis 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')

Exécuter les tests est comme d'habitude pour unittest

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

Et dans la ligne de commande

python tests/test_myapp.py

Une autre bonne façon d’exécuter vos tests consiste à utiliser la découverte la plus courante comme celle-ci:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow