PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Création de bases de données dans les tests SQLAlchemy avec PostgreSQL

Nez le testeur prend en charge setup_package() et teardown_package() méthodes. Voici un extrait de la documentation :

Dans mon application, j'ai setup_package() qui ressemble à peu près à ceci :

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

De plus, toutes les classes de cas de test sont sous-classées à partir d'une classe de base, qui, surtout, définit un tearDown commun méthode :

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

Les sous-classes remplacent souvent la base setUp , mais il n'est généralement pas nécessaire de remplacer tearDown - en annulant la transaction, il garantit que le prochain test démarrera sur une base de données complètement propre.