pytest-socket
一个用于 Pytest 的插件,用于在测试期间禁用或限制 socket 调用,
以确保阻止网络调用。
功能
- 禁用所有通过 Python 的
socket接口发出的网络调用, 包括 DNS 解析。 - 将连接限制在主机、IP 地址或 CIDR 网络范围的允许列表中。
- 可选择性地允许 Unix 域套接字,例如在测试异步代码时。
- 通过 CLI 标志全局应用,或通过 fixtures 和 markers 按测试应用。
需求
- Pytest 7.0 or greater
- Python 3.10 or greater
安装
您可以通过 pip
从 PyPI 安装 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 插件。