Python测试框架之pytest快速入门

pytest是一种流行的Python测试框架,支持创建简单的单元测试,也支持创建复杂的功能和集成测试。它提供了一系列有用的功能,能够方便地编写,组织和运行测试用例,并生成丰富的测试报告。

pytest的主要特点包括:

  • 自动发现测试用例:pytest会自动查找项目中以test_或者以_test结尾的函数或类,并执行它们。
  • 参数化测试:pytest允许使用@pytest.mark.parametrize标记来指定多组输入参数和预期输出值,以简化测试用例的编写和管理。
  • 丰富的断言方式:pytest支持多种断言方法,如assert语句、pytest.assert函数、pytest-assume插件以及第三方断言库等,可以让开发人员更轻松地编写和维护测试用例。
  • 插件化架构:pytest允许通过插件来扩展其功能,它有很多官方和社区提供的插件,可以帮助开发人员处理日志、代码覆盖率、性能测试等各种任务。
  • 可与unittestnose无缝对接
  • 丰富的测试报告:pytest会自动生成丰富的测试报告,包括测试用例的执行情况、失败原因、覆盖状态等信息,并支持多种输出格式,如HTML,JUnit XML等。
    使用pytest编写和运行测试用例相对于其他测试框架来说更加简洁和灵活,同时它也是Python社区中广泛使用的测试工具之一。

使用标准库unittest进行单元测试

介绍pytest之前, 先来看一下Python内置的测试库unittest, unittest是Python 标准库的一部分,在安装完Python之后就可以使用, 不需要安装任何其他模块。
Python unittest是Python自带的一个单元测试框架,用于编写和运行测试用例,以确保代码的正确性和可靠性。unittest提供了一系列的工具和断言方法,使得编写测试用例变得更加简单和高效。通过使用unittest,开发人员可以快速运行测试用例并自动化测试过程,从而节省时间和人力成本。
在Python中,unittest常被用作测试框架,它不仅仅用于单元测试,还可以进行集成测试和功能测试。unittest框架提供了丰富的API、测试控制器以及测试加载器,使得测试用例的编写和执行变得更容易。
使用unittest编写测试用例的流程如下:

  1. 创建一个测试类,继承unittest.TestCase类。
  2. 在测试类中编写测试方法。测试方法必须以test_开头,用于测试代码的特定功能。
  3. 在测试方法中使用断言方法(如assertEqual、assertTrue等)判断代码的执行结果是否符合预期。
  4. 运行测试用例,并查看测试报告,根据测试结果进行代码调整和优化。

直接上代码示例:

import unittestdef add(a, b):return a + bclass TestAdd(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)if __name__ == '__main__':unittest.main()

一个测试用例是一个完整的单元测试流程,包括测试前的准备环节、执行测试动作的环节、与期望结果的对比的环节。在unittest中,测试用例是通过继承unittest.TestCase类来实现的,这个示例中定义了一个名为 add 的函数,并且使用了 Python 的 unittest 模块对这个函数进行了测试。

  • TestAdd 类继承自 unittest.TestCase 类,并包含了一个名为 test_add 的测试方法。
  • 在这个方法中,使用 self.assertEqual 方法来检查 add 函数是否正确计算了加法。最后,使用 unittest.main() 运行测试。

运行成功的界面如下:

在这里插入图片描述

如果运行失败是怎么显示的呢? 修改上面的 self.assertEqual(add(1, 2), 3) => self.assertEqual(add(1, 2), 4) 让测试失败, 失败的界面如下:
在这里插入图片描述

安装 pytest

如果没有安装pytest,可以使用pip来安装:

pip install pytest

如果不确定有没有安装pytest, 可以使用 pip list 查看安装的模块, 比如:
在这里插入图片描述

pytest 安装成功的界面如下:
在这里插入图片描述

使用 pytest 编写单元测试

pytest工具会自动找到文件名和函数名都以test开头的测试用例。

这里定义一个加法函数并对这个函数进行测试, 首先创建一个名为test_sample.py的文件,内容如下:

def add(a, b):return a + bdef test_add():assert add(1, 2) == 3

运行pytest 测试

命令行切换到包含test_sample.py的目录,运行pytest命令,pytest会运行所有发现的测试,并产生一个测试报告,运行的效果如下图:
在这里插入图片描述

测试失败情况下,pytest 怎么显示呢?pytest会详细地显示哪个测试失败,以及失败的详细原因。这里故意定义一个执行错误的函数test_add2(), 代码如下:

def add(a, b):return a + bdef test_add():assert add(1, 2) == 3def test_add2():    assert add(1, 2) == 4

