ipythonpytestipython-magic

IPython shortcut for importing pytest fixtures


Suppose that I am writing a test called test_this_thing in IPython which I intend to progressively save into a test file test_some_tests.py.

When it comes to running my tests I can do that easily from IPython with this great suggestion from a colleague:

%run -m pytest -- -k test_this_thing

Suppose I added a couple of fixtures into my test file (marked with @pytest.fixture). To get them into my IPython REPL I have to import them and call them (since they are written as functions):

from test_some_tests import *

fixture1 = fixture1()
fixture2 = fixture2()

I wonder if there is any kind of way to leverage pytest's fixture-finding functionality to write an IPython magic function like:

%import_fixtures -k test_this_thing

which would import into my IPython all the fixtures that the -k test_this_thing tests need and do the f = f() bit for me on each of them?

Note: When I write tests in IPython I will usually be running it from the directory where my test file lives (ie I cd into that directory before running ipython), so that

from test_some_tests import *

works. Some people might add various __init__.py to make their tests importable but I tend not to (indeed, IIRC the pytest suggestion is to not do that).


Solution

  • I came up with an alternative which works and which brings one advantage -- it imports my underscore helper functions too.

    At the bottom of the test file I added:

    if __name__ == "__main__":
        fixture1 = fixture1()
        fixture2 = fixture2()
    

    and then in IPython, rather than

    from test_some_tests import *
    

    I do

    %run test_some_tests.py
    

    The advantage is that this also imports into IPython all my underscore helper functions.