Pytest精通指南(01)介绍与基本使用


文章目录

      • Pytest 简介
      • Pytest 官网
      • Pytest 核心
      • Pytest 原理
      • Pytest 用途
      • Pytest 特点
      • Pytest 安装
      • Pytest 编写测试用例规则
      • Pytest 编写第一条测试用例
        • 用例代码示例
        • 可执行测试
        • 执行一条测试
        • 执行多条测试
      • Pytest 运行方式
        • run模式
        • pytest模式
        • run模式扩展
        • 命令行模式
      • Pytest.main()常用命令


在这里插入图片描述

Pytest 简介

Pytest是一个功能强大的Python测试框架,它简化了测试编写的复杂性,并提供了丰富的插件生态系统,以满足各种复杂的测试需求。

与Python内置的unittest框架相比,Pytest的语法更简洁、更易于理解,支持参数化测试、测试固件(fixtures)、断言重写等高级功能。

此外,Pytest还允许用户通过插件来扩展其功能,从而更好地适应各种项目规模和要求。

无论是在小型项目中进行简单的单元测试,还是在大型项目中进行复杂的集成测试和功能测试,Pytest都能够提供强大的支持。

它支持并发执行测试用例,可以方便地选择执行特定的测试用例集,并且提供了详细的测试报告和日志输出,帮助开发者快速定位和修复问题。

此外,Pytest还与其他流行的Python工具和库(如Selenium、Django等)无缝集成,使得自动化测试变得更加容易和高效。

Pytest 官网

官网:https://www.osgeo.cn/pytest/contents.html

在这里插入图片描述

Pytest 核心

Pytest测试框架的核心是Fixture和Mark

Fixture

  • Fixture是Pytest中的一个重要概念,它允许在测试用例执行前后设置和清理测试环境;
  • 可以将Fixture看作是一些预定义的、可重复使用的配置或资源,这些配置或资源可以在多个测试用例之间共享;
  • 通过使用fixture,可以更加灵活和高效地管理测试依赖和测试环境。

Mark

  • Mark是Pytest提供的一种装饰器,用于对测试用例或fixture进行标记;
    这些标记可以用来控制测试用例的执行方式,例如跳过某些测试、指定测试的执行顺序等。
    Mark提供了一种灵活的方式来管理和控制测试用例的行为。

Pytest 原理

  • 测试自动发现Pytest会自动查找和收集符合特定模式的测试文件和函数,这意味着无需手动指定要运行的测试。
  • 多种类型的测试Pytest支持多种类型的测试,包括单元测试、集成测试、端到端测试等,这使得它适用于不同规模和复杂度的项目。
  • Fixture机制:如前所述,Fixture机制允许定义和重用测试环境配置,使得测试编写更加灵活和高效。
  • 参数化测试Pytest支持参数化测试,这意味着可以使用不同的输入参数多次运行相同的测试代码,从而增加测试覆盖率和效率。
  • 丰富的插件机制Pytest具有强大的插件生态系统,这些插件可以提供各种额外功能,如覆盖率分析、测试报告生成等,使得测试过程更加全面和高效。
  • 多种执行方式Pytest支持多种执行方式,包括命令行执行、配置文件执行和插件执行等,这使得测试的执行方式非常灵活,可以根据项目需求进行定制。

在这里插入图片描述

Pytest 用途

Pytest的应用场景包括但不限于以下几个方面:

  • 单元测试:对程序的一个小部分或一个函数进行测试,看它是否按照预期进行工作。
  • 功能测试:确保软件的某个功能是否工作正常。
  • 回归测试:当代码有所改动时,pytest可以帮助确认改动部分是否运行良好,并且改动没有影响到其他部分的功能。
  • 集成测试:当想同时测试两个或多个组件的集成程度时,pytest可以提供强大的支持。

测试人员:可以使用Pytest来编写和执行测试用例,验证软件的功能和性能是否满足要求,并生成详细的测试报告和日志,帮助开发团队快速定位和修复问题。

开发人员:可以使用Pytest来编写单元测试,确保代码的各个单元功能正常,并在代码改动时进行回归测试,以确保改动没有引入新的问题。

