aah*_*nik 7 python testing docker python-poetry
我有一个像这样的 Dockerfile:
FROM python:3.9
WORKDIR /app
RUN apt-get update && apt-get upgrade -y
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
ENV PATH /root/.local/bin:$PATH
COPY pyproject.toml poetry.lock Makefile ./
COPY src ./src
COPY tests ./tests
RUN poetry install && poetry run pytest && make clean
CMD ["bash"]
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,测试将在构建期间运行。它可能会稍微减慢构建速度,但会确保我的代码在 Docker 容器中运行。
如果测试在我的本地计算机中通过,并不意味着它们也会在 docker 容器中通过。
假设我在代码中添加了一个使用 chromedriver 或 ffmpeg 二进制文件的功能,该功能存在于我的系统中,因此测试将在我的系统中通过。
但是,假设我忘记在 Dockerfile 中安装这些依赖项,那么 docker 构建将会失败(因为测试在构建期间运行)
做我想做的事情的标准方法是什么?
我的 Dockerfile 好吗?或者我应该做一些不同的事情?
如果您使用多个阶段,您可以运行docker build并避免运行测试,如果您想稍后运行测试,则运行docker build --target test将在之前构建的内容上运行测试。docker 官方文档中对此方法进行了解释。
这样,我们不仅可以避免由于 Docker 缓存机制而运行两次构建,还可以避免将测试代码包含在镜像中。
在进行 CI/CD 时,此实现的一个可能的用例是在本地开发和在 CI 中运行这两个命令;并且不要运行 CD 中的测试命令,因为正在部署的代码已经经过测试。
在图像构建上运行 pytest 对我来说没有意义。但是,您可以做的是在图像完成后运行测试。在你的管道中你应该有这样的东西: