前言

我们在做测试的时候,经常遇到领导的灵魂拷问:你的测试用例覆盖率是多少,达到100%了么?你如何保证你的测试质量?

测试用例的覆盖率如何统计呢,如何知道开发的代码,我们都测到了,不会存在漏测的情况。

pytest-cov

先命令行安装 pytest-cov 2.10.1版本

pip install pytest-cov==2.10.1

环境要求:

1.python3.6.6 版本

备注:其它版本没试过

python3.6.0会遇到以下问题

INTERNALERROR>raise CoverageException("Couldn't use data file {!r}:{}".format(self.filename, msg))
INTERNALERROR> coverage.misc.CoverageException: Couldn't use data file'C:\\Users\\Desktop\\Pytest\\.coverage':
Safety level may not be changed inside a transaction

解决办法:安装3.6.1以上版本

实现功能

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,

比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。

单元测试的方法有:语句覆盖/判定覆盖/条件覆盖/路径覆盖

先看一个简单的案例,前端实现一个功能,根据接口返回的不同code值,判断支付的结果,给用户返回提示友好的信息

前端实现功能:根据接口返回的不同code值,判断支付的结果,给用户返回提示友好的信息
接口返回格式:
{
"code": 0,
"msg": "success!",
"data": []
} 错误码参照
0 - 成功
30000 - 参数错误
30001 - 余额不足
30002 - 达到当天最大额度
201102 - 银行卡被冻结

实现代码


'''
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
接口返回格式
{
"code": 0,
"msg": "success!",
"data": []
} 错误码参照
0 - 成功
30000 - 参数错误
30001 - 余额不足
30002 - 达到当天最大额度
201102 - 银行卡被冻结
'''
# pay.py
def pay_status(result):
'''根据接口返回code状态,给用户提示对应的结果'''
if result.get("code") == 0:
return "支付成功"
elif result.get("code") == 30000:
return "支付失败: %s" % result.get("msg")
elif result.get("code") == 30001:
return "支付失败: %s" % result.get("msg")
elif result.get("code") == 30002:
return "支付失败: %s" % result.get("msg")
elif result.get("code") == 201102:
return "支付失败: %s" % result.get("msg")
else:
return "支付失败: 系统异常,未知错误"

整个项目目录结构如下

  • src 是项目的源码
  • tests 是我们写的单元测试用例
  • src和tests放同一个项目的根目录下

用例设计

在tests/test_pay.py下写测试用例,先只写一个支付成功的案例

from src.pay import pay_status
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/ def test_pay_success():
result = {
"code": 0,
"msg": "success!",
"data": []
}
assert pay_status(result) == "支付成功"

运行用例

运行用例的时候加上 --cov 参数

pytest --cov

运行结果

>pytest --cov
================================================= test session starts =================================================
platform win32 -- Python 3.6.6, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\soft\pytest-demo-cov
plugins: change-report-1.0, cov-2.10.1, html-1.19.0, metadata-1.8.0
collected 1 item tests\test_pay.py . [100%] ----------- coverage: platform win32, python 3.6.6-final-0 -----------
Name Stmts Miss Cover
---------------------------------------
src\__init__.py 0 0 100%
src\pay.py 13 9 31%
tests\__init__.py 0 0 100%
tests\test_pay.py 4 0 100%
---------------------------------------
TOTAL 17 9 47% ================================================== 1 passed in 0.10s ==================================================

从报告可以看出src\pay.py 的代码测试覆盖率是31%,其它文件都是100%覆盖,这就说明我们单元测试代码测试覆盖率是31%

还有一个指标是测试用例的执行率,测试用例在test_pay.py文件,执行率是100%,说明用例全部执行了。

coverage生成html报告

coverage 相关参数查看,使用pytest -h

> pytest -h
coverage reporting with distributed testing support:
--cov=[SOURCE] Path or package name to measure during execution (multi-allowed). Use --cov= to not do any
source filtering and record everything.
--cov-report=TYPE Type of report to generate: term, term-missing, annotate, html, xml (multi-allowed). term, term-
missing may be followed by ":skip-covered". annotate, html and xml may be followed by ":DEST"
where DEST specifies the output location. Use --cov-report= to not generate any output.
--cov-config=PATH Config file for coverage. Default: .coveragerc
--no-cov-on-fail Do not report coverage if test run fails. Default: False
--no-cov Disable coverage report completely (useful for debuggers). Default: False
--cov-fail-under=MIN Fail if the total coverage is less than MIN.
--cov-append Do not delete coverage but append to current. Default: False
--cov-branch Enable branch coverage.
--cov-context=CONTEXT
Dynamic contexts to use. "test" for now.

生成html的报告

pytest --cov --cov-report=html

执行完成,在项目根目录会生成 htmlcov 目录

运行 index.html 文件查看代码覆盖率

