当前位置: 首页 > 面试题库 >

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

阎德义
2023-03-14
问题内容

我对在类似docker的沙箱中使用pytest执行可能不受信任的测试感兴趣,这与持续集成服务的功能类似。

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

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

更新 :这个问题是不是在一般的python沙盒作为测试代码由pytest运行,我不能改变它执行到使用方式execast或什么的。不幸的是,也不能使用pypy-
sandbox,因为根据PyPy功能页面,它是“仅原型” 。

更新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在操作系统级别的隔离下以及在一次性环境中运行项目测试。许多方法都是可行的,并且各有利弊,但是大多数方法都有更多的移动部件,我会对此感到满意。

我设计的绝对最小(但有根据)方法如下:

  • 用以下命令构建一个python docker映像:
    • 专用的非root用户: pytest
    • 来自的所有项目依赖项 requirements.txt
    • 以开发模式安装的项目
  • 在将项目文件夹作为pytest用户的主目录挂载在主机上的容器中运行py.test

要实现该方法,请将以下内容添加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 .

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

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


 类似资料:
  • 我正在做一个项目,需要遍历文件系统,从pdf中提取文本,然后扫描文本。以前,文件系统是一个N驱动器(充当本地文件系统),因此使用java文件API,我可以访问每个pdf文件。使用此方法,我将提取文本: 从这里,我可以扫描文本。 我现在需要这样做,但使用dropbox文件系统。但是,我只能找到一种方法来获取每个文件的元数据,而不是实际的文件,因此我可以提取文本。 有没有办法获取文件,以便我可以在文件

  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 这个错误是什么?如何在laravel中创建简单测试。 PHPUnit 6.3。1由塞巴斯蒂安·伯格曼和撰稿人撰写。 时间:130毫秒,内存:4.00MB 没有执行任何测试! 测试/功能/阅读文章。php

  • 试着用TestNG运行我所有的cucumber测试。然而,我的套房没有找到。 当我将TestNG.xml文件作为TestNG运行时,未找到如下所示的测试

  • 问题内容: 我在代码中有很多地方可以处理Alamofire请求/响应。 由于某些间歇性问题(最常见的是不稳定的网络),每个请求都可能失败。 我希望能够在重试前重试请求3次。 直接的方法是拥有类似的东西 但是,出于多种原因,我不喜欢这种方法。最明显的是,我将需要为每种请求类型实现这样的代码(并且我有15种这样的代码)。 我很想知道是否有办法做类似的事情(变化很小且非侵入性) 问题答案: 通过Swif

  • 这是我添加的公共类NewEmptyJUnitTest的代码{ 这是pom.xml文件 我一直收到这个错误: