pytest-concurrent
pytest-concurrent copied to clipboard
Module / session level fixture executes per thread if contains requests calls
trafficstars
Weird behavior faced when module / session scope fixture contains requests lib calls inside
- Without: conftest.py:
@pytest.fixture(scope="module")
def verify():
print("--> verify fixture setup called")
yield
print("teardown")
test_one.py:
iterations = range(10)
@pytest.mark.test
@pytest.mark.parametrize('iteration', iterations, ids=iterations)
def test_module_fixture_with_concurrency(self, iteration):
print('incrementing count')
how called:
python -m pytest -s -v -m "test" --concmode=asyncnet
result:
test_async_service.py::TestModule::test_module_fixture_with_concurrency[0] --> verify fixture setup called
incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[1] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[2] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[3] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[4] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[5] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[6] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[7] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[8] incrementing count
PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[9] incrementing count
PASSED
--->
teardown
So behavior is pretty fine - setup called once and teardown after all tests
- With requests in setup fixture
conftest.py:
@pytest.fixture(scope='module')
def verify():
print('--> verify fixture setup called')
import requests
print(requests.get('https://google.com').status_code)
yield
print('\n--->')
print('teardown')
test_one.py:
class TestModule:
iterations = range(10)
@pytest.mark.test
@pytest.mark.parametrize('iteration', iterations, ids=iterations)
def test_module_fixture_with_concurrency(self, iteration):
print('incrementing count')
how called:
python -m pytest -s -v -m "test" --concmode=asyncnet
result:
test_async_service.py::TestModule::test_module_fixture_with_concurrency[0] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[1] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[2] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[3] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[4] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[5] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[6] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[7] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[8] --> verify fixture setup called
test_async_service.py::TestModule::test_module_fixture_with_concurrency[9] --> verify fixture setup called
200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[0] PASSED
test_async_service.py::TestModule::test_module_fixture_with_concurrency[0] ERROR200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[3] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[1] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[7] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[5] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[6] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[8] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[2] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[4] PASSED200
incrementing count
test_async_service.py::TestModule::test_module_fixture_with_concurrency[9] PASSED
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
--->
teardown
test_async_service.py::TestModule::test_module_fixture_with_concurrency[9] ERRORTraceback (most recent call last):
File "C:\Users\vlad\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\vlad\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pytest\__main__.py", line 7, in <module>
raise SystemExit(pytest.main())
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\config\__init__.py", line 124, in main
ret = config.hook.pytest_cmdline_main(
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\hooks.py", line 286, in __call__
return self._hookexec(self, self.get_hookimpls(), kwargs)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\manager.py", line 93, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\manager.py", line 84, in <lambda>
self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 208, in _multicall
return outcome.get_result()
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 80, in get_result
raise ex[1].with_traceback(ex[2])
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 187, in _multicall
res = hook_impl.function(*args)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\main.py", line 240, in pytest_cmdline_main
return wrap_session(config, _main)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\main.py", line 228, in wrap_session
config.hook.pytest_sessionfinish(
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\hooks.py", line 286, in __call__
return self._hookexec(self, self.get_hookimpls(), kwargs)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\manager.py", line 93, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\manager.py", line 84, in <lambda>
self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 203, in _multicall
gen.send(outcome)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\terminal.py", line 717, in pytest_sessionfinish
outcome.get_result()
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 80, in get_result
raise ex[1].with_traceback(ex[2])
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\pluggy\callers.py", line 187, in _multicall
res = hook_impl.function(*args)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\runner.py", line 80, in pytest_sessionfinish
session._setupstate.teardown_all()
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\runner.py", line 337, in teardown_all
self._teardown_with_finalization(key)
File "C:\Users\vlad\PycharmProjects\async-service\venv\lib\site-packages\_pytest\runner.py", line 331, in _teardown_with_finalization
assert colitem in self.stack
AssertionError
Fixture setup called before each thread and executes after each thread, any ideas why and how fix this to be working as case 1 ?