python - 有没有办法用pytest沙箱测试执行,尤其是文件系统访问?

标签 python unit-testing testing docker pytest

我有兴趣在某种沙箱(如 docker)中使用 pytest 执行潜在不受信任的测试,类似于持续集成服务所做的。

我知道要正确地对 python 进程进行沙箱处理,您需要操作系统级别的隔离,例如在一次性 chroot/容器中运行测试,但在我的用例中,我不需要防范故意恶意代码,只需要防范危险将“随机”函数与参数配对的行为。因此,不太严格的沙盒可能仍然可以接受。但是我没有找到任何启​​用任何形式的沙盒的插件。

在 pytest 中执行沙盒测试的最佳方式是什么?

更新:这个问题不是关于python sandboxing in general的因为测试代码是由 pytest 运行的,所以我无法更改它的执行方式以使用 execast 或其他任何方式。不幸的是,使用 pypy-sandbox 也不是一个选项,因为根据 PyPy feature page 它是“仅原型(prototype)” .

更新 2:pytest-dev 邮件列表中的 Hoger Krekel suggests using a dedicated testuser via pytest-xdist用于用户级隔离:

py.test --tx ssh=OTHERUSER@localhost --dist=each

哪个made me realise对于我的类似 CI 的用例:

having a "disposable" environment is as important as having a isolated one, so that every test or every session runs from the same initial state and it is not influenced by what older sessions might have left on folders writable by the testuser (/home/testuser, /tmp, /var/tmp, etc).

因此 testuser+xdist 接近解决方案,但还不完全是。

仅出于上下文,我需要隔离才能运行 pytest-nodev .

最佳答案

经过相当多的研究,我没有找到任何现成的方法让 pytest 在操作系统级隔离和一次性环境中运行项目测试。许多方法都是可行的并且各有优缺点,但其中大多数都有更多我会觉得舒服的事件部分。

我设计的绝对最小(但自以为是)的方法如下:

  • 构建一个 python docker 镜像:
    • 专用的非根用户:pytest
    • requirements.txt 中的所有项目依赖项
    • 以开发模式安装的项目
  • 在一个容器中运行 py.test,该容器将项目文件夹安装在主机上作为 pytest 用户的家

要实现该方法,请将以下 Dockerfile 添加到您要测试的项目的顶级文件夹中,紧挨着 requirements.txtsetup.py 文件:

FROM python:3

# setup pytest user
RUN adduser --disabled-password --gecos "" --uid 7357 pytest
COPY ./ /home/pytest
WORKDIR /home/pytest

# setup the python and pytest environments
RUN pip install --upgrade pip setuptools pytest
RUN pip install --upgrade -r requirements.txt
RUN python setup.py develop

# setup entry point
USER pytest
ENTRYPOINT ["py.test"]

构建图像一次:

docker build -t pytest .

在容器内运行 py.test,将项目文件夹安装为/home/pytest 上的卷:

docker run --rm -it -v `pwd`:/home/pytest pytest [USUAL_PYTEST_OPTIONS]

请注意,-v 将卷挂载为 uid 1000,因此 pytest 用户无法将主机文件写入 uid 强制为 7357。

现在您应该能够使用操作系统级别的隔离来开发和测试您的项目。

更新:如果您还在主机上运行测试,您可能需要删除容器内不可写的 python 和 pytest 缓存。在主机上运行:

rm -rf .cache/ && find . -name __pycache__  | xargs rm -rf

关于python - 有没有办法用pytest沙箱测试执行,尤其是文件系统访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322452/

相关文章:

python - 在Python3中的telnet服务器中使用websockets

python - Selenium 中的单例实现 [Python]

ruby - RSpec 自定义匹配器保持规范之间的状态

python - Django 测试在没有互联网连接的情况下运行得更快

python - Django REST Framework POST 嵌套对象

python - 毫无异常(exception)地从列表中获取第一个元素

c# - NSubstitute:模拟方法未返回预期结果

c# - 如何使用最小起订量测试调用 protected 助手的代码

java - 帮助为 JDBC 编写 JUnit

ruby rspec 模拟接收哈希的测试函数