Python测试框架之—— pytest介绍与示例

news2024/9/20 7:50:56

Pytest是一个功能强大且易于使用的Python测试框架,它提供了丰富的功能和灵活的用法,使得编写和运行测试变得简单而高效。

一、Pytest的特点

  1. 简单灵活:Pytest的语法简洁清晰,容易上手,并且支持复杂的测试场景。
  2. 自动发现测试:Pytest能够自动发现项目中的测试文件和测试函数,无需手动编写繁琐的配置。
  3. 丰富的断言库:Pytest内置了丰富的断言库,可以方便地进行测试结果的判断。
  4. 支持参数化测试:Pytest支持参数化测试,允许对多组输入进行测试,提高测试效率。
  5. 插件丰富:Pytest拥有丰富的插件生态系统,如pytest-selenium(集成selenium)、pytest-html(生成HTML测试报告)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等,可以通过插件扩展各种功能。
  6. 可以与Jenkins集成:Pytest能够很好地与Jenkins等持续集成工具集成,方便自动化测试流程的构建。

二、Pytest的安装

Pytest的安装非常简单,可以使用pip命令进行安装:


pip install -U pytest

安装完成后,可以通过运行pytest --version来验证安装是否成功,如果看到版本号则说明安装成功。

三、Pytest的基本使用

  1. 测试文件命名:测试文件应该以test_开头或以_test结尾,例如test_login.pyuser_test.py
  2. 测试函数命名:测试函数应该以test开头,例如def test_login_success():
  3. 测试类命名:如果使用类来组织测试用例,测试类应该以Test开头,且不能有__init__方法。测试类中的测试函数同样需要以test开头。
  4. 执行测试:可以通过命令行直接运行pytest命令来执行测试,或者通过编写Python代码调用pytest.main()函数来执行测试。

四、Pytest的运行参数

Pytest提供了丰富的运行参数,以支持不同的测试需求。以下是一些常用的运行参数:

  • -v:打印详细运行日志。
  • -s:打印测试中的print输出。
  • -k:通过关键字表达式过滤要执行的测试用例。
  • -x:运行用例失败后立即停止执行。
  • --maxfail=num:当用例失败数达到某个设定的值时停止运行。
  • -m:运行所有被特定标记装饰的测试用例。

五、Pytest的fixture

Pytest的fixture是一个非常强大的功能,它主要用于测试环境的初始化和清理工作。fixture可以代替传统的setup和teardown函数,提供更加灵活和强大的功能。

fixture通过@pytest.fixture()装饰器进行定义,可以使用scope参数控制fixture的作用范围(如function、class、module、session)。在测试用例中,可以通过函数参数的形式传入fixture,以便在测试前后进行环境的初始化和清理。

六、Pytest的断言

Pytest的断言主要使用Python的原生断言方法,如==inis等。此外,Pytest还提供了assert语句的扩展功能,可以方便地生成断言失败的详细信息。

七、Pytest的skip和xfail

Pytest支持在测试用例中跳过某些不需要执行的测试,或者将某些预期会失败的测试标记为xfail(expected failure)。这有助于在开发过程中管理那些尚未实现或存在已知问题的功能。

八、Pytest的示例

这里的Python项目的结构很简单,如下所示:

project/  
├── src/  
│   ├── module1.py  
│   └── module2.py  
└── tests/  
    ├── test_module1.py  
    └── test_module2.py

这里以实现斐波那契函数及对其进行测试为例:

斐波那契函数是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?

在src目录下新增 fibonacci.py , 内容如下:

def fibonacci(n):  
    if n <= 0:  
        return 0  
    elif n == 1:  
        return 1  
    a, b = 0, 1  
    for _ in range(2, n + 1):  
        a, b = b, a + b  
    return b  
  

在tests目录下新增测试文件:test_fibonacci.py,内容如下:

import pytest
import sys  
import os  
  
# 获取当前文件的目录  
current_dir = os.path.dirname(os.path.abspath(__file__))  

# 获取当前文件的父目录路径  
parent_dir = os.path.dirname(current_dir)  

# 假设src目录与当前文件(test_fibonacci.py)在同一级别  
src_dir = os.path.join(parent_dir, 'src')  
# 将src目录添加到sys.path中,以便可以导入其中的模块  
sys.path.insert(0, src_dir)  
  
