createprocess失败代码2_pytest文档57单元测试代码覆盖率(pytestcov)

前言

我们在做测试的时候,经常遇到领导的灵魂拷问:你的测试用例覆盖率是多少,达到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 - 银行卡被冻结

实现代码

# pay.py
'''
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
接口返回格式
{"code": 0,"msg": "success!","data": []
}错误码参照
0 - 成功
30000 - 参数错误
30001 - 余额不足
30002 - 达到当天最大额度
201102 - 银行卡被冻结
'''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放同一个项目的根目录下

acd0956cc8217df81da74d83be1d670c.png

用例设计

在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 itemtests\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 anysource 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=CONTEXTDynamic contexts to use. "test" for now.

生成html的报告

pytest —cov —cov-report=html

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

02e1d619a152d484ace8ac91cd67ffcf.png

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

4bd26e422ac57e419eeb2d3ba9bbdfc5.png

点开src\pay.py

94b032167543e764de36e0b127cccd16.png

想覆盖率达到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 itemtests\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

2020年第五期《python接口自动化+测试开发》课程,10月11号开学(火热报名中!)本期上课时间:10月11号-1月3号,每周六、周日晚上20:30-22:30联系微信/QQ:283340479

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java包名和类名可以一样吗_Java入门第三课:Java基本语法

Java基础编写Java程序时,应注意以下几点:1.大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。有些操作系统不区分大小写,不区分的话,文件名是不完全正确的。 然而,如果你的…

C语言入门精髓

上篇说到了C语言还是很基础的编程语言,还是值得去学,那么怎么去学?什么人才能学好?为什么学到一半就早早缴械投降了?众多迷雾,众多的困难,怎么破局? 如有小伙伴想学习C语言基础&…

python 取余_玩转Python源码(一) quot;%squot;与“%d”

某一天吹水的时候,吹着吹着就吹到了一下这么一个案例。import timeitdef a():"%s, %s" % (1, 2)def b():"%s, %d" % (1, 2)def c():"%d, %d" % (1, 2)t timeit.timeit(stmt"a()", setup"from __main__ import a&quo…

笔刷怎么做_原来是这样:用PS笔刷做出颜料肌理效果!

题图插画 | TX灼灼“当我意识到可以利用PS的某些工具,设置不同的画笔之后,一切都变了。有些看起来很不合逻辑的组合,最后产生的效果却是逼真的惊人,再结合合适的形状就能创作出特别又新奇的东西。”——自制笔刷收入超10万美元的插…

qt 3d迷宫游戏_机械迷宫—一款机械风格的3D立体解谜独立游戏

解谜游戏一直是游戏类别中的一个大类,这里面各式各样的解密游戏,多不胜数。解密游戏又分很多种类,比如动作冒险新式的解密游戏,文字图像类型的解密游戏;游戏制作上有大有小,但是都有一个共同特点&#xff0…

Ubuntu下的Linux内核的编译及安装

推荐群:C/C大学技术协会:145655849 Linux中的模块(Modules) Linux的module其实可以看作是内核的插件。 在Linux系统中,可以通过文件 cat /proc/modules xxxxxxxxxx1 1cat /proc/modules 查看相关的驱动模块。 也可以通过命令 l…

执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!

对于很多人来说,没有精确计算食物重量的条件,无法每天花费大量的时间精力去自己准备健康的食物,给大家一个不需要食物称,只要在日常饮食基础上看看自己的手掌就能通过类比来选择好食物的种类和合适比例的方法!碳水化合…

apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了

目录回顾昨日nacos 集成Spring Cloud Alibaba 方式Nacos Spring Boot 方式Apollo 集成自研配置中心对接无配置中心对接实现源码分析兼容 Apollo 和 Nacos NoClassDefFoundErrorApollo 自动刷新问题回顾昨日上篇文章 《一时技痒,撸了个动态线程池,源码放 …

c语言 把字符串转换为变量名_如何将抓取下来的unicode字符串转换为中文

如果抓取的数据是json数据,那么直接将抓取的数据用json格式输出出来就行了。如下:response requests.get(url, headersself.headers).json()如果是unicode字符串,那么请继续往下看大家有没有遇见抓取下来的数据是unicode字符串的?如下图所示…

c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升

一、操作目的和应用场景Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独…

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

家装强电弱电布线图_家装水电施工标准(图文版),装修小白一眼也能看懂。...

如果把家比喻成一个人,房子是骨骼,那么水电路则相当于人体的血管和动脉,正因为他们的存在,才赋予家鲜活的生命。由此,水电施工自然也成为家装工程的重中之重。水电走线原则※ 水电弹线放样施工,使用切割机开…

0基础必看:如何轻松成为C语言高手

诞生于上世纪70年代的C语言是一门古老的语言了, 但作为一门底层语言,时至今日它仍然非常强大。学习C语言能够为学习其他更复杂的语言打下良好的基础,因为你在C语言中学习到的知识对几乎所有的编程语言都适用。下面就来看看如何开始用C语言编程吧。   工具   Mic…

python列表元素之和_python实现计算列表元素之和

目标:定义一个数字列表,并计算列表元素之和。 例如: 输入 : [12, 15, 3, 10] 输出 : 40 方法一:total 0 list1 [11, 5, 17, 18, 23] for ele in range(0, len(list1)): total total list1[ele] print("列表元素之和为: &…

双水泵轮换工作原理图_一用一备式冷凝水泵应急电源的设计与实现

为保障山西通州集团兴益化工有限公司10万吨甲醇工程一用一备式冷凝水泵的安全运行,专门设计动力负载应急电源。作者阐述了动力负载应急电源基本原理及其控制系统设计,经现场调试运行,动力负载应急电源很好满足生产现场要求。山西通州集团兴益…

基础学习——C语言递归解决分鱼问题

如有小伙伴想学习C语言基础,可以进群731871503进行交流学习,提升编程,共同进步 问题描述 A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时&#xff0…

memkind版本查看_不同价位值得买轻薄本推荐~2020国庆篇

说起轻薄本,你理想中的一台优秀机型是什么样的?轻薄便携、质感上乘、高颜值、逼格、手感佳、续航持久、屏幕素质高、独立小键盘、性能激进……和游戏本的鲜明对比,注定了是两种不同的“菜”。2020年,随着AMD的崛起,部分…

main方法 如何去掉http debug日志_在MyBatis中如何使用collection标签实现嵌套查询?...

# 需求升级在上篇博客《一对多的关系,在MyBatis中如何映射?》中,我们实现了需求:根据用户id查询用户信息的同时获取用户拥有的角色。因为角色可以拥有多个权限,所以本篇博客我们升级需求为:根据用户id查询用…

movielens推荐系统_案例|推荐系统的评估指标

推荐系统能够为用户提供个性化体验,现在基本上各大电商平台、资讯平台都会用推荐系统为自家评价下的用户提供千人千面的服务。平均精度均值(Mean Average Precision,MAP)便是评估推荐系统性能的度量标准之一。但是,使用…

mysql群集配置_CentOS7 - 建立一个MySQL集群

Standing up a MySQL cluster此配方将指导您完成设置MySQL群集的过程。 通过跨多个系统划分数据并维护副本以避免单点故障,群集数据库可以应对可伸缩性和高可用性的挑战。集群的成员称为节点。 MySQL集群中有三种节点类型:数据节点,API节点和…