Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pytest hangs when skipping tests with fixtures #24547

Closed
MtkN1 opened this issue Dec 5, 2024 · 3 comments · Fixed by #24588
Closed

pytest hangs when skipping tests with fixtures #24547

MtkN1 opened this issue Dec 5, 2024 · 3 comments · Fixed by #24588
Assignees
Labels
info-needed Issue requires more information from poster triage-needed Needs assignment to the proper sub-team

Comments

@MtkN1
Copy link

MtkN1 commented Dec 5, 2024

Behaviour

As the title suggests, test execution hangs when using a fixture to skip tests in pytest. The circle icon keeps spinning indefinitely, and the test never completes.

Steps to reproduce:

  1. Create a fixture code that might be skipped under certain conditions.
  2. Create a test function code that uses the fixture.
  3. Run the target test function from the "Testing" panel.
  4. The test execution hangs. While it occasionally succeeds, repeated runs usually result in a hang.

Here's the minimal code to reproduce the issue:

import pytest


@pytest.fixture
def docker_client() -> object:
    try:
        # NOTE: Actually connect with the docker sdk
        raise Exception("Docker client not available")
    except Exception:
        pytest.skip("Docker client not available")

    return object()


def test_docker_client(docker_client):
    # Running the test in VS Code will hang.
    assert ...

You can find the same code in my reproduction repository. If you'd like, you can easily reproduce the issue by creating a codespace from here: https://github.com/MtkN1/vscode-pytest-skip-hang

Diagnostic data

Output for Python in the Output panel (ViewOutput, change the drop-down the upper-right of the Output panel to Python)

