首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种使用pytest (特别是文件系统访问)进行沙箱测试执行的方法?

是否有一种使用pytest (特别是文件系统访问)进行沙箱测试执行的方法?
EN

Stack Overflow用户
提问于 2016-02-10 17:51:38
回答 2查看 2.1K关注 0票数 5

我感兴趣的是在某种沙箱(如docker )中使用pytest执行可能不受信任的测试,类似于连续集成服务所做的工作。

我理解要正确地沙箱处理python进程,您需要OS级别的隔离,就像在一次性chroot/容器中运行测试一样,但在我的用例中,我不需要防范故意的恶意代码,只需要避免将“随机”函数与参数配对的危险行为。所以不那么严格的沙井仍然是可以接受的。但我没有发现任何插件可以支持任何形式的沙箱。

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

Update:这个问题不是关于一般python沙箱的,因为测试的代码是由pytest运行的,我不能改变它的执行方式以使用execast或其他任何东西。另外,不幸的是,使用pypy并不是一个选项,因为按照PyPy特征页,它只是“一个原型”。

Update 2:pytest-dev邮件列表建议通过pytest-xdist使用专用的testuser。上的Hoger,用于用户级隔离:

代码语言:javascript
复制
py.test --tx ssh=OTHERUSER@localhost --dist=each

对于我的CI类用例,哪个让我意识到

拥有一个“一次性”环境与拥有一个独立的环境一样重要,这样每个测试或每个会话都从相同的初始状态运行,并且它不会受到旧会话在可由testuser (/home/testuser、/tmp、/var/tmp等)可写的文件夹上留下的影响。

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

只是为了上下文,我需要隔离来运行pytest-nodev

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 13:53:31

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

我设计的绝对最低(但固执己见)方法如下:

  • 使用:构建python映像
    • 专用的非根用户:pytest
    • 来自requirements.txt的所有项目依赖项
    • 安装在开发模式下的项目

  • 在一个容器中运行py.test,该容器将项目文件夹作为pytest用户的主页挂载在主机上。

要实现该方法,请将以下Dockerfile添加到要测试的项目的顶部文件夹( requirements.txtsetup.py文件旁边):

代码语言:javascript
复制
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"]

使用以下方法构建图像一次:

代码语言:javascript
复制
docker build -t pytest .

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

代码语言:javascript
复制
docker run --rm -it -v `pwd`:/home/pytest pytest [USUAL_PYTEST_OPTIONS]

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

现在,您应该能够开发和测试您的项目与操作系统级的隔离。

更新:--如果您也在主机上运行测试--您可能需要删除容器中不可写的pytest缓存。在主机上运行:

代码语言:javascript
复制
rm -rf .cache/ && find . -name __pycache__  | xargs rm -rf
票数 8
EN

Stack Overflow用户

发布于 2016-02-17 04:15:47

老实说,这似乎是像码头这样的一个很好的用例。当然,您并不是只使用python就能完全干净地处理它,但是您可以滥用主机操作系统来满足您的心脏需求,而不必担心长期的损害。此外,与许多CI解决方案不同,它可以轻松地在您的开发机器上运行。

还请注意,无论您的代码是否有意恶意,保持这种隔离仍然有利于防止以下事故:

代码语言:javascript
复制
rm -rf /usr/local/share/ myapp
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35322452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档