# 现在可以导入src目录下的fibonacci模块了  
from fibonacci import fibonacci  

def test_fibonacci_zero():  
    assert fibonacci(0) == 0  
  
def test_fibonacci_one():  
    assert fibonacci(1) == 1  
  
def test_fibonacci_two():  
    assert fibonacci(2) == 1  
  
def test_fibonacci_three():  
    assert fibonacci(3) == 2  
  
def test_fibonacci_four():  
    assert fibonacci(4) == 3  
  
def test_fibonacci_large_number():  
    # 选择一个较大的数字进行测试,确保算法在较大输入时也能正确工作  
    # 这里选择了第10个斐波那契数,因为55是一个相对容易验证的结果  
    assert fibonacci(10) == 55  
  
def test_fibonacci_negative_number():  
    # 假设我们想要函数对于负数的输入抛出异常或者返回特定的值  
    # 这里我们假设它应该返回0(或者你可以根据需求修改)  
    assert fibonacci(-1) == 0  

在项目目录运行 pytest命令,运行成功的结果如下图:
在这里插入图片描述



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

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

相关文章

为什么制造企业数字化转型需要MES管理系统

制造企业数字化转型需要MES管理系统&#xff0c;这主要源于MES管理系统在提升生产效率、优化资源配置、加强质量控制以及实现数据驱动决策等方面的显著优势。以下是具体的原因分析&#xff1a; 1. 提升生产效率 实时数据采集与分析&#xff1a;MES管理系统能够实时收集生产过程…

【(逆向)PE64是什么意思?】

PE64 是指 64 位的可移植可执行&#xff08;Portable Executable&#xff09;文件格式。在 Windows 操作系统中&#xff0c;PE 文件是一种常见的可执行文件格式。 在逆向工程中&#xff0c;判断一个 PE 文件是否为 64 位通常需要检查其特定的结构和字段。例如&#xff0c;可以…

利用 UrlClickEvents 深入研究网络钓鱼活动

