在Docker容器中运行应用程序单元测试

时间:2020-01-08 09:26:09

标签: python-3.x docker

我最近开始使用docker,并且将python应用程序容器化。我使用了以下Dockerfile。

FROM python:3.6.5

# working directory
WORKDIR /usr/src/app

# copy requirement file to working directory
COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python", "./run.py"]

我有一些使用pytest调用的单元测试。我在想如何将其包含在docker容器中,以便单元测试可以在docker容器中运行。我是否应该为此构建一个不同的图像。您对此有何建议?

3 个答案:

答案 0 :(得分:4)

我不确定您的应用程序的规模如何,为什么要使用Docker?仅仅因为您的应用程序正在Docker中运行,并不意味着您也应该在Docker中运行测试。

从最低努力到最高努力,这些都是您可以检查的几种选择。

在本地运行测试

$ python -m unittest tests/* 

使用Python虚拟环境

如果您正在考虑不破坏本地依赖关系,而只是想使用Docker,则可以使用venv并在其中运行测试。

$ python3 -m venv venv
$ . venv/bin/activate
$ python3 -m unittest tests/* 

然后您可以删除目录或虚拟环境

使用Jenkins或类似工具

如果您正在编写一个认真的项目,这是理想的解决方案。 Jenkins(或类似工具)支持dockerized运行作业。每次您要运行作业时,Jenkins都会创建一个docker容器。 您只需要指定要发出的命令即可,就像在第一个选项中那样简单。这是Jenkins with Docker support的链接。

答案 1 :(得分:0)

如果您有正在运行的容器的名称,
您可以使用 docker execute

在正在运行的容器上执行命令

假设您想通过 pytest 指定测试路径来运行一些测试
在名为/标记为“my_container”的容器上:

docker exec my_container pytest ./tests/superstuff/

注意 2 件事:

  1. ./ 路径相对于您的 WORKDIR
  2. 如果测试正在生成一些测试/输出文件,它们可能具有 docker-root 所有者而不是常规所有者,如果这不是您想要的,您可以使用 --user 端点覆盖它,如下所示:
    docker exec --user myuser:mygroup my_container pytest ./tests/superstuff/

至少在 Linux(Ubuntu) 上,您还可以使用 $(id -u):$(id -g) - 获取运行命令的用户的 id 和默认组

答案 2 :(得分:-1)

您可以编写另一个Dockerfile来更改入口点,也可以在使用命令运行Dockerfile时覆盖入口点

docker run --entrypoint

如果您的命令需要参数,请确保在图像名称之后传递参数

docker run --entrypoint "pytest" image_name arg1 arg2 ...