python - attribute - matraz de prueba sql alquimia
title html attribute (3)
Tengo una aplicación web en funcionamiento en Flask con SqlAlchemy para moderar las noticias, tiene algunos métodos api para manejar las solicitudes de moderación, como aprobar, rechazar noticias seleccionadas, listarlas, etc. Quiero escribir pruebas unitarias para estos métodos, y Los hice funcionar, pero no entiendo, cómo implementar la ejecución de todas las solicitudes que hago desde casos de prueba en una sesión de db, para poder eliminar todos los cambios a la base de datos. ¿O hay otra forma más limpia o adecuada de hacer esto? Descubrí que tal vez todo lo que necesito es "scoped_session" en SqlAlchemy, pero todos mis intentos de implementarlo han fallado. Si es así, por favor, dígame dónde usar estas líneas de código (en la configuración o en el método de configuración de caso de prueba).
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker()
Session = scoped_session(session_factory)
Con respecto a la respuesta de codegeek utilizando Flask-Testing, tengo problemas para entender lo que hace createapp()
. La Introducción a Contextos de Flask-SqlAlchemy me proporcionó algunos indicadores sobre cómo enlazar dinámicamente el objeto SQLAlchemy a su aplicación. En este caso, vinculante a la aplicación de prueba.
Básicamente:
- Cree un objeto sqlalchemy matraz pero no pase en el objeto de la aplicación
- En la función create_app, crea tu aplicación de prueba y vincula dinámicamente SQLAlchemy.
Tu myapp.py :
# don''t pass in the app object yet
db = SQLAlchemy()
def create_test_app():
app = Flask(__name__)
app.config[''TESTING''] = True
app.config["SQLALCHEMY_DATABASE_URI"] = "xxxxxxtestdatabasexxx"
# Dynamically bind SQLAlchemy to application
db.init_app(app)
app.app_context().push() # this does the binding
return app
# you can create another app context here, say for production
def create_production_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "xxxxxxproductionxxxx"
# Dynamically bind SQLAlchemy to application
db.init_app(app)
app.app_context().push()
return app
Luego puede seguir la solución de codegeek como se describe en la documentación de Flask-Test.
from flask.ext.testing import TestCase
from myapp import create_app, db
class MyTest(TestCase):
# I removed some config passing here
def create_app(self):
return create_test_app()
def setUp(self):
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
Lo bueno de esta solución es que puede crear diferentes aplicaciones y vincular dinámicamente el objeto SQLAlchemy mediante una función. Cada aplicación puede servir a diferentes propósitos. Por ejemplo, uno para producción y otro para prueba de unidad. En el caso de producción, puede llamar a create_production_application () en su aplicación de matraz de nivel superior.
Esta es la forma en que he estado ejecutando pruebas unitarias recientemente. Supongo que ya que estás usando SQLAlchemy que estás usando clases modelo. También asumo que todas sus tablas están definidas como clases de modelo SQLAlchemy.
from flask import Flask
import unittest
from app import db
from app.models import Log
from constants import test_logs
class appDBTests(unittest.TestCase):
def setUp(self):
"""
Creates a new database for the unit test to use
"""
self.app = Flask(__name__)
db.init_app(self.app)
with self.app.app_context():
db.create_all()
self.populate_db() # Your function that adds test data.
def tearDown(self):
"""
Ensures that the database is emptied for next unit test
"""
self.app = Flask(__name__)
db.init_app(self.app)
with self.app.app_context():
db.drop_all()
Ya que está utilizando la misma configuración de base de datos que su aplicación, esto le permite crear y destruir una base de datos de prueba con cada prueba de unidad que ejecute.
Te sugiero que utilices la extensión Flask-Testing . Esta es una extensión aprobada que le permite realizar las pruebas de unidad como desee. Tiene una sección específica para SQLAlchemy también.
Pruebas con SQLAlchemy
Esto cubre un par de puntos si está utilizando Flask-Testing con SQLAlchemy. Se supone que está utilizando la extensión Flask-SQLAlchemy, pero si no es así, los ejemplos no deberían ser demasiado difíciles de adaptar a su configuración particular.
¡Primero, asegúrese de configurar la URI de la base de datos en algo diferente a su base de datos de producción ! En segundo lugar, normalmente es una buena idea crear y eliminar sus tablas con cada ejecución de prueba, para garantizar pruebas limpias: "
from flask.ext.testing import TestCase
from myapp import create_app, db
class MyTest(TestCase):
SQLALCHEMY_DATABASE_URI = "sqlite://"
TESTING = True
def create_app(self):
# pass in test configuration
return create_app(self)
def setUp(self):
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()