公司项目使用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
通过上述步骤,可以验证所有单元测试是否执行成功,这是获取覆盖率的前提,当然上述方式是无法获取到覆盖率的。
- 编写配置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,那么没有覆盖到的代码就不会出现在统计覆盖率的结果中了。
- 启动服务和运行单元测试
- 启动服务
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
通过上述步骤,便可以获取到覆盖率和覆盖率报告