在 Microsoft 365 Defender 中发现了一个新的高级搜索表:UrlClickEvents 图 1 – UrlClickEvents 表 在撰写本文时,此表尚未出现在每个 Office 365 租户中,官方文档中也不包含有关它的信息。快速查看它包含的事件表明,它记录了用户从 Office 应用程序(例如 Outlook 和 Te…

中仕公考怎么样?事业编备考技巧!

距离2024年下半年事业编考试还有两个月的时间&#xff0c;现在开始准备还能抓住机会!事业编考试一定要了解&#xff1a; 一、事业编招考流程 发布公告→注册报名→选岗→交报名费→报名确认→打印准考证→笔试→调剂→面试→体检→录用。 二、事业编报考地址 1.省人事考试网…

VUE3+nest.js前后端部署-服务器linux中部署Node.js环境

一.安装分布式版本管理系统Git (Alibaba Cloud Linux 3/2、CentOS 7.x) sudo yum install git -y 二.使用Git将NVM的源码克隆到本地的~/.nvm目录下&#xff0c;并检查最新版本。 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && gi…

34 增加系统调用(3)

首先是 在GDT中添加 系统调用的内容&#xff1a; 然后是汇编中实现 syscall_hander 然后是使用C语言函数 实现在屏幕上显示字符。 然后是在 任务中调用这个函数。 然后 sys_show 去调用 系统调用。 在进行系统调用前需要 保存现场。 系统调用之后需要 释放现场。 为了保证在系统…

前端宝典十八:高频算法排序之冒泡、插入、选择、归并和快速

前言 十大经典排序算法的 时间复杂度与空间复杂度 比较。 名词解释&#xff1a; n&#xff1a;数据规模&#xff1b;k&#xff1a;桶的个数&#xff1b;In-place: 占用常数内存&#xff0c;不占用额外内存&#xff1b;Out-place: 占用额外内存。 本文主要探讨高频算法排序中…

docker安装ES(Elasticsearch)的IK分词器

大家可以先看我的Docker中部署Kibana&#xff1a; “Docker中部署Kibana&#xff1a;步骤与指南“-CSDN博客 其实这几篇博文都是有关系的&#xff0c;希望大家学有所成。 问题&#xff1a;命令中有一个unzip没有安装&#xff0c;需要先安装一下&#xff0c;安装命令&#xf…

计算机毕业设计 高校学术交流平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

前端宝典十七:算法之复杂度、链表、队列、栈的代码实现

引文 从本文开始主要探讨前端的算法&#xff0c;这一篇主要涉及&#xff1a; 时间复杂度&空间复杂度&#xff1b;链表&#xff1b;队列&#xff1b;栈&#xff1b; 希望通过学习能掌握好 具体代码时间复杂度&空间复杂度的算法&#xff1b;链表、队列、栈的JavaScri…

Nginx - 反向代理、缓存详解

概述 本篇博客对配置Nginx的第二篇&#xff0c;主要介绍Nginx设置反向代理、缓存、和负载均衡三个知识点&#xff0c;在之前的生产实践中遇到的问题进行归纳和总结&#xff0c;分享出来&#xff0c;以方便同学们有更好的成长。 Nginx 核心参数配置 在写Nginx反向代理时&…

公众号(H5)及小程序的发布流程

⚠️ Web平台本API之前调用了腾讯地图的gcj02坐标免费转换接口&#xff0c;该接口从2024年7月18日起被腾讯逐步下线&#xff0c;导致老版本中本API无法使用。请立即升级到 uni-app 4.24版。 ⚠️ 这里说的 uniapp 升级到 4.24 版的意思&#xff0c;就是使用 4.24 版本 HBuilde…

【JVM】亿级流量调优(一)

亿级流量调优 oop模型 前面的klass模型&#xff0c;它是Java类的元信息在JVM中的存在形式。这个oop模型是Java对象在JVM中的存在形式 内存分配策略: 1.空闲列表2.指针碰撞(jvm采用的) 2.1 top指针:执行的是可用内存的起始位置 2.2 采用CAS的方式3.TLAB 线程私有堆4.PLAB 老年…

使用PhaGCN2/vConTACT2进行病毒分类注释

Introduction 在微生物群落的研究中&#xff0c;分类和注释数量庞大的未培养古细菌和细菌病毒一直是一个难题&#xff0c;主要原因是缺乏统一的分类框架。 目前&#xff0c;用于病毒分类的多种基于基因组的方法已经被提出&#xff0c;主要集中在细菌、古细菌和真核生物病毒的…

隧道代理ip使用

简介 隧道代理&#xff08;Tunnel Proxy&#xff09;是一种特殊的代理服务&#xff0c;它的工作方式是在客户端与远程服务器之间建立一条“隧道”。这种技术常被用来绕过网络限制或提高网络安全性。 主要功能 IP地址变换&#xff1a;隧道代理能够改变客户端的IP地址&#xf…

《javaEE篇》--线程池

线程池是什么 线程的诞生是因为进程创建和销毁的成本太大&#xff0c;但是也是相对而言&#xff0c;如果频繁的创建和销毁线程那么这个成本就不能忽略了。 一般有两种方法来进一步提高效率&#xff0c;一种是协程(这里不多做讨论),另一种就是线程池 假如说有一个学校食堂窗口…

【Node】【2】创建node应用

创建node应用 node应用&#xff0c;不仅可以实现web应用&#xff0c;也能实现http服务器。 如果是php写后端&#xff0c;还需要有http服务器&#xff0c;比如apache 或者 nginx。 但是现在主流都是java写后端&#xff0c;也可以像 Node.js 一样用于实现 Web 应用和 HTTP 服务…

chapter08-面向对象编程(包、访问修饰符、封装、继承)day08

目录 277-包的使用细节 278-访问修饰符规则 279-访问修饰符细节 281-封装介绍 282-封装步骤 283-封装快速入门 284-封装与构造器 285-封装课堂练习 286-为什么需要继承 277-包的使用细节 1、需要哪个包就导入哪个包&#xff0c;不建议全部导入* 2、包的使用细节&…

宵暗的妖怪

宵暗的妖怪 错误代码和正确代码对比 #include <iostream> #include <string.h> using namespace std; const int N1e510; long long a[N],f[N],g[N]; // f 以i为结尾&#xff0c;饱食度最大值 // g 0-i中&#xff0c;饱食度最大值int main() {int n;cin>>…

Linux 内核源码分析---IPv6 数据包

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址。 由于IPv4最大的…