pytest-concurrent icon indicating copy to clipboard operation
pytest-concurrent copied to clipboard

Module / session level fixture executes per thread if contains requests calls

Open vmred opened this issue 5 years ago • 0 comments
trafficstars

Weird behavior faced when module / session scope fixture contains requests lib calls inside

  1. 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

  1. 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 ?

vmred avatar Sep 17 '20 19:09 vmred