执行后的效果如下图:
在这里插入图片描述

除了在命令行控制台运行和查看pytest的结果外, 也可以在VS Code 的Testing的活动栏,运行和查看结果。效果如下图:
在这里插入图片描述

需要注意的是: 点击Testing的活动栏之后, 需要选择测试的框架为 pytest。

使用pytest 运行功能测试

pytest是一个非常灵活强大的 Python 测试框架,它既能进行单元测试,也能进行功能测试, 通常与 Flask(轻量级的 Python web 框架)一起使用。
Flask 模块需要先安装, 安装方式是 pip install flask, 安装完成之后就可以编写Flask代码了,
这里定义一个 Flask Web 应用,并且需要测试当访问/hello时是否能返回 “Hello, World!”, 代码如下:

from flask import Flaskdef create_app():app = Flask(__name__)@app.route('/hello')def hello():return 'Hello, World!'return appif __name__ == '__main__':app = create_app()app.run()

运行之后通过浏览器访问的效果如下图:
在这里插入图片描述

接下来, 使用pytest来进行功能测试,使用Flask的测试客户端来模拟访问, 定义测试的文件test_app.py , 内容如下:

import pytest
from app import create_app@pytest.fixture
def client():app = create_app()app.config['TESTING'] = Truewith app.test_client() as client:yield clientdef test_hello(client):response = client.get('/hello')assert response.data == b'Hello, World!'
  • 使用 @pytest.fixture 装饰器定义了一个名为 client 的测试夹具。该夹具在测试过程中可以作为参数传递给测试函数。在这个夹具函数中,创建了一个测试用的 Flask 应用,并将其配置为测试模式。
  • 定义了一个名为 test_hello 的测试函数,并将上述夹具 client 作为参数传递进去。在测试函数中,使用 client.get(‘/hello’) 发起了一个 GET 请求,并检查返回值是否等于 b’Hello, World!'。如果返回值和预期值不一致,那么测试将会失败。
  • 在 Python 中,当字符串前面带有前缀b时,表示这是一个 bytes 类型的字符串,而不是普通的 str 类型。bytes 类型的字符串在 Python 中是一种原生的二进制序列类型,它的每个字符都是一个字节,可以存储任意的二进制数据。
    在 Flask 应用中,当使用response.data获取 HTTP 响应的内容时,返回的是 bytes 类型的内容,因为 HTTP 响应的内容是以二进制字节流的形式传输的。因此,在进行 HTTP 响应内容的比较时,需要使用 bytes 类型的字符串,而不是普通的 str 类型字符串。

运行测试的效果如下图:
在这里插入图片描述

参考

  • pytest官方站点: https://docs.pytest.org/en/7.4.x/


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

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

相关文章

软件测试面试题【2023最新合集】

收集了各大公司的面试经验,现整理出来,希望能给正在找工作的志同道合的小伙伴一些指引,本文会持续更新的哦。 1、 CPU 和 GPU的区别 一个是通用计算,一个是专用计算。 CPU主要负责操作系统和应用程序,GPU主要负责跟…

Python爬虫框架Scrapy:实现高效数据抓取

目录 一、引言 二、Scrapy框架概述 1、Scrapy框架特点 2、Scrapy框架结构 三、Scrapy框架的使用 1、安装Scrapy框架 2、创建Scrapy项目 3、创建爬虫 4、运行爬虫 四、Scrapy框架常见问题及解决方案 1、请求被网站封禁 2、处理动态加载的页面 3、避免被网站检测到爬…

进程管理(二)

进程并发制约关系及临界区 (3)比如A的n为MAX,此时B执行buf[Max]出错。 临界区是访问临界资源的代码。 par并发执行 进程同步机制准则 让权等待:主动让位 进程互斥访问临界资源的软件解决方案 算法1——设置访问编号 no_op是空指令,做空操作,空转指令。no_op依然会占…

11.8 33oj 模拟赛总结(时间安排 + 题解(数学 + 二分 + 括号匹配DP + 性质DP))

文章目录 考试时间及策略考试结果赛后总结题解Balance AddictsBoboniu and StringBracket InsertionConveyor 考试时间及策略 7:40 - 8:00 开题。T1 应该是个dp, 但是好像有点恶心。T2是个神秘构造。T3是个求随机括号匹配的概率,一眼应该是个 n 3 n^3 n3 的…

RabbitMQ 消息中间件

消息中间件 1、简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。 当下主流的消息中间…

YOLOX: Exceeding YOLO Series in 2021(2021.8)

