获取使用tavern编写的Django项目的单元测试覆盖率

221 阅读1分钟

公司项目使用Django开发的项目,单元测试按照tavern语法要求,编写了所有接口的单元测试,放在项目的tests目录下,且都是以test_xxx.tavern.yaml格式存在。

项目结构如下:

djproject
├── tests
│  ├── all.html
│  ├── assets
│  │   └── style.css
│  ├── conftest.py
│  ├── getcoverage.sh
│  ├── __init__.py
│  ├── integration
│  │   ├── includes.yaml
│  │   ├── log_spec.yaml
│  │   ├── OK.txt
│  │   ├── test_01_init_gets.tavern.yaml
│  │   ├── test_02_data_post.tavern.yaml
│  │   ├── testfile.txt
│  │   └── utils.py
│  └── logging.yaml
├── appone
│   ├── admin.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── urls.py
│   └── views.py
├── __init__.py
├── .coveragerc
├── manage.py
├── apptwo
│   ├── admin.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── urls.py
│   └── views.py
├── pylintrc
├── pytest.ini
├── requirements-test.txt
├── requirements.txt
└── djproject
    ├── asgi.py
    ├── __init__.py
    ├── routing.py
    ├── settings
    ├── urls.py
    └── wsgi.py

执行单元测试相对比较简单

  • 启动django项目
python manage.py runserver --noreload 0.0.0.0:8001  --settings=djproject.settings.test
  • 执行单元测试,需要安装以下依赖包
pytest==7.1.2
tavern==1.23.1
pytest-html==2.1.1
coverage==6.4.1

在项目的根目录下,执行

pytest -vv tests --html=all.html

pytest的配置信息 pytest.ini

[coverage:run]
omit =
    tests/*
    .eggs/*
    setup.py
    venv/*
    build/*
    dist/*

source = .

[pytest]
testpaths=djproject tests/integration
addopts =
    --doctest-modules
    -r xs
    -vv
    --strict-markers
    -p no:logging
    --tb=short
norecursedirs =
    .git
    .tox
    .pytest_cache

通过上述步骤,可以验证所有单元测试是否执行成功,这是获取覆盖率的前提,当然上述方式是无法获取到覆盖率的。

  1. 编写配置coverage的配置(.coveragerc)信息
[run]
branch = True
source = vuserver
omit = *migrations*, *venv*, .tox, manage.py, *settings*
[report]
show_missing = False
skip_covered = False
[paths]
djproject = .

注意: skip_covered = False 才能统计到所有的代码,如果为True,那么没有覆盖到的代码就不会出现在统计覆盖率的结果中了。

  1. 启动服务和运行单元测试
  • 启动服务
coverage run --source=../djproject --rcfile=.coveragerc --data-file=.coveragedata \
manage.py runserver --noreload 0.0.0.0:8001  --settings=djproject.settings.test &
  • 运行单元测试
pytest -vv tests --html=./tests/all.html

3.等到执行完单元测试,获取覆盖率和报告

  • django项目正常运行中,获取去覆盖率是无法获取到数据的,必须要优雅的结束服务程序,在程序中添加接口,实现调用 sys.exit(0)即可,可调用的url为 http://127.0.0.1:8001/app/shutdownapp/

  • 获取覆盖率和报告

coverage report --data-file=.coveragedata

coverage html --data-file=.coveragedata --directory=./htmlcov

通过上述步骤,便可以获取到覆盖率和覆盖率报告