[Python-ideas] Please consider adding context manager versions of setUp/tearDown to unittest.TestCase

Gregory P. Smith greg at krypto.org
Mon Aug 21 20:38:32 EDT 2017


Neil, you might also bring this up on the
http://lists.idyll.org/listinfo/testing-in-python list as I suspect people
there have opinions on this topic.

-gps

On Mon, Aug 21, 2017 at 9:07 AM Ned Batchelder <ned at nedbatchelder.com>
wrote:

> On 8/20/17 9:32 PM, Neil Girdhar wrote:
>
> This question describes an example of the problem:
> https://stackoverflow.com/questions/8416208/in-python-is-there-a-good-idiom-for-using-context-managers-in-setup-teardown.
>  You want to invoke a context manager in your setup/tearing-down, but the
> easiest way to do that is to override run, which seems ugly.
>
> Why not add two methods to unittest.TestCase whose default implementations
> are given below:
>
> class TestCase:
>
>     @contextmanager
>     def method_context(self):
>         self.setUp()
>         try:
>             yield
>         finally:
>             self.tearDown()
>
>     @contextmanager
>     def class_context(self):
>         self.setUpClass()
>         try:
>             yield
>         finally:
>             self.tearDown()
>
>
> Then, if for example someone wants to use a context manager in setUp, they
> can do so:
>
> class SomeTest(TestCase):
>
>     @contextmanager
>     def method_context(self):
>         with np.errstate(all='raise'):
>             with super().method_context():
>                 yield
>
> Best,
>
> Neil
>
>
> _______________________________________________
> Python-ideas mailing listPython-ideas at python.orghttps://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
> I've achieved a similar effect with this:
>
> def setup_with_context_manager(testcase, cm):
>     """Use a contextmanager to setUp a test case.
>
>     If you have a context manager you like::
>
>         with ctxmgr(a, b, c) as v:
>             # do something with v
>
>     and you want to have that effect for a test case, call this function
> from
>     your setUp, and it will start the context manager for your test, and
> end it
>     when the test is done::
>
>         def setUp(self):
>             self.v = setup_with_context_manager(self, ctxmgr(a, b, c))
>
>         def test_foo(self):
>             # do something with self.v
>
>     """
>     val = cm.__enter__()
>     testcase.addCleanup(cm.__exit__, None, None, None)
>     return val
>
>
> I think the use is easier than yours, which needs too much super and
> @contextmanager boilerplate.
>
>
> --Ned.
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170822/ae42f861/attachment.html>


More information about the Python-ideas mailing list