文章目录 AbstractIntroduction介绍前人的工作提出问题解决 YOLOXYOLOX-DarkNet53Implementation detailsYOLOv3 baselineDecoupled headStrong data augmentationAnchor-freeMulti positivesSimOTAEnd-to-end YOLOOther BackbonesModified CSPNet in YOLOv5Tiny and Nano dete…

深入理解JVM虚拟机第二十二篇:详解JVM当中与操作数栈相关的字节码指令

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…

C++ —— map 和 multimap

一、map 1.介绍 1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。 2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同&am…

【Linux精讲系列】——vim详解

​作者主页 📚lovewold少个r博客主页 ⚠️本文重点:c入门第一个程序和基本知识讲解 👉【C-C入门系列专栏】:博客文章专栏传送门 😄每日一言:宁静是一片强大而治愈的神奇海洋! 目录 目录 ​作者…

【教3妹学编程-算法题】 在树上执行操作以后得到的最大分数

3妹:2哥,今日都立冬了, 可是天气一点都不冷。 2哥 : 立冬了,晚上要不要一起出去吃饺子?🥟 3妹:好呀好呀,2哥请吃饺子喽 2哥 : 歪歪,我说的是一起出去吃,没说我…

CSS实现鼠标移至图片上显示遮罩层及文字效果

效果图&#xff1a; 1、将遮罩层html代码与图片放在一个div 我是放在 .proBK里。 <div class"proBK"><img src"../../assets/image/taskPro.png" class"proImg"><div class"imgText"><h5>用户在线发布任务&l…

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

前不久&#xff0c;灰度在与 SEC 就关于 ETF 受理的诉讼案件中&#xff0c;以灰度胜诉告终。灰度的胜利&#xff0c;也被加密行业看做是加密 ETF 在北美地区阶段性的胜利&#xff0c; 该事件也带动了加密市场的新一轮复苏。 此前&#xff0c;Nason Smart Money 曾对加密市场在 …

SHCTF-校外赛道

SHCTF-校外赛道 [WEEK1]babyRCE 1 (1)more:一页一页的显示档案内容2 (2)less:与 more 类似&#xff0c;但是比 more 更好的是&#xff0c;他可以[pg dn][pg up]翻页3 (3)head:查看头几行4 (4)tac:从最后一行开始显示&#xff0c;可以看出 tac 是 cat 的反向显示5 (5)tail:查看…

【Springboot】Vue3-Springboot引入JWT实现登录校验以及常见的错误解决方案

文章目录 前言一、JWT简单介绍二、token校验设计思路三、使用步骤Springboot部署JWT引入依赖&#xff1a;创建登录实体类后端&#xff1a;LoginController.java路由守卫函数 四、问题 前言 项目版本&#xff1a; 后端&#xff1a; Springboot 2.7、 Mybatis-plus、Maven 3.8.1…

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件&#xff08;布局&#xff09; , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…

JVM之jinfo虚拟机配置信息工具

jinfo虚拟机配置信息工具 1、jinfo jinfo&#xff08;Configuration Info for Java&#xff09;的作用是实时地查看和调整虚拟机的各项参数。 使用jps -v 可以查看虚拟机启动时显示指定的参数列表&#xff0c;但是如果想知道未被显示指定的参数的系统默认值&#xff0c;除 …

MySQL的高阶语句

数据库的权限一般很小&#xff0c;工作中使用最多的场景就是查 排序、分组、子查询、视图、多表连接查询&#xff08;左连接、右连接、内连接&#xff09; create TABLE info ( id int(4) primary key, NAME varchar(5) not null, score decimal(5,2), address varchar(20)…

在 Gorm 中学习分页和排序

一个全面的指南&#xff0c;教您在 GORM 中实现分页和排序&#xff0c;以实现高效的数据检索和展示 高效的数据检索和展示是应用程序开发的关键方面。GORM&#xff0c;强大的 Go 对象关系映射库&#xff0c;为开发人员提供了强大的工具来实现这一目标。在本指南中&#xff0c;…

【数据结构】二叉树的遍历递归算法详解

二叉树的遍历 &#x1f4ab;二叉树的结点结构定义&#x1f4ab;创建一个二叉树结点&#x1f4ab;在主函数中手动创建一颗二叉树&#x1f4ab;二叉树的前序遍历&#x1f4ab;调用栈递归——实现前序遍历&#x1f4ab;递归实现中序和后序遍历 &#x1f4ab;二叉树的结点结构定义 …

百面深度学习-循环神经网络

循环神经网络 什么是循环神经网络&#xff1f; 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类用于处理序列数据的神经网络。你可以将它想象成一个机器&#xff0c;它不仅考虑当前的输入&#xff0c;还考虑之前接收过的输入。这使得它非…