首页 > 解决方案 > 在 Dockerfile 中运行 py.test

问题描述

我有这个包含一行的 Dockerfile RUN py.test -vv

FROM bitnami/python:3.6-prod
#MORE DIRECTIVES
RUN py.test -vv
COPY . /files
WORKDIR /files
EXPOSE 8080

当我运行时docker-compose build,我收到此错误。

Step 16/21 : RUN py.test -vv
 ---> Running in 5b3f55f10025
============================= test session starts ==============================
platform linux -- Python 3.6.9, pytest-5.2.1, py-1.8.0, pluggy-0.13.0 -- /opt/bitnami/python/bin/python
cachedir: .pytest_cache
rootdir: /
plugins: ordering-0.6, cov-2.8.1, docker-compose-3.1.2, celery-4.3.0
collecting ... collected 0 items / 1 errors

==================================== ERRORS ====================================
________________________ ERROR collecting test session _________________________
opt/bitnami/python/lib/python3.6/site-packages/_pytest/config/__init__.py:456: in _importconftest
    return self._conftestpath2mod[key]
E   KeyError: PosixPath('/opt/bitnami/python/lib/python3.6/site-packages/matplotlib/tests/conftest.py')

During handling of the above exception, another exception occurred:
opt/bitnami/python/lib/python3.6/site-packages/_pytest/config/__init__.py:462: in _importconftest
    mod = conftestpath.pyimport()
opt/bitnami/python/lib/python3.6/site-packages/py/_path/local.py:701: in pyimport
    __import__(modname)
opt/bitnami/python/lib/python3.6/site-packages/matplotlib/tests/__init__.py:16: in <module>
    'The baseline image directory does not exist. '
E   OSError: The baseline image directory does not exist. This is most likely because the test data is not installed. You may need to install matplotlib from source to get the test data.

During handling of the above exception, another exception occurred:
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:377: in visit
    for x in Visitor(fil, rec, ignore, bf, sort).gen(self):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:429: in gen
    for p in self.gen(subdir):
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:418: in gen
    dirs = self.optsort([p for p in entries
opt/bitnami/python/lib/python3.6/site-packages/py/_path/common.py:419: in <listcomp>
    if p.check(dir=1) and (rec is None or rec(p))])
opt/bitnami/python/lib/python3.6/site-packages/_pytest/main.py:606: in _recurse
    ihook = self.gethookproxy(dirpath)
opt/bitnami/python/lib/python3.6/site-packages/_pytest/main.py:424: in gethookproxy
    my_conftestmodules = pm._getconftestmodules(fspath)
opt/bitnami/python/lib/python3.6/site-packages/_pytest/config/__init__.py:434: in _getconftestmodules
    mod = self._importconftest(conftestpath)
opt/bitnami/python/lib/python3.6/site-packages/_pytest/config/__init__.py:470: in _importconftest
    raise ConftestImportFailure(conftestpath, sys.exc_info())
E   _pytest.config.ConftestImportFailure: (local('/opt/bitnami/python/lib/python3.6/site-packages/matplotlib/tests/conftest.py'), (<class 'OSError'>, OSError('The baseline image directory does not exist. This is most likely because the test data is not installed. You may need to install matplotlib from source to get the test data.',), <traceback object at 0x7f814caaef88>))
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 11.83s ===============================
ERROR: Service 'testproject' failed to build: The command '/bin/sh -c py.test -vv' returned a non-zero code: 2

我尝试添加pip install matplotlibDockerfile,但仍然遇到相同的错误。

我之前有一个 NodeJS 应用程序,它也是 Dockerized 的,它使用mocha和放入Dockerfile 进行了一些测试,RUN mocha工作正常。我不确定 Python 中的问题是什么。

标签: pythonpython-3.xpytestdjango-unittest

解决方案


我觉得这里的问题是因为pytest没有预先安装在python中。因此,您必须在 docker 容器中添加 pytest 安装步骤。就我个人而言,我一直在为 pytest 使用单独的 dockerfile 来运行它,该文件用于安装 ENTRYPOINT 并将其设置为 pytest。

我附上了 docker-compose.yaml、dockerfile 和 pytest.dockerfile 供您参考。或者,您可以直接在 .yaml 文件/dockerfile 本身中提及 pytest 安装步骤,因为您无需添加任何其他服务并避免额外的 dockerfile。这个设置对我来说非常适合使用 docker 容器运行 Selenium-pytest 测试自动化。请试试这个,让我们知道反馈。

version: '3.7'
services:
  test:
    volumes:
      - .:/files 
    build: 
      context: .
      dockerfile: pytest.dockerfile

docker-compose.yaml

FROM python:3.7-alpine
MAINTAINER xyz

ADD . /files
WORKDIR /files

ENV PYTHONDONTWRITEBYTECODE=true
EXPOSE 4444

码头文件。公开端口的选项在这里再次是可选的。

FROM python:3.7-alpine
MAINTAINER xyz

RUN pip install pytest

ENTRYPOINT [ "pytest" ]

pytest.dockerfile


推荐阅读