我对在类似docker的沙箱中使用pytest执行可能不受信任的测试感兴趣,这与持续集成服务的功能类似。
我知道要正确地沙盒化python进程,您需要操作系统级别的隔离,例如在一次性chroot /容器中运行测试,但是在我的用例中,我无需针对故意的恶意代码进行保护,而无需进行配对的危险行为带参数的“随机”功能。因此,不太严格的沙箱可能仍然可以接受。但是我没有找到能够启用任何形式的沙箱的插件。
在pytest中执行沙盒测试执行的最佳方法是什么?
更新 :这个问题是不是在一般的python沙盒作为测试代码由pytest运行,我不能改变它执行到使用方式exec或ast或什么的。不幸的是,也不能使用pypy- sandbox,因为根据PyPy功能页面,它是“仅原型” 。
exec
ast
更新2 :pytest-dev邮件列表中的Hoger Krekel 建议通过pytest- xdist使用专用的testuser进行用户级隔离:
py.test --tx ssh=OTHERUSER@localhost --dist=each
这让我意识到对于类似CI的用例:
具有“一次性”环境与具有隔离环境一样重要,因此每个测试或每个会话都从相同的初始状态运行,并且不受旧会话可能保留在 testuser 可写文件夹中的影响(/ home /测试用户,/ tmp,/ var / tmp等)。
因此,testuser + xdist接近解决方案,但还远远不够。
仅出于上下文考虑,我需要隔离来运行pytest-nodev。
经过大量的研究,我没有找到任何现成的方法让pytest在操作系统级别的隔离下以及在一次性环境中运行项目测试。许多方法都是可行的,并且各有利弊,但是大多数方法都有更多的移动部件,我会对此感到满意。
我设计的绝对最小(但有根据)方法如下:
pytest
requirements.txt
要实现该方法,请将以下内容添加Dockerfile到要测试的项目的顶部文件夹中,并在requirements.txt和setup.py文件旁边:
Dockerfile
setup.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 .
在将项目文件夹作为卷安装在/ home / pytest上的容器中运行py.test,方法是:
docker run --rm -it -v `pwd`:/home/pytest pytest [USUAL_PYTEST_OPTIONS]
请注意,-v将卷挂载为uid 1000,因此pytest用户无法将主机文件写入,并且uid强制设置为7357。
-v
现在,您应该能够使用操作系统级别的隔离来开发和测试您的项目。
更新: 如果您还在主机上运行测试,则可能需要删除容器内不可写的python和pytest缓存。在主机上运行:
rm -rf .cache/ && find . -name __pycache__ | xargs rm -rf