我在另一篇的文章 gitlab ci/cd 服务自动化探索 - 简书介绍了我对ci/cd的探索,这次我来分享一下关于测试报告及覆盖率在gitlab项目的集成, 这个对一个管理者来说这是个极其方便的检查代码工覆盖率的工具,同时也是一个程序员很好的自我修行的体现。
我们先来看一下效果, 这个是一个项目的readme文件,我们很容易看到现在的代码覆盖率
我们在看看测试报告, 这里我为了安全就不打开相关网页了
这里我们会在index.html看到每个文件的测试覆盖率和总的覆盖率
在我们看完效果之后我们开始教程, 因为在 gitlab ci/cd 服务自动化探索 - 简书中我详细介绍过gitlab中.gitlab-ci的写法,这里我就不详细写了, 首先在项目中安装cover
pip install coverage
这是官方教程Coverage.py — Coverage.py 4.5.2 documentation
我们主要使用这个命令生成整个测试报告
coverage html
这是.gitlab-ci文件,详细注释
variables:
...
stages:
- build
- test
- deploy
build:
stage: build
tags:
- dev
script:
- docker build -t "${IMAGE_NAME}:lastest" .
- docker image tag "${IMAGE_NAME}:lastest" "${IMAGE_NAME}:$CI_COMMIT_SHA"
- docker push "${IMAGE_NAME}:lastest"
- docker push "${IMAGE_NAME}:$CI_COMMIT_SHA"
test:
stage: test
tags:
- dev
variables:
test_log_dir: "/data/logs/"
profile_path: "/data/app/profile/test.env"
postgres_name: "test_postgres"
LOG_DIR: "/data/logs/"
name: test
port: "654"
postgres_port: "653"
before_script:
- docker stop "${postgres_name}" && docker rm "${postgres_name}" || true
- docker stop "${name}_1" && docker rm "${name}_1" || true
script:
- docker run -d -p "${port}:8000" -v $LOG_DIR:$test_log_dir --name "${name}_1" --env-file "${profile_path}" "${IMAGE_NAME}:${CI_COMMIT_SHA}"
- sleep 3
# - docker exec -i "${monitor_name}_1" python manage.py test
# - docker stop "${monitor_name}_1" && docker rm "${monitor_name}_1" || true
- docker exec -i "${monitor_name}_1" coverage run --source='.' manage.py test
- docker exec -i "${monitor_name}_1" coverage report -m
- docker exec -i "${monitor_name}_1" coverage html # 我们在容器中生成了htmlcov
- docker cp "${monitor_name}_1":/code/htmlcov ./ # 将htmlcov拷贝到宿主机, 这里是因为我们使用的是shell, gitlab-runner是在宿主机上
- mv htmlcov public # 重命名一下
coverage: '/^TOTAL\s+\d+\s+\d+\s+(\d+\%)$/' # 这里的正则匹配这个覆盖率的值
artifacts:
paths:
- public # 这里是将public文件夹上传
expire_in: 7 day # 这里表示文件暂存7天
在.gitlab-ci配置完成之后我们要在readme中的添加markdown的代码
gitlab会在项目中ci/cd配置中给出提示, 有三种格式, 分别是markdown、html、asciidoc
这里标注一下
[![pipeline status](<gitlab域名>/<组>/<项目>/badges/<分支>/pipeline.svg?job=<job名>)](。。。)
到此结束