点开src\pay.py

想覆盖率达到100%,那得再继续写用例,让每个if分支情况都覆盖到

指定被测代码

如果我们想指定执行项目里面的某个模块,可以通过--cov=模块 来运行

pytest --cov=src

>pytest --cov=src
================================================= test session starts =================================================
platform win32 -- Python 3.6.6, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\soft\pytest-demo-cov
plugins: change-report-1.0, cov-2.10.1, html-1.19.0, metadata-1.8.0
collected 1 item tests\test_pay.py . [100%] ----------- coverage: platform win32, python 3.6.6-final-0 -----------
Name Stmts Miss Cover
-------------------------------------
src\__init__.py 0 0 100%
src\pay.py 13 9 31%
-------------------------------------
TOTAL 13 9 31% ================================================== 1 passed in 0.07s ==================================================

也可以指定具体的py模块名称

pytest --cov=src.pay

但不能写成pytest --cov=src/pay.py

pytest文档57-计算单元测试代码覆盖率(pytest-cov)的更多相关文章

  1. pytest文档7-计算单元测试代码覆盖率(pytest-cov)

    pytest-cov 先命令行安装 pytest-cov 2.10.1版本 pip install pytest-cov==2.10.1 环境要求:1.python3.6.6 版本备注:其它版本没试过 ...

  2. pytest文档7-pytest-html生成html报告

    前言 pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.github上源码地址[https://github. ...

  3. pytest文档3-pycharm运行pytest

    前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...

  4. pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)

    前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being mad ...

  5. pytest文档19-doctest测试框架

    前言 doctest从字面意思上看,那就是文档测试.doctest是python里面自带的一个模块,它实际上是单元测试的一种. 官方解释:doctest 模块会搜索那些看起来像交互式会话的 Pytho ...

  6. pytest文档1-环境准备与入门

    前言 首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的. 刚开始我的内心是拒绝的,我想我用unittes ...

  7. pytest文档56-插件打包上传到 pypi 库

    前言 pytest 的插件完成之后,可以上传到 github,方便其他小伙伴通过 pip 源码安装.如果我们想通过 pip install packages 这种方式安装的话,需上传到 pypi 仓库 ...

  8. pytest文档55-plugins插件开发

    前言 前面一篇已经学会了使用hook函数改变pytest运行的结果,代码写在conftest.py文件,实际上就是本地的插件了. 当有一天你公司的小伙伴觉得你写的还不错,或者更多的小伙伴想要你这个功能 ...

  9. pytest文档51-内置fixture之cache使用

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

随机推荐

  1. 蓝奏网盘CMD控制台

    LanZouCloud-CMD 2.0 基于蓝奏云API开发的CMD版蓝奏云控制台 Github : https://github.com/zaxtyson/LanZouCloud-CMD 更新说明 ...

  2. Azure技术系列之Redis篇---第一章数据缓存

    嘈杂和忙碌的生活占据占据了生活的每一天,好久没有静下心来对自己喜欢的技术进行归纳总结了.痛定思痛,今天开始开荒,把之前研究的技术进行归纳总结,先从Azure的Redis的开发技术开始. Azure 的 ...

  3. Tomcat +Nginx+Redis实现session共享

    一.准备工作 中间件:Tomcat.Redis.Nginx jar包:commons-pool2-2.4.2.jar.jedis-2.8.0.jar.tomcat-redis-session-mana ...

  4. TKE基于弹性网卡直连Pod的网络负载均衡

    前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...

  5. css的引用关系

    总结:离div标签越近,越先被引用 先在同级目录下新建一个stylesheet(是以.css结尾的)注意:link引入进来的css中,class标签也是c1,因为html中div class=c1,因 ...

  6. 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!

    最近有幸试用了一下阿里云的一个新产品:云开发平台,体验一把全新的开发模式!虽然中间也碰到了一些问题,但整体的体验透露着未来感,因为整个过程都不需要使用我们最常用的IDEA,仅依靠浏览器就把一个Spri ...

  7. ⏰ Moment.js 宣布停止开发,现在该用什么?

    本文整理自 Monent.js 官方英文公告 https://momentjs.com/docs/#/-project-status/ Moment.js 宣布停止开发,进入维护状态. 这是一个大而全 ...

  8. openstack共享组件——Memcache 缓存系统(4)

    云计算openstack共享组件——Memcache 缓存系统(4)   一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Netw ...

  9. openstack核心组件——nova计算服务(7)

    云计算openstack核心组件——nova计算服务(7)   一.nova介绍:       Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 ...

  10. react项目结合echarts,百度地图实现热力图

    一.最近在一个react项目(antd pro)中需要展示一个热力地图.需求是: 1.热力地图可缩放: 2.鼠标点击可以展示该点地理坐标,及热力值. 3.初始化时候自适应展示所有的热力点. 4.展示热 ...