PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Criando bancos de dados em testes SQLAlchemy com PostgreSQL


Nariz executor de teste suporta setup_package() e teardown_package() métodos. Aqui está um trecho dos documentos:

Na minha aplicação eu tenho setup_package() que se parece mais ou menos com o seguinte:
def _create_database():

    template_engine = sa.create_engine("postgres://[email protected]/postgres", echo=False)

    conn = template_engine.connect()
    conn = conn.execution_options(autocommit=False)
    conn.execute("ROLLBACK")
    try:
        conn.execute("DROP DATABASE %s" % DB_NAME)
    except sa.exc.ProgrammingError as e:
        # Could not drop the database, probably does not exist
        conn.execute("ROLLBACK")
    except sa.exc.OperationalError as e:
        # Could not drop database because it's being accessed by other users (psql prompt open?)
        conn.execute("ROLLBACK")

    conn.execute("CREATE DATABASE %s" % DB_NAME)
    conn.close()

    template_engine.dispose()


def setup_package():
    _create_database()

    engine = sa.create_engine("postgres://[email protected]/%s" % DB_NAME, echo=False)

    session = sa.orm.scoped_session(sa.orm.sessionmaker())
    session.configure(bind=engine)
    Base.metadata.bind = engine
    Base.metadata.create_all()


def teardown_package():
    # no need to do anything as the old database is dropped at the start of every run

Além disso, todas as classes de casos de teste são subclassificadas de uma classe base, que, mais importante, define um tearDown comum método:
class BaseTest(unittest.TestCase):

    def setUp(self):
        # This makes things nicer if the previous test fails
        # - without this all subsequent tests fail
        self.tearDown()

        self.config = testing.setUp()

    def tearDown(self):
        testing.tearDown()
        session.expunge_all()
        session.rollback()

As subclasses geralmente substituem o setUp básico , mas geralmente não há necessidade de substituir tearDown - ao reverter a transação, garante que o próximo teste será iniciado em um banco de dados completamente limpo.