我感兴趣的是在某种沙箱(如docker )中使用pytest执行可能不受信任的测试,类似于连续集成服务所做的工作。
我理解要正确地沙箱处理python进程,您需要OS级别的隔离,就像在一次性chroot/容器中运行测试一样,但在我的用例中,我不需要防范故意的恶意代码,只需要避免将“随机”函数与参数配对的危险行为。所以不那么严格的沙井仍然是可以接受的。但我没有发现任何插件可以支持任何形式的沙箱。
在pytest中执行沙箱测试的最佳方法是什么?
Update:这个问题不是关于一般python沙箱的,因为测试的代码是由pytest运行的,我不能改变它的执行方式以使用exec或ast或其他任何东西。另外,不幸的是,使用pypy并不是一个选项,因为按照PyPy特征页,它只是“一个原型”。
Update 2:pytest-dev邮件列表建议通过pytest-xdist使用专用的testuser。上的Hoger,用于用户级隔离:
py.test --tx ssh=OTHERUSER@localhost --dist=each对于我的CI类用例,哪个让我意识到:
拥有一个“一次性”环境与拥有一个独立的环境一样重要,这样每个测试或每个会话都从相同的初始状态运行,并且它不会受到旧会话在可由testuser (/home/testuser、/tmp、/var/tmp等)可写的文件夹上留下的影响。
因此,testuser+xdist接近解决方案,但并不完全是这样。
只是为了上下文,我需要隔离来运行pytest-nodev。
发布于 2016-02-23 13:53:31
经过相当多的研究后,我没有找到任何现成的方法让pytest在操作系统级隔离和一次性环境下运行项目测试。许多方法是可能的,有优点和缺点,但其中大多数有更多的移动部分,我会觉得舒服。
我设计的绝对最低(但固执己见)方法如下:
pytestrequirements.txt的所有项目依赖项
pytest用户的主页挂载在主机上。要实现该方法,请将以下Dockerfile添加到要测试的项目的顶部文件夹( requirements.txt和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 .在容器内运行py.test,将项目文件夹安装为/home/pytest上的卷,使用:
docker run --rm -it -v `pwd`:/home/pytest pytest [USUAL_PYTEST_OPTIONS]请注意,-v将卷挂载为uid 1000,因此pytest用户不能写入主机文件,而uid强制为7357。
现在,您应该能够开发和测试您的项目与操作系统级的隔离。
更新:--如果您也在主机上运行测试--您可能需要删除容器中不可写的pytest缓存。在主机上运行:
rm -rf .cache/ && find . -name __pycache__ | xargs rm -rf发布于 2016-02-17 04:15:47
老实说,这似乎是像码头这样的一个很好的用例。当然,您并不是只使用python就能完全干净地处理它,但是您可以滥用主机操作系统来满足您的心脏需求,而不必担心长期的损害。此外,与许多CI解决方案不同,它可以轻松地在您的开发机器上运行。
还请注意,无论您的代码是否有意恶意,保持这种隔离仍然有利于防止以下事故:
rm -rf /usr/local/share/ myapphttps://stackoverflow.com/questions/35322452
复制相似问题