pytest-dev / pytest-asyncio

Asyncio support for pytest
https://pytest-asyncio.readthedocs.io
Apache License 2.0
1.43k stars 152 forks source link

ModuleNotFoundError with pytest-doctestplus #872

Open PeterJCLaw opened 4 months ago

PeterJCLaw commented 4 months ago

I'm hitting an issue using pytest-asyncio alongside pytest-doctestplus, a plugin for detecting tests in documentation. I admittedly don't know which plugin might need to change here, though given the popularity of doctests it would be great if the two worked together.

Reproduce

Create a README.md containing:

``` python
def test():
    pass

```
``` pycon
>>> 1 + 1
2

```

Then run:

$ pip install pytest-asyncio pytest-doctestplus
...
$ pytest --doctest-plus --doctest-glob '*.md'
=========================== test session starts ============================
platform linux -- Python 3.10.12, pytest-8.2.2, pluggy-1.5.0
rootdir: /tmp/bees
plugins: doctestplus-1.2.1, asyncio-0.23.7
asyncio: mode=strict
collected 0 items / 1 error                                                

================================== ERRORS ==================================
________________________ ERROR collecting README.md ________________________
ImportError while importing test module '/tmp/bees/README.md'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.10/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
E   ModuleNotFoundError: No module named 'README'
========================= short test summary info ==========================
ERROR README.md
!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!
============================= 1 error in 0.20s =============================

Cross reference: https://github.com/scientific-python/pytest-doctestplus/issues/256

seifertm commented 4 months ago

It's not unlikely that pytest-asyncio is at fault here. The plugin has some pretty ugly code that runs during test collection: https://github.com/pytest-dev/pytest-asyncio/blob/v0.23.7/pytest_asyncio/plugin.py#L575-L653

Essentially, it can only deal with standard pytest collectors and its subclasses. This could be a reason for the error you're seeing.

What's the collector type of the README file in your example?

PeterJCLaw commented 4 months ago

What's the collector type of the README file in your example?

I don't know. @bsipocz as you'd looked at this from the doctestplus side, perhaps you can help here?

bsipocz commented 4 months ago

We certainly customised the collector, but not as a subclass, so it all could be the source of the problem. As I see there is certainly more care put in the API docs collection than in the narrative docs files, so I'll try a few things this week to see if we have an easy fix for this.