我一直在尝试将代码覆盖率集成到我的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/
答案 0 :(得分:0)
您显示的测试设置中存在三个主要问题:
volumes:
文件中的docker-compose.yml
声明在图像中隐藏了/app
树的内容,这意味着您的测试设置未在测试其生成的图像
您的pip install
命令在主机的Python环境中安装了其他软件包,但在Docker容器内部看不到这些软件包。
每个docker-compose run
命令都会使用新的临时文件系统启动一个新容器,因此在docker-compose run coverage
之后,具有覆盖率报告的临时容器文件系统会丢失。
对于基本测试覆盖率指标,希望您的单元测试设置对于在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'
您还可以将其分解为一个脚本,该脚本可以复制或绑定安装到您的容器中
docker-compose run -v $PWD:/coverage /coverage/cov-pytest
这可能更易于维护,并且更易于手动测试。