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

news2024/11/5 10:15:01

单元测试(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

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

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

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

相关文章

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

练习LabVIEW第三十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十八题&#xff1a; 创建一个VI&#xff0c;实现对按钮状态的指示和按钮“按下”持续时间简单计算功能&#xff0c;按…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA&#xff0c;现在准备写窗帘控制组件&#xff0c;构想的东西会比较多&#xff0c;估计有些难度&#xff0c;过程会比较长&#xff0c;边写边记录吧&#xff01; #设备和场景环境# 使用的是Novo的电机&#xf…

Linux脚本数组与字符串

文章目录 打印数组与长度数组遍历数组赋值下标索引访问切片追加()删除关联数组(像map)字符串字符拼接截取子串字符串长度字符串替换模式匹配截取分割字符串大小写转换 打印数组与长度 ${arrayName[*]} 打印数组${arrayName[]} 打印数组${#arrayName[*]} 打印数组长度${#arrayN…

闯关leetcode——3289. The Two Sneaky Numbers of Digitville

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/the-two-sneaky-numbers-of-digitville/description/ 内容 In the town of Digitville, there was a list of numbers called nums containing integers from 0 to n - 1. Each number was suppos…

#Jest进阶知识:整合 webpack 综合练习

这一小节&#xff0c;我们来做一个综合的练习&#xff0c;该练习会整合&#xff1a; typescriptwebpackjest 准备工作 首先创建项目目录&#xff0c;通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发&#xff0c;因此需要安装 typescript npm i t…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验

文章目录 引言一、鸿蒙原生应用的高效开发二、用户隐私保护&#xff1a;安全访问管理三、开发者实用工具&#xff1a;应用分析与A/B测试四、应用审核与分发&#xff1a;快速上线4.1 应用加密&#xff1a;保护代码安全4.2 自动化测试与检测前移&#xff1a;提升应用质量 五、结语…

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…

虚拟化环境中的精简版 Android 操作系统 Microdroid

随着移动设备的普及和应用场景的多样化&#xff0c;安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid&#xff0c;是一个专为虚拟化环境设计的精简版Android操作系统&#xff0c;旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能…

手动搭建 Java Web 环境

操作场景 本文档介绍如何在 Linux 操作系统的腾讯云云服务器&#xff08;CVM&#xff09;上手动搭建 Java Web 环境。 进行手动搭建 Java Web 环境&#xff0c;您需要熟悉 Linux 命令&#xff0c;例如 CentOS 环境下通过 YUM 安装软件 等常用命令&#xff0c;并对所安装软件使…

WPF+MVVM案例实战与特效(二十四)- 粒子字体效果实现

文章目录 1、案例效果2、案例实现1、文件创建2.代码实现3、界面与功能代码3、总结1、案例效果 提示:这里可以添加本文要记录的大概内容: 2、案例实现 1、文件创建 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 ParticleWindow.xaml,在 Models 文件夹下创建粒子…

「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制

高级动画可以显著提升用户体验&#xff0c;为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画&#xff0c;包括弹性动画、透明度渐变和旋转缩放组合动画等示例。 关键词 高级动画弹性缓动自动动画缓动曲线 一、Animation 组件的高级缓动曲线 缓动曲线&#…

Golang--数组、切片、映射

1、数组 1.1 数组类型 var 数组名 [数组大小]数据类型 package main import "fmt"func main(){//1、定义一个数组var arr1 [5]intarr1[0] 100arr1[1] 200fmt.Println(arr1) //[100 200 0 0 0] } 1.2 数组的初始化方式 package main import "fmt" func …

Android音频进阶之PCM设备创建(九十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

【已解决】C# NPOI如何设置单元格格式

前言 设置单元格格式我们做表格必须要的一步&#xff0c;那么如何对单元格进行设置呢&#xff1f;直接上图看看效果图先&#xff0c;我做的是一个居中然后字体变化的操作&#xff0c;其他的查他的手册即可。 解决方法 直接上代码 IWorkbook excelDoc new XSSFWorkbook();…

系统学习算法:专题一 双指针

题目一&#xff1a; 算法原理&#xff1a; 首先我们可以对这道题目进行题目分类&#xff0c;像这种对数组以某种标准而进行一定的划分的题目&#xff0c;我们统称为数组分块问题&#xff0c;其中使用到的算法就是双指针算法&#xff0c;这里的指针并非真正int*这种&#xff0c…

Python异常检测 - LSTM(长短期记忆网络)

系列文章目录 Python异常检测- Isolation Forest&#xff08;孤立森林&#xff09; python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子&#xff08;LOF&#xff09;算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

【双指针】【数之和】 LeetCode 633.平方数之和

算法思想&#xff1a; 双指针枚举i,j&#xff1b;类似三数之和 class Solution { public:bool judgeSquareSum(int c) {long long sum0;vector<int> dp;dp.push_back(0);long long start1;while(sum < c){sum start *start;if(sum>c) break;else dp.push_back(…

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…