ITADN
miketheman/pytest-socket
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

pytest-socket

PyPI current version Python Support Tests pre-commit.ci status Maintainability Code style: black CodSpeed

一个用于 Pytest 的插件,用于在测试期间禁用或限制 socket 调用, 以确保阻止网络调用。


功能

  • 禁用所有通过 Python 的 socket 接口发出的网络调用, 包括 DNS 解析。
  • 将连接限制在主机、IP 地址或 CIDR 网络范围的允许列表中。
  • 可选择性地允许 Unix 域套接字,例如在测试异步代码时。
  • 通过 CLI 标志全局应用,或通过 fixtures 和 markers 按测试应用。

需求

  • Pytest 7.0 or greater
  • Python 3.10 or greater

安装

您可以通过 pipPyPI 安装 pytest-socket

pip install pytest-socket

或将其添加到您的 pyproject.toml 中,用于 uv:

[project.optional-dependencies]
dev = [
    "pytest-socket",
]

用法

运行 pytest --disable-socket,任何对 socket 的访问或使用带有 SocketBlockedError 的 socket 的库,测试都应失败。

要将此标志添加为默认行为,请将此部分添加到您的 pytest.ini:

[pytest]
addopts = --disable-socket

或将其添加到您的 setup.cfg:

[tool:pytest]
addopts = --disable-socket

或更新您的 conftest.py 以包含:

from pytest_socket import disable_socket

def pytest_runtest_setup():
    disable_socket()

如果您确实希望为某一次特定的执行 路径启用 socket --force-enable-socket。它优先于 --disable-socket

要在测试运行期间启用 Unix sockets(例如用于 async),请添加此选项:

[pytest]
addopts = --disable-socket --allow-unix-socket

要启用特定测试对 socket 的使用,请将 fixture 传递给测试, 或使用标记:

def test_explicitly_enable_socket(socket_enabled):
    assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)


@pytest.mark.enable_socket
def test_explicitly_enable_socket_with_mark():
    assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)

仅允许每个测试使用特定主机:

@pytest.mark.allow_hosts(['127.0.0.1'])
def test_explicitly_enable_socket_with_mark():
    assert socket.socket.connect(('127.0.0.1', 80))

或针对整个测试运行

[pytest]
addopts = --allow-hosts=127.0.0.1,127.0.1.1

条目可以是主机名、IP 地址或 CIDR 网络范围,例如 192.168.0.0/24

常见问题

问:为什么我的某些测试中禁用了网络访问,而其他测试中却没有?

答:pytest 的默认 fixture 作用域是 "function",socket_enabled 使用的就是它。 如果你创建另一个具有“更高”实例化顺序(例如在 module/class/session 级别)的、创建 socket 使用的 fixture, 那么更高顺序的 fixture 会先被解析,并且在测试期间不会被禁用。 请阅读 这个优秀的示例 以及 关于 pytest fixture 顺序的更多内容

随着我们对 pytest fixture 顺序以及用户期望行为的了解加深, 此行为未来可能会发生变化。

贡献

非常欢迎贡献。可以使用 pytest 运行测试,请在提交拉取请求之前 确保覆盖率至少保持不变。

许可证

根据 MIT 许可证条款分发,"pytest-socket" 是 免费且开源的软件

问题

如果你遇到任何问题,请 提交一个 issue 并附上详细的描述。

参考

这个 Pytest 插件是使用 Cookiecutter 以及 @hackebrot's Cookiecutter-pytest-plugin 模板生成的。

这个插件源于 @hangtwenty 解决一个 StackOverflow 问题 的努力,随后由 @miketheman 转换为 pytest 插件。

Star History

Star History Chart