Some tests uses the following idiom:

def test_main():
    try:
        test.support.run_unittest(...)
    finally:
        test.support.reap_children()

Other tests uses the following idiom:

def test_main():
    key = test.support.threading_setup()
    try:
        test.support.run_unittest(...)
    finally:
        test.support.threading_cleanup(*key)

or in other words:

@test.support.reap_threads
def test_main():
    test.support.run_unittest(...)

These tests are not discoverable. There are some ways to make them discoverable.

1. Create unittest.TestCase subclasses or mixins with overloaded the run() method.

class ThreadReaped:
    def run(self, result):
        key = test.support.threading_setup()
        try:
            return super().run(result)
        finally:
            test.support.threading_cleanup(*key)


class ChildReaped:
    def run(self, result):
        try:
            return super().run(result)
        finally:
            test.support.reap_children()

2. Create unittest.TestCase subclasses or mixins with overloaded setUpClass() and tearDownClass() methods.

class ThreadReaped:
    @classmethod
    def setUpClass(cls):
        cls._threads = test.support.threading_setup()
    @classmethod
    def tearDownClass(cls):
        test.support.threading_cleanup(*cls._threads)

class ChildReaped:
    @classmethod
    def tearDownClass(cls):
        test.support.reap_children()

3. Create unittest.TestCase subclasses or mixins with overloaded setUp() and tearDown() methods.

class ThreadReaped:
    def setUp(self):
        self._threads = test.support.threading_setup()
    def tearDown(self):
        test.support.threading_cleanup(*self._threads)

class ChildReaped:
    def tearDown(self):
        test.support.reap_children()

4. Create unittest.TestCase subclasses or mixins with using addCleanup() in constructor.

class ThreadReaped:
    def __init__(self):
        self.addCleanup(test.support.threading_cleanup,
                        *test.support.threading_setup())

class ChildReaped:
    def __init__(self):
        self.addCleanup(test.support.reap_children)

Of course instead subclassing we can use decorators which modify test class.

What method is better? Do you have other suggestions?

The issue where this problem was first occurred:
http://bugs.python.org/issue16968.

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to