Python测试框架Pytest的基础入门

Pytest简介

Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.

通过官方网站介绍我们可以了解到,Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

简单灵活易上手

支持参数化

支持简单的单元测试和复杂的功能测试,还可以用来做自动化测试

具有很多第三方插件,并且可以自定义扩展

测试用例的skip和xfail处理

可以很好的和Jenkins集成

支持运行由Nose、UnitTest编写的测试用例

Pytest安装

直接使用pip命令安装:


pip install -U pytest    # -U是如果已安装会自动升级最新版本

验证安装结果:

pytest --version    # 展示当前安装版本C:\Users\edison>pytest --version
pytest 6.2.5

在Pytest测试框架中,要遵循以下约束:

测试文件名要符合test_.py或_test.py格式(例如test_min.py);

测试类要以Test开头,且不能带有init方法;

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

Pytest测试执行

Pytest进行测试比较简单,我们来看一个实例:


import pytest    # 导入pytest包def test_001():    # 函数以test_开头print("test_01")def test_002():print("test_02")if __name__ == '__main__':pytest.main(["-v","test_1214.py"])    # 调用pytest的main函数执行测试

这里我们定义了两个测试函数,直接打印出结果,下面执行测试:


============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- D:\Code\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Code
collecting ... collected 2 itemstest_1214.py::test_001 PASSED                                            [ 50%]
test_1214.py::test_002 PASSED                                            [100%]============================== 2 passed in 0.11s ==============================Process finished with exit code 0

输出结果中显示执行了多少条案例、对应的测试模块、通过条数以及执行耗时。

测试类主函数

pytest.main(["-v","test_1214.py"])

通过Python代码执行pytest.main():

1.直接执行pytest.main() 【自动查找当前目录下,以test_开头的文件或者以_test结尾的py文件】。

2.设置Pytest的执行参数 pytest.main([‘–html=./report.html’,‘test_login.py’])【执行test_login.py文件,并生成html格式的报告】。

main()括号内可传入执行参数和插件参数,通过[]进行分割,[]内的多个参数通过“逗号,”进行分割:

运行目录及子包下的所有用例 :pytest.main([‘目录名’]);

运行指定模块所有用例 :pytest.main([‘test_reg.py’]);

运行指定模块指定类指定用例 :pytest.main([‘test_reg.py::TestClass::test_method’]) 冒号分割。

-m=xxx: 运行打标签的用例

-reruns=xxx:失败重新运行

-q: 安静模式, 不输出环境信息

-v: 丰富信息模式, 输出更详细的用例执行信息

-s: 显示程序中的print/logging输出

–resultlog=./log.txt 生成log

–junitxml=./log.xml 生成xml报告

断言方法

Pytest断言主要使用Python原生断言方法,主要有以下几种:

== 内容和类型必须同时满足相等

in 实际结果包含预期结果

is 断言前后两个值相等

import pytest    # 导入pytest包def add(x,y):    # 定义以test_开头函数return x + ydef test_add():assert add(1,2) == 3    # 断言成功str1 = "Python,Java,Ruby"
def test_in():assert "PHP" in str1    # 断言失败if __name__ == '__main__':pytest.main(["-v","test_pytest.py"])    # 调用main函数执行测试

============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- D:\Code\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Code
collecting ... collected 2 itemstest_pytest.py::test_add PASSED                                          [ 50%]
test_pytest.py::test_in FAILED                                           [100%]================================== FAILURES ===================================
___________________________________ test_in ___________________________________def test_in():
>       assert "PHP" in str1
E       AssertionError: assert 'PHP' in 'Python,Java,Ruby'test_pytest.py:11: AssertionError
=========================== short test summary info ===========================
FAILED test_pytest.py::test_in - AssertionError: assert 'PHP' in 'Python,Java...
========================= 1 failed, 1 passed in 0.18s =========================Process finished with exit code 0

可以看到运行结果中明确指出了错误原因是“AssertionError”,因为PHP不在str1中。

常用命令详解

运行指定案例:

if __name__ == '__main__':pytest.main(["-v","-s","test_1214.py"])

运行当前文件夹包括子文件夹所有用例:

if __name__ == '__main__':pytest.main(["-v","-s","./"])

运行指定文件夹(code目录下所有用例):

if __name__ == '__main__':pytest.main(["-v","-s","code/"])

运行模块中指定用例(运行模块中test_add用例):

if __name__ == '__main__':pytest.main(["-v","-s","test_pytest.py::test_add"])

执行失败的最大次数。使用表达式"–maxfail=num"来实现(注意:表达式中间不能存在空格),表示用例失败总数等于num 时停止运行。

在这里插入图片描述

在这里插入图片描述
错误信息在一行展示。在实际项目中如果有很多用例执行失败,查看报错信息将会很麻烦。 

使用"–tb=line"命令,可以很好解决这个问题。
在这里插入图片描述
接口调用

本地写一个查询用户信息的接口,通过Pytest来调用,并进行接口断言。

