This may just be a further issue with the decision to do the test multiplication during run(). (Wontfix?)
However, if I try to run my test suite using:
$ py -c "import sys; from testtools import run; import unittest; prog = run.TestProgram(testRunner=unittest.TextTestRunner(verbosity=2), stdout=sys.stdout)" discover
(so force testtools.run to actually be verbose about the tests being run), I see odd behavior.
If I just inherit from TestCaseWithScenario I see:
test__sync_exchange_updates_indexes (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test__sync_exchange_updates_indexes (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test_create_index (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test_create_index (u1db.tests.test_backends.DatabaseIndexTests) ... ok
...
If I change the code so that I inherit from testtools.TestCase, and I implement load_tests() as:
def load_tests(loader, standard_tests, pattern):
suite = loader.suiteClass()
suite.addTests(generate_scenarios(standard_tests))
return suite
I then see:
u1db.tests.test_backends.DatabaseIndexTests.test__sync_exchange_updates_indexes (mem) ... ok
u1db.tests.test_backends.DatabaseIndexTests.test__sync_exchange_updates_indexes (sqlite) ... ok
u1db.tests.test_backends.DatabaseIndexTests.test_create_index (mem) ... ok
u1db.tests.test_backends.DatabaseIndexTests.test_create_index (sqlite) ... ok
Even weirder, if I inherit directly from unittest.TestCase instead of testtools.TestCase, I see:
test__sync_exchange_updates_indexes (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test__sync_exchange_updates_indexes (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test_create_index (u1db.tests.test_backends.DatabaseIndexTests) ... ok
test_create_index (u1db.tests.test_backends.DatabaseIndexTests) ... ok
It looks like this is because unittest.TextTestRunner has getDescription defined as:
def getDescription(self, test):
if self.descriptions:
return test.shortDescription() or str(test)
else:
return str(test)
And the unittest.TestCase.shortDescription tries to return the docstring or None, while testtools.TestCase.shortDescription returns self.id().
So it looks like testscenarios.TestWithScenarios should either inherit from testtools.TestCase, or just provide def shortDescription(): return self.id().
I think inheriting from testtools.TestCase is reasonable, given that testscenarios already has a dependency on testtools.clone_test_with_new_id().
This may just be a further issue with the decision to do the test multiplication during run(). (Wontfix?)
However, if I try to run my test suite using: (testRunner= unittest. TextTestRunner( verbosity= 2), stdout=sys.stdout)" discover
$ py -c "import sys; from testtools import run; import unittest; prog = run.TestProgram
(so force testtools.run to actually be verbose about the tests being run), I see odd behavior.
If I just inherit from TestCaseWithSce nario I see: exchange_ updates_ indexes (u1db.tests. test_backends. DatabaseIndexTe sts) ... ok exchange_ updates_ indexes (u1db.tests. test_backends. DatabaseIndexTe sts) ... ok test_backends. DatabaseIndexTe sts) ... ok test_backends. DatabaseIndexTe sts) ... ok
test__sync_
test__sync_
test_create_index (u1db.tests.
test_create_index (u1db.tests.
...
If I change the code so that I inherit from testtools.TestCase, and I implement load_tests() as: addTests( generate_ scenarios( standard_ tests))
def load_tests(loader, standard_tests, pattern):
suite = loader.suiteClass()
suite.
return suite
I then see: test_backends. DatabaseIndexTe sts.test_ _sync_exchange_ updates_ indexes (mem) ... ok test_backends. DatabaseIndexTe sts.test_ _sync_exchange_ updates_ indexes (sqlite) ... ok test_backends. DatabaseIndexTe sts.test_ create_ index (mem) ... ok test_backends. DatabaseIndexTe sts.test_ create_ index (sqlite) ... ok
u1db.tests.
u1db.tests.
u1db.tests.
u1db.tests.
Even weirder, if I inherit directly from unittest.TestCase instead of testtools.TestCase, I see: exchange_ updates_ indexes (u1db.tests. test_backends. DatabaseIndexTe sts) ... ok exchange_ updates_ indexes (u1db.tests. test_backends. DatabaseIndexTe sts) ... ok test_backends. DatabaseIndexTe sts) ... ok test_backends. DatabaseIndexTe sts) ... ok
test__sync_
test__sync_
test_create_index (u1db.tests.
test_create_index (u1db.tests.
It looks like this is because unittest. TextTestRunner has getDescription defined as: self, test): iption( ) or str(test) TestCase. shortDescriptio n tries to return the docstring or None, while testtools. TestCase. shortDescriptio n returns self.id().
def getDescription(
if self.descriptions:
return test.shortDescr
else:
return str(test)
And the unittest.
So it looks like testscenarios. TestWithScenari os should either inherit from testtools.TestCase, or just provide def shortDescription(): return self.id().
I think inheriting from testtools.TestCase is reasonable, given that testscenarios already has a dependency on testtools. clone_test_ with_new_ id().