Pytest单元测试框架

第一章、pytest概述

Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or library.

Pytest 是一个功能强大且易于使用的 Python 测试框架,用于编写和运行单元测试、集成测试和功能测试。以下是 Pytest 测试框架的一些主要特点和用法:

一、概述

  • pytest是一个非常成熟的python的单元测试框架,比unittest更灵活,容易上手
  • pytest可以和selenium,requests,appium等第三方库结合实现web自动化,借口自动化,app自动化
  • pytest可以实现测试用例的跳过以及rerun失败用例重试
  • pytest可以和allure生成非常美观的测试报告
  • pytest可以和jenkins持续集成
  • pytest有很多非常强大的插件,并且这些插件能够实现很多的实用的操作
    • pytest
    • pytest-html(生成html格式的自动化测试报告)
    • pytest-xdist(测试用例分布式执行,多CPU分支)
    • pytest-ordering(用于改变测试用例的执行顺序)
    • pytest-rerunfailures(用例失败后重跑)
    • allure-pytest(用于生成美观的测试报告)

1、简单易用

  • Pytest 的语法简单直观,容易上手。
  • 不需要大量的样板代码,测试用例可以以函数形式定义。

2、自动发现测试用例

  • Pytest 能够自动发现和收集项目中的测试用例,无需手动配置测试套件。

3、丰富的断言

  • Pytest 提供了丰富的断言(assert)机制,使得编写测试用例更加灵活和清晰。

4、参数化测试

  • 使用 @pytest.mark.parametrize 装饰器,可以轻松实现参数化测试,运行多组输入进行测试。

5、Fixture 支持

  • Pytest 支持 Fixture,用于提供测试用例所需的资源和环境。
  • Fixture 可以在测试用例运行前进行 setup 操作,在测试用例运行后进行 teardown 操作。

6、插件系统

  • Pytest 具有丰富的插件系统,可以通过插件扩展其功能,满足各种不同需求。

7、并行测试

  • Pytest 支持并行执行测试,提高测试效率。

二、安装pytest

1、安装

pip install pytest

2、验证安装

pytest --version

3、pytest文档

https://docs.pytest.org/en/latest/contents.html

三、默认命名规则

在执行pytest命令时,会自动从当前目录及子目录中寻找符合下述约束的测试函数来执行。

1、测试文件以test_ 开头(以 _test结尾也可以)

所有的单测文件名都需要满足test_*.py格式或*_test.py格式。

2、测试类以Test开头,并且不能带有init方法

在单测文件中,测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的)

3、测试函数以test开头

在单测类中,可以包含一个或多个test_开头的函数。

四、pytest.ini 配置文件

Pytest 的配置文件名为 pytest.ini,它用于配置 pytest 的行为,可以在项目的根目录下创建该文件。以下是一些常用的 pytest 配置选项及其详解:

  1. [pytest] 部分

    • addopts:用于指定额外的命令行选项和标记。例如,addopts = -v -s 表示在运行 pytest 时使用 -v(增加详细输出)和 -s(输出标准输出流)选项。
    • markers:用于定义自定义的标记(marker),以便在测试函数或测试模块中使用。例如,markers = slow: mark tests as slow 可以定义一个名为 slow 的标记,并提供其说明。
  2. [pytest-marks] 部分

    • 在此部分中,您可以定义标记(marker)的别名和说明。例如,slow: mark tests as slow 定义了 slow 标记的别名和说明。
  3. [pytest-rerunfailures] 部分

    • reruns:指定在测试失败时重新运行测试的次数。
    • reruns_delay:指定在重新运行失败测试之间等待的时间(秒)。
  4. [pytest-cov] 部分

    • cov:指定要计算代码覆盖率的模块或路径。
    • cov-report:指定生成代码覆盖率报告的格式。
  5. [pytest-html] 部分

    • html_report_title:指定生成的 HTML 报告的标题。
  6. 其他配置选项

    • python_files:匹配测试文件的文件名模式。
    • python_classes:匹配测试类的名称模式。
    • python_functions:匹配测试函数的名称模式。
    • norecursedirs:排除指定的目录,不进行递归查找测试文件。

配置文件的使用可以让您在项目中统一管理 pytest 的配置选项,从而使测试运行更加方便和可控。您可以根据项目的需要,选择性地配置不同的选项,以满足不同的测试需求

第二章、pytest运行方式

一、主函数模式(相关语法同时适合于主函数模式和命令行模式)

可以在 Python 脚本中调用 Pytest 提供的 main() 函数来运行测试用例。例如:

