pytest,一个强大的 Python 库!(pytest-parallel)
itomcoil 2025-07-06 12:57 2 浏览
大家好,今天为大家分享一个强大的 Python 库 - pytest。
Github地址:https://github.com/pytest-dev/pytest
pytest是Python生态系统中最受欢迎的测试框架之一,由Holger Krekel开发并持续维护。作为第三方测试框架,pytest以其简洁的语法、强大的功能和丰富的插件生态系统而备受开发者青睐。该框架不仅支持简单的单元测试,还能处理复杂的功能测试和集成测试场景。
安装
1、安装方法
通过pip包管理器可以快速安装pytest框架:
pip install pytest
如需安装特定版本或包含额外功能的pytest:
pip install pytest
pip install pytest[testing]
2、验证安装
安装完成后,可以通过命令行验证pytest是否正确安装:
pytest --version
同时可以创建一个简单的测试文件验证功能:
# test_demo.py
def test_simple():
assert 1 + 1 == 2
def test_string():
assert "hello".upper() == "HELLO"
运行测试命令:
pytest test_demo.py
特性
- 简洁的测试语法:使用简单的assert语句进行断言,无需记忆复杂的断言方法,测试代码更加直观易读。
- 自动测试发现:能够自动发现和执行符合命名规范的测试文件和测试函数,减少了配置工作量。
- 丰富的插件生态:提供数百个官方和第三方插件,支持代码覆盖率分析、并行测试、报告生成等功能。
- 灵活的测试配置:支持多种配置方式,包括命令行参数、配置文件和环境变量,适应不同的测试需求。
- 强大的fixture机制:提供依赖注入功能,实现测试数据准备、资源管理和测试环境隔离。
基本功能
1、基础测试编写
pytest的核心优势在于其简洁的测试编写方式。开发者只需使用标准的assert语句即可完成测试断言,无需导入特殊的测试类或方法。
# test_calculator.py
def add(a, b):
return a + b
def test_add_positive_numbers():
result = add(3, 5)
assert result == 8
def test_add_negative_numbers():
result = add(-2, -3)
assert result == -5
def test_add_mixed_numbers():
result = add(-1, 1)
assert result == 0
2、参数化测试
参数化测试是pytest的重要功能,允许使用不同的输入参数多次执行同一个测试函数。通过pytest.mark.parametrize装饰器,可以定义多组测试数据,框架会自动为每组数据生成独立的测试用例。
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(100, 200, 300),
])
def test_add_parametrized(a, b, expected):
assert add(a, b) == expected
@pytest.mark.parametrize("input_str,expected", [
("hello", "HELLO"),
("world", "WORLD"),
("", ""),
("123", "123"),
])
def test_string_upper(input_str, expected):
assert input_str.upper() == expected
3、异常测试
pytest提供了pytest.raises上下文管理器,专门用于测试代码是否能够正确抛出预期的异常。
import pytest
def add(a, b):
return a + b
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(100, 200, 300),
])
def test_add_parametrized(a, b, expected):
assert add(a, b) == expected
@pytest.mark.parametrize("input_str,expected", [
("hello", "HELLO"),
("world", "WORLD"),
("", ""),
("123", "123"),
])
def test_string_upper(input_str, expected):
assert input_str.upper() == expected
高级功能
1、Fixture机制
Fixture是pytest的核心特性之一,提供了强大的依赖注入和资源管理能力。通过fixture,可以在测试执行前准备测试数据,在测试完成后清理资源。
import pytest
import tempfile
import os
@pytest.fixture
def sample_data():
"""提供测试数据"""
return {
"users": ["Alice", "Bob", "Charlie"],
"scores": [85, 92, 78]
}
@pytest.fixture
def temp_file():
"""创建临时文件"""
fd, path = tempfile.mkstemp()
yield path
os.close(fd)
os.unlink(path)
def test_data_processing(sample_data):
users = sample_data["users"]
scores = sample_data["scores"]
assert len(users) == len(scores)
assert max(scores) == 92
def test_file_operations(temp_file):
# 写入测试数据
with open(temp_file, 'w') as f:
f.write("test content")
# 验证文件内容
with open(temp_file, 'r') as f:
content = f.read()
assert content == "test content"
2、标记和跳过测试
pytest提供了灵活的测试标记和跳过机制,允许开发者根据不同条件选择性地执行测试。
import os
import pytest
import sys
@pytest.mark.slow
def test_time_consuming_operation():
"""标记为慢速测试"""
import time
time.sleep(2)
assert True
@pytest.mark.skipif(sys.platform == "win32",
reason="不在Windows平台运行")
def test_unix_specific():
"""跳过Windows平台的测试"""
assert os.name == "posix"
@pytest.mark.xfail(reason="已知问题,待修复")
def test_known_failure():
"""预期失败的测试"""
assert False
# 运行特定标记的测试
# pytest -m slow
# pytest -m "not slow"
总结
pytest作为Python测试领域的领先框架,以其简洁的语法、强大的功能和丰富的生态系统赢得了广泛认可。从基础的单元测试到复杂的集成测试,pytest都能提供优雅的解决方案。其fixture机制、参数化测试和灵活的配置选项,使得测试代码的编写和维护变得更加高效。
相关推荐
- zabbix企业微信告警(zabbix5.0企业微信告警详细)
-
zabbix企业微信告警的前提是用户有企业微信且创建了一个能够发送消息的应用,具体怎么创建可以协同用户侧企业微信的管理员。第一步:企业微信准备我们需要的内容包括企业ID,应用的AgentId和应用的S...
- 基于centos7部署saltstack服务器管理自动化运维平台
-
概述SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCr...
- 功能实用,效率提升,Python开发的自动化运维工具
-
想要高效的完成日常运维工作,不论是代码部署、应用管理还是资产信息录入,都需要一个自动化运维平台。今天我们分享一个开源项目,它可以帮助运维人员完成日常工作,提高效率,降低成本,它就是:OpsManage...
- centos定时任务之python脚本(centos7执行python脚本)
-
一、crontab的安装默认情况下,CentOS7中已经安装有crontab,如果没有安装,可以通过yum进行安装。yuminstallcrontabs二、crontab的定时语法说明*代表取...
- Fedora 41 终于要和 Python 2.7 说再见了
-
红帽工程师MiroHroncok提交了一份变更提案,建议在Fedora41中退役Python2.7,并放弃仍然依赖Python2的软件包。Python2已于2020年1...
- 软件测试|使用docker搞定 Python环境搭建
-
前言当我们在公司的电脑上搭建了一套我们需要的Python环境,比如我们的版本是3.8的Python,那我可能有一天换了一台电脑之后,我整套环境就需要全部重新搭建,不只是Python,我们一系列的第三方...
- 环境配置篇:Centos如何安装Python解释器
-
有小伙伴时常会使用Python进行编程,那么如何配置centos中的Python环境呢?1)先安装依赖yuminstallgccgcc-c++sqlite-devel在root用户下操作:1...
- (三)Centos7.6安装MySql(centos8.3安装docker)
-
借鉴文章:centos7+django+python3+mysql+阿里云部署项目全流程。这里我只借鉴安装MySql这一部分。链接:https://blog.csdn.net/a394268045/a...
- Centos7.9 如何安装最新版本的Docker
-
在CentOS7.9系统中安装最新版本的Docker,需遵循以下步骤,并注意依赖项的兼容性问题:1.卸载旧版本Docker(如已安装)若系统中存在旧版Docker,需先卸载以避免冲突:sudoy...
- Linux 磁盘空间不够用?5 招快速清理文件,释放 10GB 空间不是梦!
-
刚收到服务器警告:磁盘空间不足90%!装软件提示Nospaceleftondevice!连日志都写不进去,系统卡到崩溃?别慌!今天教你5个超实用的磁盘清理大招,从临时文件到无用软件一键搞定...
- Playwright软件测试框架学习笔记(playwright 官网)
-
本文为霍格沃兹测试开发学社学员学习笔记,人工智能测试开发进阶学习文末加群。一,Playwright简介Web自动化测试框架。跨平台多语言支持。支持Chromium、Firefox、WebKit...
- 为SpringDataJpa集成QueryObject模式
-
1.概览单表查询在业务开发中占比最大,是所有CRUDBoy的入门必备,所有人在JavaBean和SQL之间乐此不疲。而在我看来,该部分是最枯燥、最没有技术含量的“伪技能”。1.1.背景...
- 金字塔测试原理:写好单元测试的8个小技巧,一文总结
-
想必金字塔测试原理大家已经很熟悉了,近年来的测试驱动开放在各个公司开始盛行,测试代码先写的倡议被反复提及。鉴于此,许多中大型软件公司对单元测试的要求也逐渐提高。那么,编写单元测试有哪些小技巧可以借鉴和...
- 测试工程师通常用哪个单元测试库来测试Java程序?
-
测试工程师在测试Java程序时通常使用各种不同的单元测试库,具体选择取决于项目的需求和团队的偏好。我们先来看一些常用的Java单元测试库,以及它们的一些特点: 1.JUnit: ·描述:JUn...
- JAVA程序员自救之路——SpringAI评估
-
背景我们用SpringAI做了大模型的调用,RAG的实现。但是我们做的东西是否能满足我们业务的要求呢。比如我们问了一个复杂的问题,大模型能否快速准确的回答出来?是否会出现幻觉?这就需要我们构建一个完善...
- 一周热门
- 最近发表
-
- zabbix企业微信告警(zabbix5.0企业微信告警详细)
- 基于centos7部署saltstack服务器管理自动化运维平台
- 功能实用,效率提升,Python开发的自动化运维工具
- centos定时任务之python脚本(centos7执行python脚本)
- Fedora 41 终于要和 Python 2.7 说再见了
- 软件测试|使用docker搞定 Python环境搭建
- 环境配置篇:Centos如何安装Python解释器
- (三)Centos7.6安装MySql(centos8.3安装docker)
- Centos7.9 如何安装最新版本的Docker
- Linux 磁盘空间不够用?5 招快速清理文件,释放 10GB 空间不是梦!
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)