Pytest 特点

  1. 易于使用和上手pytest具有与unittest相似的结构,使得测试人员能够轻松地从unittest迁移到pytest,同时保持测试的连续性和一致性。其简洁的语法和直观的测试结构使得入门变得简单快捷。
  2. 强大的Fixture机制pytestFixture提供了一种灵活的方式来管理和控制测试环境的设置和清理。它支持在测试用例执行前后进行各种资源的配置和共享,使得测试编写更加高效和可维护。
  3. 参数化测试pytest允许通过parametrize装饰器对测试用例进行参数化,这意味着可以使用不同的输入参数多次运行相同的测试用例,从而增加测试的覆盖率和可靠性。
  4. 灵活的测试控制pytest提供了skipxfail装饰器,允许测试人员在测试执行过程中跳过某些测试用例或标记预期失败的测试用例。这对于处理不稳定或依赖外部资源的测试非常有用。
  5. 失败重试机制pytest支持通过插件(如pytest-rerunfailures)实现失败测试用例的自动重试,从而提高测试的可靠性和稳定性。
  6. 广泛的兼容性pytest能够执行由noseunittest编写的测试用例,这使得它能够轻松集成现有的测试代码库,并充分利用pytest的强大功能。
  7. 选择性执行测试用例pytest允许测试人员根据标记、文件名或其他条件选择性地执行特定的测试用例,从而更加灵活地控制测试的执行范围。
  8. 丰富的插件生态系统pytest拥有一个庞大的插件生态系统,提供了许多额外的功能和工具,如测试报告生成、并行执行、测试顺序控制等。这些插件可以通过简单的安装和配置来扩展pytest的功能。
  9. 精美的测试报告pytest可以生成简洁明了的HTML测试报告,帮助测试人员快速了解测试的执行情况和结果。此外,结合Allure等第三方插件,还可以生成更加精美和详细的测试报告。
  10. 与持续集成工具的无缝集成pytest可以轻松地与持续集成工具(如Jenkins)集成,实现自动化构建、测试和报告生成。这使得测试流程更加高效和可靠,有助于提高软件的质量和交付速度。

Pytest 安装

pytest属于python的第三方库,需要额外下载安装,命令如下:

pip install pytest

Pytest 编写测试用例规则

模块 (Modules)

  • 文件名约定pytest会自动发现以test_开头或以\_test结尾的Python文件并执行其中的测试。推荐的做法是使用test_前缀加上业务名称来命名测试文件,例如test_my_feature.py

类 (Classes)

  • 类名约定:测试类应该以Test开头,并且不应包含\__init__方法。\__init__方法通常用于类的初始化,但在测试类中不需要它,因为它会干扰pytest对测试方法的识别。

方法/函数 (Methods/Functions)

  • 方法名约定:测试方法或函数应该以test_开头。pytest会自动识别并运行所有符合此命名约定的方法或函数。

包 (Packages)

  • 包名约定:对于包名,没有特定的约定。但是,每个包都应该包含一个\__init__.py文件,即使它是空的。这个文件告诉Python该目录应被视为一个包,这对于pytest发现和执行测试非常重要。

补充说明

  • 测试结构:除了上述规则外,建议将相关的测试文件组织在同一个目录下,或者使用包来组织具有相似功能的测试。这有助于保持测试代码的清晰和可维护。
  • 测试独立性:每个测试方法都应该独立运行,不依赖于其他测试的执行顺序。这有助于确保测试的可靠性和可重复性。
  • 断言:测试方法中应该包含断言语句来验证被测试代码的行为是否符合预期。断言是测试的核心,它们确保代码按照预期工作。

Pytest 编写第一条测试用例

用例代码示例

test_case_01.py文件代码

import pytestdef addition(x, y):return x + ydef test_01_a():print("正在执行 test_a 函数...")assert addition(3, 5) == 8class TestClassCase01:def test_01_b(self):assert "a" in "apple"def test_01_c(self):assert "a" in "apple"if __name__ == '__main__':pytest.main()

test_case_02.py文件代码

class TestCase01:def test_02_a(self):print("正在执行 test_02_a 函数...")def test_02_b(self):print("正在执行 test_02_b 函数...")
可执行测试

在这里插入图片描述

执行一条测试

点击任意测试用例函数的绿色按钮,用pytest解释器执行,而不是python解释器执行

在这里插入图片描述

执行多条测试

点击main函数的绿色按钮,或者直接右键选择pytest解释器执行

在这里插入图片描述

Pytest 运行方式

run模式

通过Pyton解释器来执行test_case_01.py文件;

注意:文件中带有main函数

重点pytest.main()等价于pytest.main(["./"])会收集当前目录下的所有用例并执行

在这里插入图片描述

test_case_01.py文件中没有main函数

在这里插入图片描述

pytest模式

通过pytest程序执行test_case_01.py文件

在这里插入图片描述

