Buscar..


Probando nuestra aplicación Hello World

Introducción

En este ejemplo minimalista, usando pytest vamos a probar que, de hecho, nuestra aplicación Hello World devuelve "Hello, World!" con un código de estado HTTP OK de 200, cuando se encuentra con una solicitud GET en la URL /

Primero pytest en nuestro virtualenv

pip install pytest

Y solo para referencia, esta es nuestra aplicación hola mundo:

# hello.py
from flask import Flask

app = Flask(__name__)

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

Definiendo la prueba

Junto a nuestro hello.py , definimos un módulo de prueba llamado test_hello.py que será descubierto por 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!'

Solo para revisar, en este punto nuestra estructura de proyecto obtenida con el comando de tree es:

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

Corriendo la prueba

Ahora podemos ejecutar esta prueba con el comando py.test que descubrirá automáticamente nuestro test_hello.py y la función de prueba en su interior.

$ py.test

Debería ver algunos resultados y una indicación de que ha pasado 1 prueba, por ejemplo,

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

Probando una API JSON implementada en Flask

Este ejemplo asume que sabe cómo probar una aplicación Flask usando pytest

A continuación se muestra una API que toma una entrada JSON con los valores enteros a y b por ejemplo, {"a": 1, "b": 2} , los suma y devuelve la suma a + b en una respuesta JSON, por ejemplo, {"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']})

Probando esta API con pytest

Podemos probarlo 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

Ahora ejecuta la prueba con el comando py.test .

Acceso y manipulación de las variables de sesión en sus pruebas utilizando Flask-Testing

La mayoría de las aplicaciones web utilizan el objeto de sesión para almacenar información importante. Estos ejemplos muestran cómo puede probar dicha aplicación utilizando Flask-Testing. El ejemplo completo de trabajo también está disponible en github .

Así que primero instala Flask-Testing en tu virtualenv

pip install flask_testing

Para poder usar el objeto de sesión, debes configurar la clave secreta

app.secret_key = 'my-seCret_KEy'

Imaginemos que tiene en su función de aplicación que necesita almacenar algunos datos en variables de sesión como esta

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

Para probar esta función, puede importar flask_testing y dejar que su clase de prueba herede flask_testing.TestCase. Importar también todas las bibliotecas necesarias.

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

Es muy importante antes de comenzar la prueba implementar la función create_app, de lo contrario habrá una excepción.

  def create_app(self):
    return app

Para probar tu aplicación está funcionando como lo deseas, tienes un par de posibilidades. Si solo quiere asegurarse de que su función está configurando valores particulares para una variable de sesión, puede mantener el contexto y acceder 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 truco más útil es diferenciar entre los métodos GET y POST como en la siguiente función de prueba

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

Ahora imagine que su función espera que una variable de sesión se establezca y reacciona de manera diferente en valores particulares como este

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

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

Para probar esta función, debe utilizar la llamada transacción de sesión y abrir la sesión en el contexto del cliente de prueba. Esta función está disponible desde 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')

La ejecución de las pruebas es como siempre para unittest

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

Y en la linea de comando.

python tests/test_myapp.py

Otra buena manera de ejecutar tus pruebas es usar Unittest Discovery de esta manera:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow