【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率

单元测试(unit test),简称UT。本文将介绍在Python项目中,pytest测试框架的安装,配置,执行,测试报告与覆盖率

pytest简介

在这里插入图片描述
pytest是一款流行的,简单易上手的单元测试框架,让开发&测试人员专注业务逻辑。
同时pytest有丰富的第三方扩展库,方便生成报告,输出UT覆盖率,支持快速高效的分布式执行。

安装

pytest pypi
pytest-html
pytest-cov
pytest-xdist
更多好用好玩的扩展库,本文将持续更新中……

pip install pytest
pip install pytest-html  # 生成html格式UT报告 
pip install pytest-cov   # 覆盖率
pip install pytest-dist  # 分布式执行UT

# 更新第三方库
pip install pytest -U
pip install pytest-html -U
pip install pytest-cov -U
pip install pytest-dist -U

可行的目录结构

Project
	ModuleA
	ModuleB
	pytest.ini        # pytest测试框架配置文件
	.coveragerc       # 覆盖率配置文件
	unit_test
		__init__.py   # 必须要有   
		conftest.py   # pytest 测试套等文件
		test_xx.py

配置

PyCharm默认pytest测试框架

中文: 设置 --> 工具 --> Python集成工具 --> 测试 --> 默认测试运行程序: 选择pytest
在这里插入图片描述
英文: Settings --> Tools --> Python Integrated Tools --> Testing --> Default test runner:pytest
在这里插入图片描述

pytest.ini

# Project pytest.ini

[pytest]
# 测试用例文件搜索的目录
testpaths = ./tests

# 定义测试标记
markers = 
	slow: mark test as slow
 
# 测试用例文件的命名规则
python_files = test_*.py
 
# 测试函数的命名规则
python_classes = Test
python_functions = test
 
# 在控制台输出中展示更多的信息 此处 --cov 会导致PyCharm断点调试失败
addopts = -v 
 
# 标记一个测试用例为失败
xfail_strict = true
 
# 在测试结果中包含原因和语句
setupshow = call, reason, short

# 指定忽略的目录
norecursedirs = .git venv

pytest.ini避坑

pytest.ini options中配置了 --cov 覆盖率相关的命令,会导致PyCharm中 单元测试用例断点调试失败。
本地开发测试中,pytest.ini中切勿配置!!!

conftest.py

conftest.py是pytest测试框架中特有的文件,可以在此文件中写一些fixture的测试套。
可以写一些前置或后置的测试套,例如连接数据库,初始化环境,或者扫尾的操作。
fixture中声明的函数,测试脚本中可以直接引用,不需要导入, 实现数据共享等
注意点:

  • conftest.py 此文件名称是固定的,不能修改
  • conftest.py必须与运行的测试用例要在同一个package下,并且要有__init__.py
  • 在使用时不需要手动import导入conftest.py,pytest在测试用例执行时会自动去conftest.py文件中查找fixture
  • 一个项目下可以有多个conftest.py文件,一般在项目根目录下放一个conftest.py文件起到全局作用;在不同的目录下都可以放置conftest.py文件,作用范围只在该层级以及以下目录生效
# unit_test/conftest.py

# -*- coding: utf-8 -*-

import pytest

# 默认执行, 优先度高
# 例如 可以 将文件路径添加到 sys.path


@pytest.fixture(scope="session")  # scope范围: session > module > class > function
def handler():
	do_something_pre()
	
	yield

	do_something_post()


from your_database_module import create_connection


# fixtures将在测试会话开始时自动检测并可供所有测试文件使用。
#scope="session" 参数表示该fixture的生命周期是整个测试会话期间,因此数据库连接只会创建一次,所有测试都可以共享这个连接 
@pytest.fixture(scope="session")
def db_connection():
    """
    创建数据库连接的fixture
    """
    connection = create_connection("your_database.db")
    yield connection  # 测试函数可以使用connection
    connection.close()  # 测试后关闭连接


@pytest.fixture
def shared_data():
	# 模拟获取共享数据的过程
	data = {
		"key1": "value1",
		"key2": "value2"
	}
	return data
# unit_test/test_xx.py

import pytest
 
def test_database_connection(db_connection):  # conftest.py中已经声明db_connection, 无需导入
    assert db_connection is not None
    # 这里可以进行数据库相关的测试

