django - 工作服 : Error- No source for in my application using Docker container

标签 django docker docker-compose travis-ci coverage.py

我一直在尝试将代码覆盖率集成到我的 Django 应用程序中。构建成功并且所有测试都成功,但是当我检查 coveralls.io 或 codecov.io 时没有数据。我已经搜索了所有内容,添加了 .coveragerc 但仍然没有任何帮助。

Dockerfile

FROM python:3.7-alpine
MAINTAINER abhie-lp

ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt

RUN apk add --update --no-cache jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps \
        gcc libc-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps

RUN mkdir /app
WORKDIR /app
COPY ./app /app

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D ABHIE
RUN chown -R ABHIE:ABHIE /vol/
RUN chmod -R 755 /vol/web
USER ABHIE

docker-compose.yml

version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python manage.py wait_for_db && 
             python manage.py migrate && 
             python manage.py runserver 0.0.0.0:8000"

.travis.yml

language: python
python:
  - "3.6"

services:
  - docker

before_script:
  - pip install docker-compose
  - pip install coveralls
  - pip install codecov
  - docker-compose run --user='root' app chmod -R 777 .

script:
  - docker-compose run app sh -c "coverage run --source=. manage.py test"
  - docker-compose run app sh -c "flake8"

after_success:
  - coveralls
  - codecov

.coveragerc

[run]
source = /home/travis/build/abhie-lp/recipe-app-api/app
parallel = True
data_file = /home/travis/build/abhie-lp/recipe-app-api/app/.coverage

[paths]
source = 
  /home/travis/build/abhie-lp/recipe-app-api
  /app/

最佳答案

您展示的测试设置存在三个主要问题:

  1. docker-compose.yml 文件中的 volumes: 声明隐藏了镜像中 /app 树的内容,这意味着您的测试设置没有测试它构建的图像。

  2. 您的 pip install 命令会在主机的 Python 环境中安装其他软件包,但这些软件包在 Docker 容器内不可见。

  3. 每个docker-compose run命令都会启动一个带有新临时文件系统的新容器,因此在docker-compose run覆盖之后,临时容器文件系统覆盖率报告是否丢失。

对于基本的测试覆盖率指标,希望您的单元测试设置对于在 Docker 中运行、部署在不同的路径上或来自不同的开发人员工作站不是特别敏感。我成功使用的设置是在 Docker 外部运行单元测试和代码覆盖等操作,并且仅将构建和发布 Docker 镜像作为最后一步。虽然针对构建的镜像运行一些集成测试是值得的,但您应该能够从 Docker 外部驱动这些测试,而不需要对镜像本身进行任何更改。

如果从 Docker 内部运行这些测试对您来说很重要,您需要将这些仅用于开发的工具添加到您的生产镜像中,或者执行所有操作(安装额外的工具、运行测试并提取结果)一个 docker-compose run 命令。一行代码可能看起来像

docker-compose run \
  -v $PWD:/coverage \
  sh -c 'pip install coverage && COVERAGE_FILE=/coverage/.coverage coverage run --source=. manage.py test'

您还可以将其分解为一个脚本,该脚本可以复制或绑定(bind)安装到您的容器中

docker-compose run -v $PWD:/coverage /coverage/cov-pytest

这可能更易于维护并且更容易手动测试。

关于django - 工作服 : Error- No source for in my application using Docker container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938496/

相关文章:

python - Django 模型 self._meta.get_all_field_names() 返回的字段不在我的模型中?

python - requests.exceptions.ConnectionError : HTTPConnectionPool(host ='127.0.0.1' , 端口 = 8000):超过最大重试次数,网址:/api/1/

php - 如何使用 NGINX 在 docker 中设置动态子域

mysql - Spring Boot 和 MySql - 无法使用新的服务数据库用户名/密码

docker - 找不到 : http-01 when set up docker registry with lets encrypt? 的求解器

java - Elasticsearch 因 NoNodeAvailableException 而失败

mysql - Sf3 Docker-compose : [2002] Connection refused

javascript - Django : Display image example jquery not working - Uncaught Reference Error

php - 为什么我的 Docker Symfony 项目消耗这么多内存?

python - 如何从 django (python) 中的日期中删除 '0' ?