在 docker 容器中运行 py.test 作为服务

新手上路,请多包涵

我正在努力建立一个码头化的硒网格。我可以通过附加到 pytest 容器 [见下文] 发送我的 python 测试 [使用 pytest 运行]。但是我已经设置了另一个 LAMP 容器来控制 pytest。所以我想让 pytest 容器独立运行,空闲并等待来自 LAMP 容器的命令。

我有这个 Dockerfile:

 # Starting from base image
FROM ubuntu

#-----------------------------------------------------
# Set the Github personal token
ENV GH_TOKEN blablabla

# Install Python & pip
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y python python-pip python-dev && pip install --upgrade pip

# Install nano for #debugging
RUN apt-get install -y nano

# Install xvfb
RUN apt-get install -y xvfb

# Install GIT
RUN apt-get update -y && apt-get install git -y

# [in the / folder]
RUN git clone https://$GH_TOKEN:x-oauth-basic@github.com/user/project.git /project

# Install dependencies via pip
WORKDIR /project
RUN pip install -r dependencies.txt
#-----------------------------------------------------

#
CMD ["/bin/bash"]

我用这个手动 [用于开发] 启动 pytest 容器:

 docker run -dit -v /project --name pytest repo/user:py

问题是我完成了开发,我想从 docker-compose 启动 pytest 容器,并将它连接到其他容器 [带有链接和卷]。我就是无法熬夜。

我用这个:

 pytest:
  image: repo/user:py
  volumes:
    - "/project"
  command: "/bin/bash tail -f /dev/null"

但没有用。

那么,在 Dockerfile 中,我应该使用特定的 CMD 还是 ENTRYPOINT ?

我应该使用 docker-compose 文件中的一些 command 吗?

原文由 Kostas Demiris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
1 个回答

我最近刚刚在我的一个项目中启用了它。我使用多阶段构建。目前,我将测试放在与源 test_*.py 相同的文件夹中。根据我的经验,这感觉不自然,我更喜欢将测试放在默认情况下排除的自己的文件夹中。

 FROM python:3.7.6 AS build
WORKDIR /app
COPY requirements.txt .
RUN pip3 install --compile -r requirements.txt && rm -rf /root/.cache
COPY src /app
# TODO precompile

# Build stage test - run tests
FROM build AS test
RUN pip3 install pytest pytest-cov && rm -rf /root/.cache
RUN pytest --doctest-modules \
  --junitxml=xunit-reports/xunit-result-all.xml \
  --cov \
  --cov-report=xml:coverage-reports/coverage.xml \
  --cov-report=html:coverage-reports/

# Build stage 3 - Complete the build setting the executable
FROM build AS final
CMD [ "python", "./service.py" ]

为了将测试文件排除在覆盖范围之外。 .coveragerc 必须存在。

 [run]
omit = test_*

test 目标运行所需的测试并生成覆盖率和执行报告。这些 不适 用于 Azure DevOps 和 SonarQube。为了让它适合

sed -i~ 's#/app#$(Build.SourcesDirectory)/app#' $(Pipeline.Workspace)/b/coverage-reports/coverage.xml

运行测试

#!/usr/bin/env bash
set -e
DOCKER_BUILDKIT=1 docker build . --target test --progress plain

原文由 Archimedes Trajano 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题