I have a project with 600+ unit tests. These tests use a very time consuming function to log dataframes, which help with debugging. Which is great when I'm debugging 1-2 tests. But when I run all 600 tests this logging takes 30% of total execution time.
What I want to do is disable this expensive logging whenever the current test run is running say more than 100 tests.
Here is what I did in my conftest.py
:
def pytest_collection_modifyitems(config, items):
num_tests = len(items)
if num_tests > 100:
print(f'Running {num_tests} tests (more than 100 tests), disabling dataframe logging.')
os.environ['RUNNING_MORE_THAN_100_TESTS'] = '1'
else:
print(f'Running {num_tests} tests.')
and then in my log_dataframe()
method I do nothing if RUNNING_MORE_THAN_100_TESTS
is set.
def log_dataframe(df: DataFrame, logger_obj):
if os.environ.get('RUNNING_MORE_THAN_100_TESTS'):
logger_obj.info(f'RUNNING_MORE_THAN_100_TESTS is set. log_dataframe() skipped.')
return
else:
# log df as usual
But when I run it with some keyword to select specific tests:
$ pytest -k emailer
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-8.3.2, pluggy-1.6.0
rootdir: /local_disk0/.ephemeral_nfs/envs/pythonEnv-1581bc5c-5c05-4f64-8c4d-2cf4c1be04fb/lib/python3.10/site-packages/my_pkg
plugins: mock-3.14.0, profiling-1.8.1, cov-5.0.0, anyio-3.5.0
Running 651 tests (more than 100 tests), disabling dataframe logging.
collected 651 items / 610 deselected / 41 selected
So it seems like the hook is called before filters are applied. Is there some other hook that I can use (which is called after items are selected)?
Of course I find the answer as soon as I post the question here. Looks like hook is pytest_collection_finish()
.
Found from here.
def pytest_collection_finish(session):
num_tests = len(session.items)
if num_tests > 100:
print(f'Running {num_tests} tests (more than 100 tests), disabling dataframe logging.')
os.environ['RUNNING_MORE_THAN_100_TESTS'] = '1'
else:
print(f'Running {num_tests} tests.')