Nase
Test Runner unterstützt setup_package() und teardown_package() Methoden. Hier ist ein Auszug aus der Dokumentation:
In meiner Anwendung habe ich setup_package() was ungefähr so aussieht:
def _create_database():
template_engine = sa.create_engine("postgres://example@sqldat.com/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://example@sqldat.com/%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
Außerdem werden alle Testfallklassen von einer Basisklasse abgeleitet, die, was wichtig ist, einen gemeinsamen tearDown definiert Methode:
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()
Unterklassen überschreiben oft Basis-setUp , aber normalerweise muss tearDown nicht überschrieben werden - Durch das Zurücksetzen der Transaktion wird sichergestellt, dass der nächste Test auf einer vollständig sauberen Datenbank beginnt.