import pytest

pytest.main()
pytest.main(["test_file.py", "-vs"])

1、默认执行当前目录及其子目录中所有符合命名条件的模块的用例

这将会执行当前目录及其子目录中所有以 test_*.py*_test.py 命名的文件中的测试用例

2、不传参数 

实际上,pytest.main() 方法默认情况下不需要传递任何参数,它会自动识别项目中的测试文件并执行测试。通常情况下,您可以简单地调用 pytest.main() 而不传递任何参数来运行测试。

这将会执行当前目录及其子目录中所有以 test_*.py*_test.py 命名的文件中的测试用例

如果需要传递参数,可以像在命令行中一样将参数作为字符串列表传递给 pytest.main() 方法。但通常情况下,不需要手动传递参数,除非您需要在代码中动态设置一些特定的参数。

3、传入参数(传入的参数同时适合于主函数模式和命令行模式)

pytest.main() 方法可以接受一个包含命令行参数的列表作为参数,这些参数将会被传递给 Pytest 运行测试用例的过程。常见的参数包括:

这些选项可以通过命令行传递给 Pytest,以控制测试的执行行为和输出结果。

1、测试文件或目录(默认为当前目录及其子目录下所有符合条件的文件)

指定要运行的测试文件或目录。例如:pytest.main(["test_file.py"])pytest.main(["test_directory/"])

2、命令行选项

指定要在运行测试时使用的命令行选项。例如:pytest.main(["-v", "-s"]) 表示运行测试时增加详细输出和输出标准输出流。

-v, --verbose

  • 运行测试时增加详细输出。通常情况下,Pytest 只输出测试结果的摘要信息,使用 -v 选项可以使 Pytest 输出更加详细的信息,包括每个测试用例的执行结果、测试函数的名称等。
  • 显示更详细的信息
  • -vs可以一起使用

-s, --capture=no

  • 输出标准输出流。Pytest 默认会捕获测试过程中的标准输出流,使用 -s 选项可以禁止捕获标准输出流,从而在测试过程中实时看到打印到标准输出的信息。
  • 表示输出调试信息,包括print打印的信息

-k EXPRESSION

  • 通过表达式来选择要运行的测试用例。例如:-k test_login 表示运行名称中包含 "test_login" 的测试用例。
3、标记

使用 -m 参数可以指定要运行的测试用例的标记(marker)。例如:pytest.main(["-m", "slow"]) 表示运行标记为 slow 的测试用例。

-m MARKEXPR

  • 通过标记(marker)来选择要运行的测试用例。例如:-m slow 表示运行标记为 "slow" 的测试用例。
4、其他参数

您还可以传递其他的命令行参数,如 --cov--cov-report 等,用于指定代码覆盖率、生成报告等功能。

--cov

  • 计算代码覆盖率。使用 --cov 选项可以指定要计算代码覆盖率的模块或路径。

--cov-report

  • 指定生成代码覆盖率报告的格式。常见的报告格式包括 term(终端输出)、html(HTML 格式报告)、xml(JUnit XML 格式报告)等。

总之,pytest.main() 方法可以接受任意数量和类型的参数,用于配置 Pytest 的运行行为,这些参数可以通过列表的形式传递给该方法。

二、命令行模式

可以在命令行中使用 pytest 命令来运行测试用例。例如:

pytest test_file.py  # 运行指定文件中的测试用例
pytest test_directory/  # 运行指定目录下所有文件中的测试用例
pytest  #运行当前工作目录下符合条件文件中的测试用例

三、通过读取pytest.ini配置文件运行



 

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

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

相关文章

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限,一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具,默认开启873端口 https://vulhub.org/#/envir…

第九节HarmonyOS 常用基础组件17-ScrollBar

1、描述 滚动条组件ScrollBar,用于配合可滚动组件使用,如List、Grid、Scroll。 2、接口 可包含子组件 ScrollBar(value:{scroller:Scroller, direction?: ScrollBarDirection, state?: BarState}) 3、参数 参数名 参数类型 必填 描述 scrolle…

148基于matlab的带有gui的轮轨接触几何计算程序

基于matlab的带有gui的轮轨接触几何计算程序,根据不同的踏面和轨头,计算不同横移量下面的接触点位置。程序已调通,可直接运行。 148 matlab 轮轨接触 横移量 (xiaohongshu.com)

Android App开发基础(2)—— App的工程结构

本专栏文章 上一篇 Android开发修炼之路——(一)Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置文件的用途说明;其次阐述两种级别…