# -*- coding: utf-8 -*-
import pytest
import requestsdef test_agent():r = requests.post(url="http://127.0.0.1:9000/get_user",data={"name": "吴磊","sex": 1},headers={"Content-Type": "application/json"})print(r.text)assert r.json()['data']['retCode'] == "00" and r.json()['data']['retMsg'] == "调用成功"if __name__ == "__main__":pytest.main(["-v","test_api.py"])

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

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

相关文章

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点: 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点: xib是轻量级的,用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址: https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz,并上传到Centos中,执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

每天一道C语言编程:Cylinder(圆柱体问题)

题目描述 使用一张纸和剪刀,您可以通过以下方式切出两个面形成一个圆柱体: 水平切割纸张(平行于较短的边)以获得两个矩形部分。 从第一部分开始,切出一个最大半径的圆。圆圈将形成圆柱体的底部。 将第二部分向上滚动&…

在 Amazon 上以高可用性模式实现 Microsoft SQL 数据库服务现代化的注意事项

许多企业都有需要 Microsoft SQL Server 来运行关系数据库工作负载的应用程序:一些应用程序可能是专有软件,供应商可使用它强制 Microsoft SQL Server 运行数据库服务;其他应用程序可能是长期存在的、自主开发的应用程序,它们在最…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者:Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的,Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速,从简单的关键字到繁重的 KNN 向量,以及摄取管道繁重的摄取工作负载。 摄取涉及…

2023版7月软件测试面试题(800道)【附带答案】持续更新...

又到了立flag的时候,你的目标是拿下大厂offer?还是多少万年薪?其实这些都离不开日积月累的过程。 为此我特意整理出一份(超详细笔记/面试题)它几乎涵盖了所有的测试开发技术栈,非常珍贵,人手一…

cancal报错 config dir not found

替换classpath中间封号两边的值

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路:如果没做过还不是很好想,当时自己第一反应是双指针,结果是个动态规划的题。 核心就是dp的定义,dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

JVM理论(五)执行引擎--解释器/JIT编译器

概述 首先执行引擎是java虚拟机核心的组成部分之一;而JVM的主要任务是装载字节码到内存,但不能够直接运行在操作系统之上.因为字节码指令并非等价于本地机器指令,它仅仅包含能够被JVM所识别的指令、符号表、以及其他信息;而此时执行引擎就华丽登场,它的任务就是将字节码指令解…

行为型模式 - 策略模式

概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发&…

Web 3.0时代,重塑教育与学习方式的可能性

随着科技的快速发展和互联网的普及,教育领域也面临着巨大的机遇和挑战。Web 3.0时代的到来为教育与学习方式带来了全新的可能性。在这个数字化时代,我们可以探索和利用Web 3.0技术,重塑教育的方式,提供更个性化、互动性和灵活性的…

在Illustrator中创建 3D 冰淇淋模型对象

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D,你可以前往Envato Elements,在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2,000 个 Illus…

php实现站群软件权限管理功能示例

1.管理员页面RBAC.php <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>权限管理</title> <script src"bootstrap/js/jquery-1.11.2.min.js"></script> </head>…

项目名称:智能家居边缘网关项目

一&#xff0c;项目介绍 软件环境: C语言 硬件环境: STM32G030C8TX单片机开发板 开发工具: Linux平台GCC交叉编译环境以及ukeil (1)边缘网关概念 边缘网关是部署在网络边缘侧的网关&#xff0c;通过网络联接、协议转换等功能联接物理和数字世界&#xff0c;提供轻量化的联接管…

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

费尔法克斯水务通过使用 Liquid UI 移动化和定制 SAP PM 来提高收入和数据完整性

背景 费尔法克斯水务是北弗吉尼亚州地区领先的水县。它是华盛顿特区大都会区的三大供水商之一。它每天为近171万居民提供2.<>亿加仑的水。它渴望坚持其愿景&#xff0c;即保持以客户为中心&#xff0c;同时帮助维持该地区的高质量生活和经济状况。 挑战 由于桌面系统&…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐&#xff1a;2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

写给后端开发的『vue3』请求后端接口

本文分享一下在vue3前端项目中请求后端接口获取数据。比较简单&#xff0c;内容如下&#xff1a; 1、使用axios请求后端接口 首先npm install axios&#xff0c;添加axios依赖&#xff0c;就靠它来请求后端接口了&#xff0c;基本等同于使用jquery发ajax。 # src/main.js i…

每天一点Python——day58

#第五十八天 集合间的关系&#xff1a; 类似于数学中学到的集合一样&#xff0c;关系差不多&#xff0c;譬如相等&#xff0c;子集&#xff0c;交集 如图所示&#xff1a;#①两个集合是否相等&#xff1a;运用运算符【等号】或者运算符&#xff01;【不等号】进行判断 #例&…

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术&#xff1a;SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法 1.SFT 监督微调 1.1 SFT 监督微调基本概念 SFT&#xff08;Supervised Fine-Tuning&#xff09;监督微调是指在源数据集上预训练一个神经网络模型&#xff…