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.hqwc.cn/news/29653.html

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

相关文章

容器云平台监控告警体系(四)—— Golang应用接入Prometheus

1、概述 目前容器云平台中的容器仅支持获取CPU使用率、内存使用率、网络流入速率和网络流出速率这4个指标,如果想监控应用程序的性能指标或者想更加细粒度的监控应用程序的运行状态指标的话,则需要在应用程序中内置对Prometheus的支持或者部署独立于应用…

OpenCV for Python 学习第四天 :通道的获取与合并

上一篇博客,我们学习了如何通过更快的item()和itemset()的方法访问图片,以及了解了图像的兴趣位置的获取方法,那么今天,我们将学习通道的处理方法,通过通道的拆分和合并的实例,让大家更好的了解咱们有关于B…

架构训练营学习笔记:4-2 存储架构模式之复制架构

高可用的关键指标 问题:分为故障跟灾难。不是有了多活架构就不在用复制架构 ,还是之前的合适原则:多活架构的技术复杂度 跟成本都比复制架构高。 高可用的关键指标 恢复时间目标(RecoveryTimeObjective,RTO)指为避免在灾难发生后…

EasyCVR录像阈值配置未生效,是什么原因?

有用户反馈,在平台中设置了录像阈值不生效,导致磁盘爆满。针对该反馈,我们立即进行了排查。 EasyCVR基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检…

软件测试测试用例

等价类:把输入的数据可以分为有效的数据和无效的数据 被测试的对象输入的数据: 1、有效的数据 2、无效的数据 测试一个产品,需要考虑它的正确场景,也需要考虑它的异常场景 边界值:边界值测试用例是针对等价类测试用例方法的补…

Stable Diffusion学习笔记

一些零散笔记 灰常好的模型网站 LiblibAI哩布哩布AI-中国领先原创AI模型分享社区 出图效率倍增!47个高质量的 Stable Diffusion 常用模型推荐 - 优设网 - 学设计上优设 关键词Prompt顺序 画质 风格 主体 外表、描述 表情、情绪 姿势 背景 杂项 同时可以…

星火认知大模型,让我感受到了国产AI的崛起

文章目录 一、申请和测试代码二、实测GPT4.0和星火认知大模型的对比2.1 测试网站2.2 经典问题提问对比2.3 代码问题提问对比2.4 论文问题对比2.5 评价 一、申请和测试代码 在我之前的一篇文章中,我分享了如何申请星火认知大模型的内测,并提供了一份可以…

在分区工具上,格式化分区和删除分区. 两者有什么不一样吗?

1.格式化分区:就是重建文件系统,等于把目标分区的数据全部清掉。 删除分区:你删除后可以再重新分区,可以分区多个分区,前提是“删除分区”的大小足够大。分了区,还必须格式化,才能用。 只有分了…

Lottie源代码解析

Lottie-iOS Lottie动画的原理: 一个完整动画View,是由很多个子Layer 组成,而每个子Layer主要通过shapes(形状),masks(蒙版),transform三大部分进行动画。Lottie框架通过…

Spring Data JPA使用规则和审计的学习

一、引入依赖 完整的pom文件如下所示: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

rabbitmq部署(docker方式)

前言&#xff1a;rabbitmq一旦有漏洞&#xff0c;版本升级麻烦&#xff0c;于是改为docker部署 环境&#xff1a;centos7 #停掉之前的服务 systemctl stop rabbitmq-server systemctl disable rabbitmq-server 查了官网&#xff0c;当前3.11.x 最高版本是3.11.19, 虽然3.12…

什么是从人类反馈中强化学习(RLHF)?

目录 一、什么是RLHF? 二、语言作为强化学习问题 三、用于语言模型的RLHF 四、ChatGPT如何使用RLHF 五、RLHF对语言模型的限制 自从OpenAI公司发布ChatGPT以来&#xff0c;人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同…