run模式扩展
  • 运行所有 pytest.main()
  • 运行指定模块 pytest.main('[-vs],','./test_case_01.py')
  • 运行指定目录 pytest.main('[-vs]'),'./')
  • 通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成

执行某个类

  • pytest.main(["-vs"],'./test_case_01.py::TestClassCase01')

执行某个方法

  • pytest.main(["-vs"],'./test_case_01.py::TestClassTest01::test_01_b')

执行模块中某个方法:

  • pytest.main(["-vs"],'./test_case_01.py::test_01_a')
命令行模式

基本运行命令:

  • pytest:运行当前目录及其子目录中所有符合测试文件命名约定的测试。

选择测试:

  • pytest test_case.py:运行指定的测试模块。
  • pytest test_directory/:运行指定目录下的所有测试。
  • pytest -k "expression":根据表达式选择测试名称匹配的测试。
  • pytest -m "marker":根据标记选择测试。

控制运行:

  • pytest -x--maxfail=num:在遇到第一个失败的测试时停止。
  • pytest --lf--last-failed:仅重新运行上次失败的测试。
  • pytest -n NUM--numprocesses=NUM:使用多进程运行测试。
  • pytest --failed-first:先运行上次失败的测试。

Pytest.main()常用命令

指定测试文件或用例

  • 文件名/文件路径:直接指定要运行的测试文件、相对路径或绝对路径。
  • 测试文件::测试类:指定要运行的测试类。
  • 测试文件::测试类::测试用例:指定要运行的特定测试用例。

通用选项

  • -v, --verbose:增加输出的详细程度。
  • -q, --quiet:减少输出的详细程度,只报告测试结果。
  • -x, --exitfirst:在第一个失败的测试后停止执行。
  • -k 表达式:根据表达式选择性地运行测试。
  • -m 标记:只运行带有指定标记的测试。
  • -s:禁用所有输出捕获,包括 print 语句。

控制输出和日志

  • –durations=N:显示最慢的N个测试用例的执行时间。
  • –showlocals:在失败的断言处显示局部变量。
  • –tb=风格:设置失败的回溯打印风格,如 auto, short, long, native, no, only_failed
  • –junitxml=path:生成JUnit-XML格式的测试报告。
  • –log-cli=true/false:在控制台打印日志。
  • –log-cli-level=级别:设置控制台日志的级别。
  • –log-cli-format=格式:设置控制台日志的格式。
  • –log-cli-date-format=格式:设置控制台日志日期的格式。
  • –log-file=path:将日志写入文件。
  • –log-file-level=级别:设置文件日志的级别。
  • –log-file-format=格式:设置文件日志的格式。
  • –log-file-date-format=格式:设置文件日志日期的格式。

控制执行流程

  • –maxfail=num:在达到指定数量的失败测试后停止执行。
  • –reruns=n:失败的测试用例重新运行n次。
  • –ff:在发现测试之前排序文件。
  • –pdb:在失败的测试后启动pdb调试器。
  • –looponfail:在失败的测试后无限循环,直到通过。

控制失败的行为

  • –strict:在收集阶段遇到错误时,抛出异常。
  • –ignore=path:忽略指定路径下的文件或目录。
  • –confcutdir=path:在指定路径以上不加载任何配置文件。

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

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

相关文章

【Golang】并发编程之三大问题:原子性、有序性、可见性

目录 一、前言二、概念理解2.1 有序性2.2 原子性后果1:其它线程会读到中间态结果:后果2:修改结果被覆盖 2.3 可见性1)store buffer(FIFO)引起的类似store-load乱序现象2)store buffer(非FIFO)引起的类似store-store乱序…

太阳能智能语音卡口:环保与智能的完美结合/恒峰智慧科技

随着科技的飞速发展,我们的生活正在经历前所未有的变革。在这场变革中,太阳能智能语音卡口以其独特的魅力,成为环保与智能的完美结合,为我们的生活带来了更多的便捷和环保。 太阳能智能语音卡口,顾名思义,是…

React-hooks:useRef

useRef文档 useRef 是一个ReactHook,它能帮助引用一个不需要渲染的值。 const ref useRef(initialValue)参数 initialValue:ref对象的 current 属性的初始值,可以是任意类型的值,这个参数在首次渲染后被忽略。 返回值 useRe…

快速删除node_modules依赖包的命令rimraf

1、安装rimraf npm install -g rimraf 2、使用命令删除node_modules rimraf node_modules *** window系统,使用命令很快就删除node_modules ***

网工基础协议——TCP/UDP协议