2024-12-05 06:09:07.496 [info] Experiment 'pythonRecommendTensorboardExt' is active
2024-12-05 06:09:07.496 [info] Experiment 'pythonTerminalEnvVarActivation' is active
2024-12-05 06:09:07.496 [info] Experiment 'pythonTestAdapter' is active
2024-12-05 06:09:07.496 [info] Native locator: Refresh started
2024-12-05 06:09:07.496 [info] Native locator: Refresh started
2024-12-05 06:09:07.539 [info] Conda environment manager found at: /opt/conda/bin/conda
2024-12-05 06:09:07.719 [info] > pyenv which python
2024-12-05 06:09:07.719 [info] cwd: .
2024-12-05 06:09:08.012 [info] Native locator: Refresh finished in 1803 ms
2024-12-05 06:09:08.015 [info] Python interpreter path: ~/.python/current/bin/python
2024-12-05 06:09:09.075 [warning] Shell integration may not be active, environment activated may be overridden by the shell.
2024-12-05 06:09:09.102 [info] Discover tests for workspace name: vscode-pytest-skip-hang - uri: /workspaces/vscode-pytest-skip-hang
2024-12-05 06:09:09.102 [info] Running discovery for pytest using the new test adapter.
2024-12-05 06:09:09.112 [info] All environment variables set for pytest discovery: {"DOCKER_BUILDKIT":"1","ENABLE_DYNAMIC_INSTALL":"true","LESSOPEN":"| /usr/bin/lesspipe %s","GITHUB_TOKEN":"ghu_kETMfIxtmoP6wHqJorJRm76fSaWkkM3lFmY5","GIT_COMMITTER_NAME":"GitHub","PYTHONIOENCODING":"UTF-8","GITHUB_CODESPACE_TOKEN":"AMHJ22AEGTXSROPXLYJRMT3HKHUENANCNFSM4AKYDNKQ","USER":"codespace","RVM_PATH":"/usr/local/rvm","NVS_ROOT":"/usr/local/nvs","HOSTNAME":"codespaces-464917","DOTNET_USE_POLLING_FILE_WATCHER":"true","CONDA_SCRIPT":"/opt/conda/etc/profile.d/conda.sh","PIPX_HOME":"/usr/local/py-utils","SHLVL":"1","GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN":"app.github.dev","HUGO_ROOT":"/home/codespace/.hugo","HOME":"/home/codespace","OLDPWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","ORYX_ENV_TYPE":"vsonline-present","NVM_BIN":"/usr/local/share/nvm/versions/node/v20.17.0/bin","CODESPACES":"true","DOTNET_RUNNING_IN_CONTAINER":"true","NVM_SYMLINK_CURRENT":"true","DYNAMIC_INSTALL_ROOT_DIR":"/opt","PIPX_BIN_DIR":"/usr/local/py-utils/bin","NVM_INC":"/usr/local/share/nvm/versions/node/v20.17.0/include/node","rvm_stored_umask":"0022","ORYX_DIR":"/usr/local/oryx","GRADLE_HOME":"/usr/local/sdkman/candidates/gradle/current","JUPYTERLAB_PATH":"/home/codespace/.local/bin","rvm_user_install_flag":"0","MAVEN_HOME":"/usr/local/sdkman/candidates/maven/current","GOROOT":"/usr/local/go","NODE_ROOT":"/home/codespace/nvm","GITHUB_GRAPHQL_URL":"https://api.github.com/graphql","GITHUB_USER":"MtkN1","NVM_DIR":"/usr/local/share/nvm","PYTHON_PATH":"/usr/local/python/current","DOTNET_SKIP_FIRST_TIME_EXPERIENCE":"1","ContainerVersion":"13","NVS_HOME":"/usr/local/nvs","GITHUB_API_URL":"https://api.github.com","rvm_bin_path":"/usr/local/rvm/bin","SDKMAN_CANDIDATES_API":"https://api.sdkman.io/2","_":"/usr/bin/cat","RUBY_VERSION":"ruby-3.3.4","PROMPT_DIRTRIM":"4","IRBRC":"/usr/local/rvm/rubies/ruby-3.3.4/.irbrc","CLOUDENV_ENVIRONMENT_ID":"08b2dd41-2e13-4799-af58-e15b9d981e58","DOTNET_ROOT":"/usr/share/dotnet","NVS_DIR":"/usr/local/nvs","PHP_ROOT":"/home/codespace/.php","JAVA_ROOT":"/home/codespace/java","VSCODE_AGENT_FOLDER":"/home/codespace/.vscode-remote","SDKMAN_CANDIDATES_DIR":"/usr/local/sdkman/candidates","HUGO_DIR":"/usr/local/hugo/bin","NPM_GLOBAL":"/home/codespace/.npm-global","SHELL_LOGGED_IN":"true","MY_RUBY_HOME":"/usr/local/rvm/rubies/ruby-3.3.4","LANG":"C.UTF-8","SDKMAN_DIR":"/usr/local/sdkman","RUBY_ROOT":"/home/codespace/.ruby","LS_COLORS":"","SDKMAN_PLATFORM":"linuxx64","GITHUB_REPOSITORY":"MtkN1/vscode-pytest-skip-hang","SHELL":"/bin/bash","GOPATH":"/go","rvm_prefix":"/usr/local","rvm_loaded_flag":"1","GEM_HOME":"/usr/local/rvm/gems/ruby-3.3.4","ORYX_PREFER_USER_INSTALLED_SDKS":"true","LESSCLOSE":"/usr/bin/lesspipe %s %s","ORYX_SDK_STORAGE_BASE_URL":"https://oryx-cdn.microsoft.io","CONDA_DIR":"/opt/conda","rvm_version":"1.29.12 (latest)","DEBIAN_FLAVOR":"focal-scm","GIT_COMMITTER_EMAIL":"noreply@github.com","GEM_PATH":"/usr/local/rvm/gems/ruby-3.3.4:/usr/local/rvm/gems/ruby-3.3.4@global","JAVA_HOME":"/usr/local/sdkman/candidates/java/current","NVS_USE_XZ":"1","INTERNAL_VSCS_TARGET_URL":"https://southeastasia.online.visualstudio.com","PWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","NVM_CD_FLAGS":"","GITHUB_SERVER_URL":"https://github.com","PHP_PATH":"/usr/local/php/current","PYTHON_ROOT":"/home/codespace/.python","RAILS_DEVELOPMENT_HOSTS":".githubpreview.dev,.preview.app.github.dev,.app.github.dev","NVS_OS":"linux","CODESPACE_NAME":"animated-meme-64q64j59j9r2r9x","RUBY_HOME":"/usr/local/rvm/rubies/default","MAVEN_ROOT":"/home/codespace/.maven","rvm_path":"/usr/local/rvm","NUGET_XMLDOC_MODE":"skip","VSCODE_CWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","VSCODE_NLS_CONFIG":"{\"userLocale\":\"en\",\"osLocale\":\"en\",\"resolvedLanguage\":\"en\",\"defaultMessagesFile\":\"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/out/nls.messages.json\",\"locale\":\"en\",\"availableLanguages\":{}}","VSCODE_HANDLES_SIGPIPE":"true","VSCODE_ESM_ENTRYPOINT":"vs/workbench/api/node/extensionHostProcess","VSCODE_HANDLES_UNCAUGHT_ERRORS":"true","BROWSER":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/bin/helpers/browser.sh","ELECTRON_RUN_AS_NODE":"1","VSCODE_IPC_HOOK_CLI":"/tmp/vscode-ipc-b434babb-d6d2-41df-aec5-8cdfc5433a0a.sock","PATH":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/bin/remote-cli:/home/codespace/.local/bin:/home/codespace/.dotnet:/home/codespace/nvm/current/bin:/home/codespace/.php/current/bin:/home/codespace/.python/current/bin:/home/codespace/java/current/bin:/home/codespace/.ruby/current/bin:/home/codespace/.local/bin:/usr/local/python/current/bin:/usr/local/py-utils/bin:/usr/local/oryx:/usr/local/go/bin:/go/bin:/usr/local/sdkman/bin:/usr/local/sdkman/candidates/java/current/bin:/usr/local/sdkman/candidates/gradle/current/bin:/usr/local/sdkman/candidates/maven/current/bin:/usr/local/sdkman/candidates/ant/current/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/gems/default@global/bin:/usr/local/rvm/rubies/default/bin:/usr/local/share/rbenv/bin:/usr/local/php/current/bin:/opt/conda/bin:/usr/local/nvs:/usr/local/share/nvm/current/bin:/usr/local/hugo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet:/home/codespace/.dotnet/tools:/usr/local/rvm/bin","PYTHONPATH":"/home/codespace/.vscode-remote/extensions/ms-python.python-2024.20.0-linux-x64/python_files","TEST_RUN_PIPE":"/tmp/python-test-discovery-545a8778dea8e958f3ae.sock"}
2024-12-05 06:09:09.556 [info] Shell integration status changed, can confirm it's working.
2024-12-05 06:09:09.566 [info] Starting Pylance language server.
2024-12-05 06:09:09.642 [info] > ~/.python/current/bin/python -m pytest -p vscode_pytest --collect-only tests
2024-12-05 06:09:09.643 [info] cwd: .
2024-12-05 06:09:12.112 [info] ============================= test session starts ==============================
platform linux -- Python 3.12.1, pytest-8.3.4, pluggy-1.5.0
rootdir: /workspaces/vscode-pytest-skip-hang
plugins: cov-6.0.0, anyio-4.6.0
collected 1 item

