Running pytest test functions inside a jupyter notebook
Question:
I’m working on a presentation about python testing options, and one of the technologies I want to demo is pytest. I’m planning to do the presentation from an jupyter/ipython notebook. Ideally I’d like to be able to define a test function in a cell and then use pytest to run just that function; that way I can demonstrate individual features of pytest, etc.
Is there an existing way to do this? None of the interactive features I saw in the pytest api seem to fit the bill, but I’m certainly no pytest expert. I’d be happy to write a plugin to do it, so any advice on the best approach in that direction would be great.
I did see pytest-ipynb, but it does not seem to do what I need. If that assessment is wrong, advice on how to use that would be great, too.
Answers:
I created ipython_pytest for this purpose and used it in my PyCon Helsinki 2016 presentation.
You would use the tool like this:
%%pytest
def test_my_stuff():
assert 42 == 42
Unfortunately I couldn’t find a way to make functions and classes defined in the notebook available to test functions in the test cell. I’d appreciate if someone comes up with a solution for that.
There is a similar module that looks very mature: https://github.com/chmp/ipytest
It is referenced in the module developed by @akaiola and is more active and regularly updated / maintained.
Here is an example from the Github repository (https://github.com/chmp/ipytest/blob/master/Example.ipynb)
And another one I have created recently
My 2 cents here since I’ve already solved this issue for myself 2x and both times come back to this site. For my future self:
For a project structured in the following way
prod_folder:
* data
* code
* run_notebook.ipynb
* tests
* test_some_test.py
If you want to run pytest from within run_notebook.ipynb the following cell-magic worked for my purposes:
!pytest ../tests
In Google Colab I usually do the following procedure:
- Create a file name for the respective cell:
Here’s an example:
%%file test_list.py
# find the mismatched elements in list `l1` which are not in list `l2`
def solution(l1: list, l2: list) -> list:
return [
e
for e in l1
if e not in [e for e in l2]
]
import pytest
a = [1,2,3]
b = [3,4,None,None]
TEST_CASES = [[a,b]]
class TestCase:
@pytest.mark.parametrize("test_case", TEST_CASES)
def test_events(self, test_case):
assert solution(test_case[0], test_case[1]) == [1,2]
- Run
pytest
in another cell:
!python -m pytest test_list.py
Out:
============================= test session starts ==============================
platform linux -- Python 3.8.16, pytest-3.6.4, py-1.11.0, pluggy-0.7.1
rootdir: /content, inifile:
plugins: typeguard-2.7.1
collected 1 item
test_list.py . [100%]
=========================== 1 passed in 0.02 seconds ===========================
I’m working on a presentation about python testing options, and one of the technologies I want to demo is pytest. I’m planning to do the presentation from an jupyter/ipython notebook. Ideally I’d like to be able to define a test function in a cell and then use pytest to run just that function; that way I can demonstrate individual features of pytest, etc.
Is there an existing way to do this? None of the interactive features I saw in the pytest api seem to fit the bill, but I’m certainly no pytest expert. I’d be happy to write a plugin to do it, so any advice on the best approach in that direction would be great.
I did see pytest-ipynb, but it does not seem to do what I need. If that assessment is wrong, advice on how to use that would be great, too.
I created ipython_pytest for this purpose and used it in my PyCon Helsinki 2016 presentation.
You would use the tool like this:
%%pytest
def test_my_stuff():
assert 42 == 42
Unfortunately I couldn’t find a way to make functions and classes defined in the notebook available to test functions in the test cell. I’d appreciate if someone comes up with a solution for that.
There is a similar module that looks very mature: https://github.com/chmp/ipytest
It is referenced in the module developed by @akaiola and is more active and regularly updated / maintained.
Here is an example from the Github repository (https://github.com/chmp/ipytest/blob/master/Example.ipynb)
And another one I have created recently
My 2 cents here since I’ve already solved this issue for myself 2x and both times come back to this site. For my future self:
For a project structured in the following way
prod_folder:
* data
* code
* run_notebook.ipynb
* tests
* test_some_test.py
If you want to run pytest from within run_notebook.ipynb the following cell-magic worked for my purposes:
!pytest ../tests
In Google Colab I usually do the following procedure:
- Create a file name for the respective cell:
Here’s an example:
%%file test_list.py
# find the mismatched elements in list `l1` which are not in list `l2`
def solution(l1: list, l2: list) -> list:
return [
e
for e in l1
if e not in [e for e in l2]
]
import pytest
a = [1,2,3]
b = [3,4,None,None]
TEST_CASES = [[a,b]]
class TestCase:
@pytest.mark.parametrize("test_case", TEST_CASES)
def test_events(self, test_case):
assert solution(test_case[0], test_case[1]) == [1,2]
- Run
pytest
in another cell:
!python -m pytest test_list.py
Out:
============================= test session starts ==============================
platform linux -- Python 3.8.16, pytest-3.6.4, py-1.11.0, pluggy-0.7.1
rootdir: /content, inifile:
plugins: typeguard-2.7.1
collected 1 item
test_list.py . [100%]
=========================== 1 passed in 0.02 seconds ===========================