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

时间:2016-02-18 14:44:28

标签: python docker pytest docker-compose dockerfile

我正在设置一个dockerised selenium网格。我可以通过附加到pytest容器[见下面]发送我的python测试[用pytest运行]。 但是我已经设置了另一个控制pytest的LAMP容器。 所以我想让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?

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

3 个答案:

答案 0 :(得分:2)

我不确定你的测试是如何执行的,但我认为我有类似的用例。您可以在Envoy projectcmd.sh a sample test中查看我是如何做到的。

以下是我运行测试的方法。我也在使用pytest,但这并不重要: 1.使用docker-compose调出堆栈,不进行测试 2.等待堆栈为请求做好准备。对我来说,这意味着民意调查200响应 3.单独运行测试容器,但确保它使用与撰写堆栈相同的网络。

这可以通过多种方式完成。您可以将所有内容放在Bash脚本中,并从主机控制它。

在我的例子中,我是从Python容器中完成的。它有点包围,但想法是有一个主机启动的Python测试容器。然后容器本身使用compose将堆栈重新调回主机(dockerception)。然后在测试容器中运行pytest测试。完成后,它会组合堆栈并推送返回代码。

答案 1 :(得分: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

答案 2 :(得分:0)

首先,您必须使用“泊坞窗图像”获取图像列表。 然后观看列表并确保您的图像存在。 因此,使用“docker run”运行您的泊坞窗图像。

不要忘记这个注意事项:您必须在DockerFile中使用CMD与容器一起运行pytest。