<Dir vscode-pytest-skip-hang>
  <Package tests>
    <Module test_skip.py>
      <Function test_hang>

========================== 1 test collected in 0.03s ===========================

2024-12-05 06:09:17.370 [info] Attempting to use temp directory for test ids file, file name: test-ids-d0b8ce21c9feea6a0b73.txt
2024-12-05 06:09:17.392 [info] All environment variables set for pytest execution: {"DOCKER_BUILDKIT":"1","ENABLE_DYNAMIC_INSTALL":"true","LESSOPEN":"| /usr/bin/lesspipe %s","GITHUB_TOKEN":"ghu_kETMfIxtmoP6wHqJorJRm76fSaWkkM3lFmY5","GIT_COMMITTER_NAME":"GitHub","PYTHONIOENCODING":"UTF-8","GITHUB_CODESPACE_TOKEN":"AMHJ22AEGTXSROPXLYJRMT3HKHUENANCNFSM4AKYDNKQ","USER":"codespace","RVM_PATH":"/usr/local/rvm","NVS_ROOT":"/usr/local/nvs","HOSTNAME":"codespaces-464917","DOTNET_USE_POLLING_FILE_WATCHER":"true","CONDA_SCRIPT":"/opt/conda/etc/profile.d/conda.sh","PIPX_HOME":"/usr/local/py-utils","SHLVL":"1","GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN":"app.github.dev","HUGO_ROOT":"/home/codespace/.hugo","HOME":"/home/codespace","OLDPWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","ORYX_ENV_TYPE":"vsonline-present","NVM_BIN":"/usr/local/share/nvm/versions/node/v20.17.0/bin","CODESPACES":"true","DOTNET_RUNNING_IN_CONTAINER":"true","NVM_SYMLINK_CURRENT":"true","DYNAMIC_INSTALL_ROOT_DIR":"/opt","PIPX_BIN_DIR":"/usr/local/py-utils/bin","NVM_INC":"/usr/local/share/nvm/versions/node/v20.17.0/include/node","rvm_stored_umask":"0022","ORYX_DIR":"/usr/local/oryx","GRADLE_HOME":"/usr/local/sdkman/candidates/gradle/current","JUPYTERLAB_PATH":"/home/codespace/.local/bin","rvm_user_install_flag":"0","MAVEN_HOME":"/usr/local/sdkman/candidates/maven/current","GOROOT":"/usr/local/go","NODE_ROOT":"/home/codespace/nvm","GITHUB_GRAPHQL_URL":"https://api.github.com/graphql","GITHUB_USER":"MtkN1","NVM_DIR":"/usr/local/share/nvm","PYTHON_PATH":"/usr/local/python/current","DOTNET_SKIP_FIRST_TIME_EXPERIENCE":"1","ContainerVersion":"13","NVS_HOME":"/usr/local/nvs","GITHUB_API_URL":"https://api.github.com","rvm_bin_path":"/usr/local/rvm/bin","SDKMAN_CANDIDATES_API":"https://api.sdkman.io/2","_":"/usr/bin/cat","RUBY_VERSION":"ruby-3.3.4","PROMPT_DIRTRIM":"4","IRBRC":"/usr/local/rvm/rubies/ruby-3.3.4/.irbrc","CLOUDENV_ENVIRONMENT_ID":"08b2dd41-2e13-4799-af58-e15b9d981e58","DOTNET_ROOT":"/usr/share/dotnet","NVS_DIR":"/usr/local/nvs","PHP_ROOT":"/home/codespace/.php","JAVA_ROOT":"/home/codespace/java","VSCODE_AGENT_FOLDER":"/home/codespace/.vscode-remote","SDKMAN_CANDIDATES_DIR":"/usr/local/sdkman/candidates","HUGO_DIR":"/usr/local/hugo/bin","NPM_GLOBAL":"/home/codespace/.npm-global","SHELL_LOGGED_IN":"true","MY_RUBY_HOME":"/usr/local/rvm/rubies/ruby-3.3.4","LANG":"C.UTF-8","SDKMAN_DIR":"/usr/local/sdkman","RUBY_ROOT":"/home/codespace/.ruby","LS_COLORS":"","SDKMAN_PLATFORM":"linuxx64","GITHUB_REPOSITORY":"MtkN1/vscode-pytest-skip-hang","SHELL":"/bin/bash","GOPATH":"/go","rvm_prefix":"/usr/local","rvm_loaded_flag":"1","GEM_HOME":"/usr/local/rvm/gems/ruby-3.3.4","ORYX_PREFER_USER_INSTALLED_SDKS":"true","LESSCLOSE":"/usr/bin/lesspipe %s %s","ORYX_SDK_STORAGE_BASE_URL":"https://oryx-cdn.microsoft.io","CONDA_DIR":"/opt/conda","rvm_version":"1.29.12 (latest)","DEBIAN_FLAVOR":"focal-scm","GIT_COMMITTER_EMAIL":"noreply@github.com","GEM_PATH":"/usr/local/rvm/gems/ruby-3.3.4:/usr/local/rvm/gems/ruby-3.3.4@global","JAVA_HOME":"/usr/local/sdkman/candidates/java/current","NVS_USE_XZ":"1","INTERNAL_VSCS_TARGET_URL":"https://southeastasia.online.visualstudio.com","PWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","NVM_CD_FLAGS":"","GITHUB_SERVER_URL":"https://github.com","PHP_PATH":"/usr/local/php/current","PYTHON_ROOT":"/home/codespace/.python","RAILS_DEVELOPMENT_HOSTS":".githubpreview.dev,.preview.app.github.dev,.app.github.dev","NVS_OS":"linux","CODESPACE_NAME":"animated-meme-64q64j59j9r2r9x","RUBY_HOME":"/usr/local/rvm/rubies/default","MAVEN_ROOT":"/home/codespace/.maven","rvm_path":"/usr/local/rvm","NUGET_XMLDOC_MODE":"skip","VSCODE_CWD":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813","VSCODE_NLS_CONFIG":"{\"userLocale\":\"en\",\"osLocale\":\"en\",\"resolvedLanguage\":\"en\",\"defaultMessagesFile\":\"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/out/nls.messages.json\",\"locale\":\"en\",\"availableLanguages\":{}}","VSCODE_HANDLES_SIGPIPE":"true","VSCODE_ESM_ENTRYPOINT":"vs/workbench/api/node/extensionHostProcess","VSCODE_HANDLES_UNCAUGHT_ERRORS":"true","BROWSER":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/bin/helpers/browser.sh","ELECTRON_RUN_AS_NODE":"1","VSCODE_IPC_HOOK_CLI":"/tmp/vscode-ipc-b434babb-d6d2-41df-aec5-8cdfc5433a0a.sock","PATH":"/vscode/bin/linux-x64/f1a4fb101478ce6ec82fe9627c43efbf9e98c813/bin/remote-cli:/home/codespace/.local/bin:/home/codespace/.dotnet:/home/codespace/nvm/current/bin:/home/codespace/.php/current/bin:/home/codespace/.python/current/bin:/home/codespace/java/current/bin:/home/codespace/.ruby/current/bin:/home/codespace/.local/bin:/usr/local/python/current/bin:/usr/local/py-utils/bin:/usr/local/oryx:/usr/local/go/bin:/go/bin:/usr/local/sdkman/bin:/usr/local/sdkman/candidates/java/current/bin:/usr/local/sdkman/candidates/gradle/current/bin:/usr/local/sdkman/candidates/maven/current/bin:/usr/local/sdkman/candidates/ant/current/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/gems/default@global/bin:/usr/local/rvm/rubies/default/bin:/usr/local/share/rbenv/bin:/usr/local/php/current/bin:/opt/conda/bin:/usr/local/nvs:/usr/local/share/nvm/current/bin:/usr/local/hugo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet:/home/codespace/.dotnet/tools:/usr/local/rvm/bin","PYTHONPATH":"/home/codespace/.vscode-remote/extensions/ms-python.python-2024.20.0-linux-x64/python_files","TEST_RUN_PIPE":"/tmp/python-test-results-e8e4890b62ac3aff165e.sock","RUN_TEST_IDS_PIPE":"/tmp/test-ids-d0b8ce21c9feea6a0b73.txt"}
2024-12-05 06:09:17.393 [info] Running pytest with arguments: /home/codespace/.vscode-remote/extensions/ms-python.python-2024.20.0-linux-x64/python_files/vscode_pytest/run_pytest_script.py --rootdir=/workspaces/vscode-pytest-skip-hang for workspace /workspaces/vscode-pytest-skip-hang 

2024-12-05 06:09:17.393 [info] > ~/.python/current/bin/python ~/.vscode-remote/extensions/ms-python.python-2024.20.0-linux-x64/python_files/vscode_pytest/run_pytest_script.py --rootdir=.
2024-12-05 06:09:17.393 [info] cwd: .

@github-actions github-actions bot added the triage-needed Needs assignment to the proper sub-team label Dec 5, 2024
@eleanorjboyd
Copy link
Member

Hi! Can you include a video? I tried the code you sent and it worked fine for me. Thanks

@eleanorjboyd eleanorjboyd added the info-needed Issue requires more information from poster label Dec 11, 2024
@MtkN1
Copy link
Author

MtkN1 commented Dec 12, 2024

Thanks for the reply! I have captured the codespaces screen. It appears to hang after running the test a few times.

20241212-0209-16.3558028.mp4

@github-actions github-actions bot removed the info-needed Issue requires more information from poster label Dec 12, 2024
eleanorjboyd added a commit that referenced this issue Dec 12, 2024
@eleanorjboyd
Copy link
Member

hm very interesting! Do you see anything else show up in your logs? I can see the logs which talk about discovery but nothing which is about the triggering of the run test. I also put in a fix because there is a specific skip icon that should be showing when you have a skipped file that wasn't showing for a skip in a fixture. That fix might help this issue but not entirely sure if they are related

@github-actions github-actions bot added the info-needed Issue requires more information from poster label Dec 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
info-needed Issue requires more information from poster triage-needed Needs assignment to the proper sub-team
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants