Reputation: 493
I want to do the following. In my project a
I have a factory class Fac
with instance fac=Fac()
, where certain classes register to. These classes reside in a subpackage a.b
.
If I do a plain import a
, the subpackage a.b
is not imported, no classes are registered, and thus fac.registered_classes
is an empty list.
After an import of subpackage b
fac.registered_classes
gets filled with the classes in subpackage b
.
To not confuse the user, I added the line
import .b
in the __init__.py
of package a
.
Now, I'd like to write a test with pytest
that basically passes, if the fac.registered_classes
is not empty; so noone accidentally erases that line in my __init__.py
. Lets call that test test_import_b
Different tests of course also test functionality of subpackage b
, thus importing b
themselves explicitly.
However, it seems that all imports during test runs are available for all tests.
While just running the single test test_import_b
fails if the import line is removed in __init__.py
, it does not anymore if all tests are ran simultaneously.
What am I supposed to do, to make my test setup work?
Upvotes: 1
Views: 1036
Reputation: 83498
This is correct py.test and Python behavior. Module body level code is run when to module is imported. Python virtual machine maintains imported modules per-process.
I do not believe there is a good solution to achieve the behavior you want. Two strategies come to my mind
Do not ever register anything implicitly on module import only - make registering everything explicit through a function call like having your init()
In the tests that explicitly need to import and have register run, import it at the beginning of the test or make a fixture that does the import
E.g.
def test_boohoo():
import a.b
# Test goes here
Upvotes: 1