PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Creazione di database nei test SQLAlchemy con PostgreSQL

Naso test runner supporta setup_package() e teardown_package() metodi. Ecco un estratto dai documenti:

Nella mia applicazione ho setup_package() che assomiglia più o meno al seguente:

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

Inoltre, tutte le classi di test case sono sottoclassi da una classe base, che, soprattutto, definisce un comune tearDown metodo:

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

Le sottoclassi spesso sostituiscono setUp di base , ma di solito non è necessario sovrascrivere tearDown - eseguendo il rollback della transazione assicura che il test successivo venga avviato su un database completamente pulito.