Thanks Mike! engine.dispose() fixed it. Makes sense that it was a garbage collection problem.
For any others finding this, I just added a call to engine.dispose() to class level tearDown and it's all good. On Thu, Sep 8, 2016 at 10:39 AM, Iain Duncan <iainduncanli...@gmail.com> wrote: > I've discovered too that the issue only happens when all my test suites > get called from one call to discovery. I've I run then in 8 calls (one to > each package, with each holding 1 to 5 test suites of about 1 to 10 tests > each), there's no issue. :-/ > > iain > > On Thu, Sep 8, 2016 at 10:36 AM, Iain Duncan <iainduncanli...@gmail.com> > wrote: > >> Thanks Mike, no we aren't. I think we are just making a new engine per >> suite, not per test though, we have the engine init code in the class level >> setup function, and per test setUp is making new sessions. We do drop the >> tables per test, which I expect we are not doing correctly as I'm a >> postgres newb. >> >> Should I be adding dispose in class level teardown? >> >> thanks! >> Iain >> >> >> >> >> On Thu, Sep 8, 2016 at 10:26 AM, Mike Bayer <mike...@zzzcomputing.com> >> wrote: >> >>> Engine per test is v inefficient, are you at least calling dispose() on >>> each one in teardown? >>> >>> >>> On Thursday, September 8, 2016, Iain Duncan <iainduncanli...@gmail.com> >>> wrote: >>> >>>> Hi Jonathan, sure can, here it is below. I think maybe this has >>>> something to do with the fact that we are creating a new engine and >>>> dropping the schema on each pass maybe? Because it seems to *only* happen >>>> when we run about 75 tests in a row. >>>> >>>> Thanks for looking! >>>> >>>> class FunctionalTestSuite(unittest.TestCase): >>>> """ >>>> base class for functional test suite with db seeding" >>>> """ >>>> >>>> # derived class needs to set this to the package of the app under test >>>> # IE app_module = examp.app >>>> app_package = None >>>> >>>> # derived class needs to put settings in here >>>> settings = { >>>> 'sqlalchemy.url': None >>>> } >>>> >>>> def __init__(self, *args, **kwargs): >>>> super(FunctionalTestSuite, self).__init__(*args, **kwargs) >>>> >>>> @classmethod >>>> def setUpClass(cls): >>>> "class level setUp creates tables" >>>> configure_mappers() >>>> # separate session factory for our test runner >>>> cls.engine = engine_from_config(cls.settings, prefix='sqlalchemy.') >>>> cls.session_factory = sessionmaker(bind=cls.engine) >>>> >>>> @classmethod >>>> def init_db(cls): >>>> "initialize the database and create sessions, normally called from >>>> setUp" >>>> # drop and recreate tables once per test >>>> # NB: this has to be done differently for postgres because it's a >>>> constraint nazi >>>> if 'postgres' in cls.settings['sqlalchemy.url']: >>>> cls.engine.execute("drop owned by semaphore") >>>> cls.engine.execute("create schema if not exists public") >>>> else: >>>> Base.metadata.drop_all(bind=cls.engine) >>>> Base.metadata.create_all(bind=cls.engine) >>>> >>>> def init_sessions(self): >>>> "init seed and confirm sessions, normally called from setUp" >>>> # create sessions for seeding and separate for confirming >>>> self.seed_dbs = self.session_factory() >>>> self.confirm_dbs = self.session_factory() >>>> >>>> def init_app(self): >>>> "init test wsgi app, normally called from setUp" >>>> self.app = self.app_package.main({}, **self.settings) >>>> self.testapp = webtest.TestApp(self.app) >>>> >>>> def setUp(self): >>>> # for tests where we want fresh db on *every* test, we use this >>>> self.init_db() >>>> self.init_sessions() >>>> self.init_app() >>>> >>>> def tearDown(self): >>>> self.seed_dbs.close() >>>> self.confirm_dbs.close() >>>> >>>> >>>> On Wed, Sep 7, 2016 at 8:37 PM, Jonathan Vanasco <jvana...@gmail.com> >>>> wrote: >>>> >>>>> can you share the test harness? >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "sqlalchemy" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to sqlalchemy+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>>> Visit this group at https://groups.google.com/group/sqlalchemy. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "sqlalchemy" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to sqlalchemy+unsubscr...@googlegroups.com. >>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/sqlalchemy. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sqlalchemy" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to sqlalchemy+unsubscr...@googlegroups.com. >>> To post to this group, send email to sqlalchemy@googlegroups.com. >>> Visit this group at https://groups.google.com/group/sqlalchemy. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.