def test_function(shared_data):  # conftest.py中已经声明shared_data, 无需导入
	# 使用共享数据
	assert shared_data["key1"] == "value1"
	assert shared_data["key2"] == "value2"

.coveragerc

覆盖率配置文件,放在unit_test同级目录, 命令行执行覆盖率统计后,报告在htmlcov目录中。
此配置文件中,可以配置
- 覆盖率统计的代码源目录,
- 忽略的脚本(支持正则写法),
- 忽略的代码行(支持正则写法)。

# .coveragerc

[run]
# 分支
branch = True
# 目录路径
source = .

# 忽略覆盖率统计的文件(夹)
omit =
	unit_test/* 
	# 更多其他不需要统计的文件(夹)
 
[report]
exclude_lines =
    # 以下是一些常见的Python库和测试框架的代码不计算在覆盖率内的行
    ^def __repr__
    ^class .*Test$
    ^if __name__ == .__main__.:
 
    # 你可以根据需要添加更多的排除模式

执行UT

命令行执行

命令行中命令可以配置到 pytest.iniaddopts后,其中 --cov 不建议配置

# -n 分布式执行的线程数量,需要小于系统核数。 例如: -n 7
# --html  指定UT报名的名称
# --self-contained-html 生成单个html文件,包含css样式等
# --cov 执行覆盖率统计,后面可以指定名称,也可以不指定。 指定: --cov=projectName
# --cov-config=.coveragerc 指定配置文件
# --cov-report=html 输出html格式报告
# ubit_test\ UT用例路径

pytest -n 7 --html=report.html --self-contained-html --cov --cov-config=.coveragerc --cov-report=html unit_test\

PyCharm右键执行

右键执行,支持 运行 调试
光标的位置,决定是运行单个测试用例/单个测试类/整个单元测试文件
在这里插入图片描述

测试报告report.html

生成的报告中,会显示通过/失败的测试用例。
单击行 可以折叠/打开 用例执行信息
在这里插入图片描述

覆盖率报告 htmlcov/index.html

覆盖率会显示全部覆盖率/某个单元测试文件(夹)的覆盖率,涉及合计/执行、未执行/忽略的行等信息
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三次样条插值算法及推导过程

目录 1、定义 2、已知条件求解 3、具体推导 4、matlab案例 5、案例结果 6、matlab仿真 1、定义 给定 n 1 n1 n1个数据点,共有 n n n个区间,三次样条方程 S ( n ) S(n) S(n)满足以下条件:在每个分段区间内 ( x i , x i 1 ) (x_i,x_{i1}) (…

C#与C++结构体的交互

C#在和C进行交互时,有时候会需要传递结构体。 做一些总结,避免大家在用的时候踩坑。 一般情况 例如我们在C里定义了一个struct_basic结构体 1 struct struct_basic 2 { 3 WORD value_1; 4 LONG value_2; 5 DWORD value_3; 6 UINT v…

Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域

在之前的 3.10 里, Flutter 的 Impeller 在 iOS 上支持了 P3 广色域图像渲染,但是当时也仅仅是当具有广色域图像或渐变时,Impeller 才会在 iOS 上显示 P3 的广色域的颜色,而如果你使用的是 Color API,会发现使用的还是…

Android平台RTSP转RTMP推送之采集麦克风音频转发

技术背景 RTSP转RTMP推送,好多开发者第一想到的是采用ffmpeg命令行的形式,如果对ffmpeg比较熟,而且产品不要额外的定制和更高阶的要求,未尝不可,如果对产品稳定性、时延、断网重连等有更高的技术诉求,比较…

【十九周】文献阅读:图像识别的深度残差学习

目录 摘要Abstract图像识别的深度残差学习研究背景研究动机解决办法Residual LearningShortcut Connections网络结构 实验结果代码实践论文原文总结 摘要 在之前对神经网络的基础学习中,师兄推荐了我去了解一下 ResNet。因此本周对 ResNet 的开山之作—Deep Residu…

MATLAB/Simulink学习|在Simulink中调用C语言-01使用C Function 实现比例运算

前面的博客中,提到如果想将Simulink仿真推进至硬件实验,需要将积木式的仿真搭建,变换成C语言实现,那么如何在Simulink中验证C代码的正确性呢?我将一边学习,一边更新,一边比较不同方法实现C语言&…

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代,光学字符识别是一个重要的信息录入与信息转化的手段,其中手写体数字的识别有着广泛地应用,如:邮政编码、统计报表、银行票据等等,因其广泛地应用范围…

分享一个免费的网页转EXE的工具

HTML2EXE是一款在Windows系统下将Web项目或网站打包成EXE执行程序的免费工具。这款工具能够将单页面应用、传统HTMLJavaScriptCSS生成的网站、Web客户端,以及通过现代前端框架(如Vue)生成的应用转换成独立的EXE程序运行。它支持将任何网站打包…

ubuntu安装与配置Nginx(2)

1. 配置 Nginx Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,而虚拟主机的配置文件通常在 /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/ 目录中。 在/etc/nginx/conf.d目录下新建xx.conf文件,配置文件, nginx -t 检查语法…

C++_day2

目录 1. 引用 reference(重点) 1.1 基础使用 1.2 特性 1.3 引用参数 2. C窄化(了解) 3. 输入(熟悉) 4. string 字符串类(掌握) 4.1 基础使用 4.2 取出元素 4.3 字符串与数字转换 5. …

JAVA WEB — HTML CSS 入门学习

本文为JAVAWEB 关于HTML 的基础学习 一 概述 HTML 超文本标记语言 超文本 超越文本的限制 比普通文本更强大 除了文字信息 还可以存储图片 音频 视频等标记语言 由标签构成的语言HTML标签都是预定义的 HTML直接在浏览器中运行 在浏览器解析 CSS 是一种用来表现HTML或XML等文…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录功能设计

24.11.03 1.修改项目目录 从今天开始将正式进行功能的设计,首先需要对原来的项目结构进行修改,主要是添加新的文件夹用于存放新的文件。下面进行展示和讲解: 我用红圈圈出了新添加的文件夹,介绍下它们都是干啥的: da…

动态库实现lua网络请求GET, POST, 下载文件

DLL需要使用的网络封装 WinHttp异步实现GET, POST, 多线程下载文件_webclient post下载文件-CSDN博客文章浏览阅读726次。基于WinHttp封装, 实现异步多线程文件下载, GET请求, POST请求_webclient post下载文件https://blog.csdn.net/Flame_Cyclone/article/details/142644088…

unet中的attn_processor的修改(用于设计新的注意力模块)

参考资料 文章目录 unet中的一些变量的数据情况attn_processorunet.configunet_sd 自己定义自己的attn Processor ,对原始的attn Processor进行修改 IP-adapter中设置attn的方法 参考的代码: 腾讯ailabipadapter 的官方训练代码 unet中的一些变量的数据…

深度学习基础—序列采样

引言 深度学习基础—循环神经网络(RNN)https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshareblogdetail&sharetypeblogdetail&sharerId143417972&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link …

Qt中的Model与View5: QStyledItemDelegate

目录 QStyledItemDelegate API 重载公共函数 保护函数 重载保护函数 当在 Qt 项目视图中显示模型数据时,例如 QTableView,每个项目由代理绘制。此外,当项目被编辑时,提供一个编辑器小部件,该小部件在编辑时显示在项…

AI打造超写实虚拟人物:是科技奇迹还是伦理挑战?

内容概要 在这个科技飞速发展的时代,超写实虚拟人物仿佛从科幻小说中走进了我们的日常生活。它们以生动的形象和细腻的动作,不仅在影视、广告和游戏中吸引了无数目光,更让我们对AI技术的未来充满了期待和疑惑。这些数字化身在逼真的外貌下&a…

海浪中的记忆:海滨学院班级回忆录开发

3系统分析 3.1可行性分析 通过对本海滨学院班级回忆录实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本海滨学院班级回忆录采用SSM框架,JAVA作为开…

文本串的应用(1)

一、文本串的加密解密操作 一个文本串可用事先给定的字母映射表进行加密。 例如,假设字母映射表为: a b c d e f g h i j k l m n o p q r s t u v w x y z n g z q t c o b m u h e l k p d a w x f y i v r s j 则字符串“encrypt”被加密为“tkz…