【qt】switchBtn

方法1 在qtdesigner中设置按钮图标的三个属性,normal off 、normal on和checkabletrue。 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import uic from switchBtn import Ui_Dialogclass Test(QDialog, Ui_…

如何使用Docker部署火狐浏览器并实现无公网ip远程访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

fastapi报错

初始化报错,非常低级错,扇自己10八张 app FastApi()

Java 集合 02 综合练习+基本数据类型对应的包装类

练习1、 自己写的代码&#xff1a; import java.util.ArrayList; public class practice {public static void main(String[] args) {//定义一个集合ArrayList<String> list new ArrayList<>();list.add("aaa");list.add("bbb");list.add(…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到&#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册&#xff0c;我只截出重点部分 总结&#xff1a;数据在上升沿写出&#xff0c;下降沿读入&#xff0c;…

C# IP v4转地址·地名 高德

需求: IPv4地址转地址 如&#xff1a;输入14.197.150.014&#xff0c;输出河北省石家庄市 SDK: 目前使用SDK为高德地图WebAPI 高德地图开放平台https://lbs.amap.com/ 可个人开发者使用&#xff0c;不过有配额限制。 WebAPI 免费配额调整公告https://lbs.amap.com/news/…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

Java - JDBC

Java - JDBC 文章目录 Java - JDBC引言JDBC1 什么是JDBC2 MySQL数据库驱动3 JDBC开发步骤4 具体介绍 引言 思考: 当下我们如何操作数据库&#xff1f; 使用客户端工具访问数据库&#xff0c;手工建立连接&#xff0c;输入用户名和密码登录。编写SQL语句&#xff0c;点击执行…

每日OJ题_算法_前缀和②_牛客DP35 【模板】二维前缀和

目录 二维前缀和原理 ②牛客DP35 【模板】二维前缀和 解析代码 二维前缀和原理 在一维数组前缀和算法的基础上&#xff0c;想到&#xff1a;计算二维数组前缀和&#xff0c;不就和计算一维数组前缀和一样&#xff0c;即计算每一个位置的前缀和就相当于&#xff1a; 此位置的…

微信小程序开发学习笔记《13》WXS脚本

微信小程序开发学习笔记《13》WXS脚本 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读对应官方文档 一、WXS介绍 WXS ( WeiXin Script)是小程序独有的一套脚本语言&#xff0c;结合WXML&#xff0c;可以构建出页面的…

【Java与网络2】:HTTP核心知识与Curl工具

HTTP是当前应用最为广泛的通信协议&#xff0c;我们上网、玩游戏、刷视频、查美食都离不开HTTP协议。当我们做开发的时候&#xff0c; 需要经常和H5、Android、IOS、PC前端等不同团队的同学打交道&#xff0c;大家讨论的核心问题之一就是交互的时候协议怎么定&#xff0c;而这个…

###C语言程序设计-----C语言学习(6)#

前言&#xff1a;感谢老铁的浏览&#xff0c;希望老铁可以一键三连加个关注&#xff0c;您的支持和鼓励是我前进的动力&#xff0c;后续会分享更多学习编程的内容。 一. 主干知识的学习 1. while语句 除了for语句以外&#xff0c;while语句也用于实现循环&#xff0c;而且它…

Android 系统启动流程

依旧是带着问题再去学习 首先&#xff0c;Android是怎么启动的&#xff1f; Android服务是怎么启动的&#xff1f; Android线程是怎么切换的&#xff1f; Android ApplicationThread是怎么创建的&#xff1f; 那么接下来开始分析Android的启动流程 还是一步一图 先画一张流…

day27 回溯算法part3

39. 组合总和 中等 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

外汇天眼:Alpha Group International为股票回购计划拨款高达2,000万英镑

Alpha Group International plc&#xff0c;一家为企业和机构提供金融解决方案的公司&#xff0c;宣布计划启动股票回购程序&#xff0c;以购买每股面值为0.2便士的普通股。 该公司已经从其现金储备中拨款高达2,000万英镑用于回购计划。购买的普通股将被保留在公司的资本中。 …

合并有序链表---链表OJ---归并思想

https://leetcode.cn/problems/merge-two-sorted-lists/?envTypestudy-plan-v2&envIdtop-100-liked 将两个有序的链表合并为一个新的有序链表&#xff0c;那不就是和归并排序中最后合并的思想一样吗&#xff1f;只不过那里合并的是数组&#xff0c;这里合并的是链表。 首先…