TCP和UDP的不同点: TCP(Transmission Control Protocol,传输控制协议); UDP(User Data Protocol,用户数据报协议); TCP:传输控制协议,面向连接可靠的协议,只能适用于单播通信&…

Windows版MySQL5.7解压直用(免安装-绿色-项目打包直接使用)

windows下mysql分类 MySQL分为 安装版和解压版 安装版: 安装方便,下一步------下一步就OK了,但重装系统更换环境又要重新来一遍,会特别麻烦解压版(推荐): 这种方式(项目打包特别方便&#xf…

每日两题2

不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m1, vector<int>(n1,0));//创建dp表dp[0][1] 1;//初始化//填表for(int i 1; i < m; i){for(int j 1; j < n; j){dp[i][j] dp[i-1][j] dp[i][j-1];}}ret…

第十五届蓝桥杯题解-好数

题目大意&#xff1a;一个数的低位为奇数&#xff0c;次低位为偶数&#xff0c;以此类推的数成为好数&#xff0c;例如&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9 给定一个n&#xff0c;求1-n所有好数的个数&#xff0c;n<1e7 思路&#xff1a;一…

智慧煤矿软硬一体化解决方案 计算机视觉助力煤场的智能化作业建设与升级

一、背景介绍 随着科技的不断进步&#xff0c;AI视频分析已经广泛应用于各个领域&#xff0c;包括煤矿行业。智慧煤矿方案通过引入AI视频分析系统&#xff0c;实现对煤矿生产过程的实时监控和管理&#xff0c;从而提高智慧矿山的安全性和生产效率。为了解决井下作业距离地面远…

6-pytorch - 网络的保存和提取

前言 我们训练好的网络&#xff0c;怎么保存和提取呢&#xff1f; 总不可以一直不关闭电脑吧&#xff0c;训练到一半&#xff0c;想结束到明天再来训练&#xff0c;这就需要进行网络的保存和提取了。 本文以前面博客3-pytorch搭建一个简单的前馈全连接层网络&#xff08;回归问…

开通订阅plus

提示&#xff1a; 您的信用卡被拒绝了&#xff0c;请尝试用借记卡支付。您的金融卡已被拒绝。您拒绝了&#xff0c;请尝试用签账卡支付。我们未能验证您的支付方式&#xff0c;请选择另一支付方式并重试。 我都崩溃了&#xff0c;一次又一次的不行&#xff0c;换了好多方式。…

Java switch使用

Java switch使用 涉及关键字&#xff1a; switch&#xff1a; 表达式 变量类型可以是&#xff1a; byte、short、int 或者 char。从 Java SE 7 开始&#xff0c;switch 支持字符串 String 类型&#xff0c; case&#xff1a; 分支语句&#xff0c;需要指定当前分支的常量或者字…

【图文教程】在PyCharm中导入Conda环境

文章目录 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境&#xff08;2&#xff09;使用PyCharm打开需要搭建环境的项目&#xff08;3&#xff09;配置环境 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境 conda create - myenv py…

Day99:云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

目录 云原生-K8s安全-横向移动-污点Taint 云原生-K8s安全-Kubernetes实战场景 知识点&#xff1a; 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 云原生-K8s安全-横向移动-污点Taint 如何判断实战中能否利用污点Taint&#xff1f; 设置污点…

STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法 软件方法就是在首次检测到低电平时加延时&#xff0c;通常延时5-10ms&#xff0c;让抖动先过去&#xff0c;然后再来检测是否仍为低电平&#xff0c;如果仍然是&#xff0c;说明确实按下。 硬件方法就是加RC滤波电路&#xff0c;硬件方法会增加…

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

DNS服务器配置与管理(3)——综合案例

DNS服务器配置与管理 前言 在之前&#xff0c;曾详细介绍了DNS服务器原理和使用BIND部署DNS服务器&#xff0c;本文主要以一个案例为驱动&#xff0c;在网络中部署主DNS服务器、辅助DNS服务器以及子域委派的配置。 案例需求 某公司申请了域名example.com&#xff0c;公司服…

第七周学习笔记DAY.1-封装

学完本次课程后&#xff0c;你能够&#xff1a; 理解封装的作用 会使用封装 会使用Java中的包组织类 掌握访问修饰符&#xff0c;理解访问权限 没有封装的话属性访问随意&#xff0c;赋值也可能不合理&#xff0c;为了解决这些代码设计缺陷&#xff0c;可以使用封装。 面向…

vue快速入门(二十八)页面渲染完成后让输入框自动获取焦点

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用挂载完成的钩子函数用focus使输入框获取焦点 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"width…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…