【python自动化】pytest系列(中)

news2025/4/21 11:52:22

在这里插入图片描述

书接上文:【python自动化】pytest系列(上)

本篇为中篇,后面还有两篇,从本篇开始,知识点会增加,难度会一丢丢的一次递增。

本章知识点

文章目录

    • 1、上节内容知识点回顾
    • 2、Pytest的前置后置操作
    • 3、断言assert
    • 4、运行和报告
      • 命令行执行
      • 相关插件
      • allure报告
        • 安装pytest-allure
        • 如何使用
        • 通过allure命令生成报告


1、上节内容知识点回顾

  • Pytest安装
  • Pytest Exist Code含义
  • Pytest命令常见用法
  • Pytest如何执行测试

这几个知识点如果大家能够从脑海里回忆起来,并且能够大致写出来,那说明上一节的内容你是掌握的非常不错。

我们就来学习新的知识点吧。

2、Pytest的前置后置操作

用例函数的前置后置,模块中定义:setup,teardown

  • setup_method或setup : 在每个用例函数执行之前都会执行
  • teardown_method或teardown : 在每个用例函数执行之后都会执行

用例类的前置后置,测试类中定义:setup_class,teardown_class

  • setup_class : 在每个用例类执行之前都会执行

  • teardown_class : 在每个用例类执行之后都会执行

    用例模块的前置后置,测试类中定义:setup_module,teardown_module (用的少)

  • setup_module: 在每个模块执行之前都会执行

  • teardown_module: 在每个模块执行之后都会执行

新建test_c.py文件,编写如下代码:

class Test_C():

    def setup_class(self):
        print("我是Test_C下的用例类前置函数setup_class")
        
    def setup(self):
        print("我是Test_C下的用例方法前置函数setup")

    def test_001(self):
        print("我是Test_C下的test_001函数")

    def test_002(self):
        print("我是Test_C下的test_002函数")

    def teardown(self):
        print("我是Test_C下的用例方法后置函数teardown")

    def teardown_class(self):
        print("我是Test_C下的用例类后置函数teardown_class")

执行结果如下

============================= test session starts =============================
collecting ... collected 2 items

test_c.py::Test_C::test_001 我是Test_C下的用例类前置函数setup_class
我是Test_C下的用例方法前置函数setup
PASSED                                       [ 50%]我是Test_C下的test_001函数
我是Test_C下的用例方法后置函数teardown

test_c.py::Test_C::test_002 我是Test_C下的用例方法前置函数setup
PASSED                                       [100%]我是Test_C下的test_002函数
我是Test_C下的用例方法后置函数teardown
我是Test_C下的用例类后置函数teardown_class


======================== 2 passed, 4 warnings in 0.01s ========================

Process finished with exit code 0

我们发现运行结果中,出现了 4 warnings,通过排查我发现 warnings的信息如下:

============================== warnings summary ===============================
test_c.py::Test_C::test_001
  D:\Z_Enviroment\python\ApiTestProject\lib\site-packages\_pytest\fixtures.py:901: PytestRemovedIn8Warning: Support for nose tests is deprecated and will be removed in a future release.
  test_c.py::Test_C::test_001 is using nose-specific method: `setup(self)`
  To remove this warning, rename it to `setup_method(self)`
  See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose
    fixture_result = next(generator)

test_c.py::Test_C::test_001
  D:\Z_Enviroment\python\ApiTestProject\lib\site-packages\_pytest\fixtures.py:917: PytestRemovedIn8Warning: Support for nose tests is deprecated and will be removed in a future release.
  test_c.py::Test_C::test_001 is using nose-specific method: `teardown(self)`
  To remove this warning, rename it to `teardown_method(self)`
  See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose
    next(it)

test_c.py::Test_C::test_002
  D:\Z_Enviroment\python\ApiTestProject\lib\site-packages\_pytest\fixtures.py:901: PytestRemovedIn8Warning: Support for nose tests is deprecated and will be removed in a future release.
  test_c.py::Test_C::test_002 is using nose-specific method: `setup(self)`
  To remove this warning, rename it to `setup_method(self)`
  See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose
    fixture_result = next(generator)

test_c.py::Test_C::test_002
  D:\Z_Enviroment\python\ApiTestProject\lib\site-packages\_pytest\fixtures.py:917: PytestRemovedIn8Warning: Support for nose tests is deprecated and will be removed in a future release.
  test_c.py::Test_C::test_002 is using nose-specific method: `teardown(self)`
  To remove this warning, rename it to `teardown_method(self)`
  See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose
    next(it)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

通过阅读官网我们可以发现,setupteardown并不是pytest的原生用法,在pytest中的原生用法应该是setup_methodteardown_method

在这里插入图片描述

修改后运行,就没有warnings了

在这里插入图片描述

学东西,我们要知其然,更要知其所以然!

3、断言assert

参考博客:https://blog.csdn.net/kafu0/article/details/125180417

1.与unittest不同,pytest使用的是python自带的assert关键字来进行断言
2.assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败

常用断言汇总

pytest 里面断言实际上就是 python 里面的 assert 断言方法,常用的有以下几种
assert xx :判断 xx 为真
assert not xx :判断 xx 不为真
assert a in b :判断 b 包含 a
assert a == b :判断 a 等于 b
assert a != b :判断 a 不等于 b

新建test_d.py文件,编写如下代码:

def test001():
    print("我是test_d下的test001")
    assert 1 == 1

def test002():
    print("我是test_d下的test002")
    assert 1 == 2

运行结果如下:

============================= test session starts =============================
collecting ... collected 2 items

test_d.py::test001 PASSED                                                [ 50%]我是test_d下的test001

test_d.py::test002 FAILED                                                [100%]我是test_d下的test002

test_d.py:15 (test002)
1 != 2

Expected :2
Actual   :1
<Click to see difference>

def test002():
        print("我是test_d下的test002")
>       assert 1 == 2
E       assert 1 == 2

test_d.py:18: AssertionError


========================= 1 failed, 1 passed in 0.06s =========================

4、运行和报告

命令行执行

1. Pytest/test.py(终端,命令⾏,pycharm都⾏,可配置pycharm使⽤pytest⽅式执⾏)
	❖ Pytest –v (最⾼级别信息—verbose)
	❖ pytest -v -s ⽂件名 (s是带控制台输出结果,也是输出详细)

2. pytest将在当前⽬录及其⼦⽬录中运⾏test_*.py或*_test.py形式的所有⽂件。

3. 以test_开头的函数,以Test开头的类,以test_开头的⽅法。所有包package都要有__init__.py⽂件。

4. Pytest可以执⾏unittest框架写的⽤例和⽅法

如上章节3.3所示,我们可以在根目下建main.py文件,导入pytest进行用例收集执行,和命令行效果一样。

如何添加参数:

import pytest

pytest.main(["-s","-v"])

相关插件

官方插件列表,截止到目前,已经有1100多插件了。

在这里插入图片描述

Pytest-html : 生成可视化报告

Pytest-rerunfailures : 失败重跑—reruns n, n是重复次数

Pytest-assume :多条断言有失败也都运行

Pytest-allure : 高大上精美报告

Pytest-xdist : 只支持多进程, pytest -n 2 在2个cpu上运行测试  —-looponfail标志,它将自动重新运行你的失败测试(不支持多线程)

Pytest-parallel :   1、同时支持多线程、多进程两种方式执行测试用例-workers=n       
                    2、指定运行的进程数为 n,默认为1,windows系统中只能为1
                    3、--tests-per-worker=m        指定运行的线程数为 m
                    4、若两个参数都指定,则表示启动n个进程,每个进程最多启动m线程执行,总线程数 = 进程数 * 线程数
                    5、windows系统中不支持 --workers 取其他值,即只能为1,mac或linux系统中可取其他值

Pytest-sugar : 改变pytest的默认外观,增加进度条,安装后即可

Pytest-picked : 运行基于你已修改但尚未提交给git的代码的测试。

Pytest-instafail : 修改默认行为,以立即显示失败和错误,而不是等到pytest完成每个测试运行。

Pytest-django : 开发web

Pytest-selenium : pytest提供运行支持selenium为基础

allure报告

这个展现的测试报告比较全面,也做的比较好,官网,python、java、JavaScript等语言都支持。

pytest-allure官网教程

在这里插入图片描述

安装pytest-allure

pip install allure-pytest

如何使用

在main.py的根目录下新建一个allureReport文件夹,填写的路径是相对路径。

命令执行

pytest --alluredir=allureReport

py文件中执行

import pytest

pytest.main(["-s","-v","--alluredir=allureReport"]) # 填如的是相对路径

运行之后会发现在allureReport有一堆json文件

在这里插入图片描述

通过allure命令生成报告

要在测试结束后查看实际报告,需要使用Allure命令行实用程序从结果生成报告。

allure serve allureReport

这里需要用到allure命令,我们需要安装相关的工具。

官网安装链接

在这里插入图片描述

往下滑动找到Manual installation手动安装,下载地址Central Repository: io/qameta/allure/allure-commandline (apache.org)

在这里插入图片描述

安装好之后需要把allure配置到环境变量中。

验证是否安装并配置成功。allure --version

在这里插入图片描述

在cmd窗口cd到项目文件根目录下,执行allure serve allureReport

在这里插入图片描述

根据提示,报告生成在C:\Users\xiaozai\AppData\Local\Temp\5470331366185654759\allure-report,网页自动在http://192.168.12.85:7359地址打开了报告。

在这里插入图片描述

左下角可以切换语言。

到这里,你已经对pytest已经掌握了基本使用了。

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

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

相关文章

C语言:算数转换

一、什么是算数转换 已知&#xff1a;char 和 short 这两种字节长度小于 int 类型参与算术运算时&#xff0c;会进行整型提升。 而当字节长度大于 int 类型的数据参与运算时&#xff0c;如果某个操作符的两个操作数是不同类型&#xff0c;其中一个操作数需要按级别&#xff08;…

便携式水污染物监测设备有哪些参数要求

便携式水污染物监测设备应用范围有&#xff1a; 1、饮用水检测&#xff1a;生活用水&#xff08;自来水&#xff09;、&#xff08;瓶、桶装&#xff09;矿泉水、天然矿泉水等&#xff1b; 2、工业用水检测&#xff1a;工业循环冷却水、工业锅炉水等&#xff1b; 3、其他检测&a…

c语言实现队列

文章目录 前言一、队列的特征二、队列的实现1、队列的设计2、队列的初始化3、元素的入队和出队4、返回队头的数据和队尾的数据5、返回队列的长度6、队列的销毁 三、循环队列四、队列和栈综合练习 前言 栈的特点是元素后进先出(Last In First Out)&#xff0c;而对应的还有一种…

十、pikachu之php反序列化

文章目录 1、php反序列化概述2、实战3、关于Magic function4、__wakeup()和destruct() 1、php反序列化概述 在理解这个漏洞前&#xff0c;首先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 &#xff08;1&#xff09;序列化serialize()&#xff1a;就是把一个…

一款打工人必备的电脑端自律软件!!冲鸭打工人!!

你&#xff01;有没有渴望进步&#xff01;&#xff01; 你&#xff01;有没有渴望变强&#xff01;&#xff01;&#xff01; 成为大佬&#xff01;&#xff01;&#xff01;超越巨佬&#xff01;&#xff01;&#xff01; 这就是一款为这样的你量身定做的程序&#xff1a;输入…

宝塔 杀死 java服务 netstat -tlnp | grep :7003 kill 2205698

7003 是端口 netstat -tlnp | grep :7003 kill 2205698

基于鸽群算法优化的BP神经网络(预测应用) - 附代码

基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.鸽群优化BP神经网络2.1 BP神经网络参数设置2.2 鸽群算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

遥感影像的缨帽(K-T)变换Python实现

&#xff08;1&#xff09;介绍 缨帽变换&#xff08;Kirchhoff Transform&#xff0c;K-T变换&#xff09; 是一种在遥感图像处理中常用的技术&#xff0c;它可以有效地提取地物的空间特征和频谱信息。本文将对遥感缨帽变换的提出者、原理方法、公式、现在的发展、作用进行详…

Mybatis (3)-----分页的运用

目录 一、分页查询 二&#xff0c;特殊的字符处理 三、总结 前言&#xff1a;在我们上篇已经学的动态sql的基础上&#xff0c;今天继续讲解关于maybatis的分页&#xff0c;特殊的字符处理。希望这篇博客可以帮助到大家哦&#xff01; 一、分页查询 为什么要重写mybatis的分…

ATFX汇市:美国PMI数据不及预期,非农基数又遭下修,经济前景堪忧

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.22%&#xff0c;收盘在103.38点&#xff0c; 欧元升值0.17%&#xff0c;收盘价1.0864点&#xff1b; 日元升值0.7%&#xff0c;收盘价144.85点&#xff1b; 英镑贬值0.06%&#xff0c;收盘价1.2725点&#xff1b; 瑞郎…

基于Visual studio创建API项目

API&#xff08;英文全称&#xff1a;Application Programming Interface,中文&#xff1a;应用程序编程接口&#xff09; 为什么要 通过API接口可以与其他软件实现数据相互通信&#xff0c;API这项技术能够提高开发效率。 本文是基于vs2017 .net平台搭建API。希望可以帮助到学…

Python Opencv实践 - 图像直方图自适应均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/cat.jpg", cv.IMREAD_GRAYSCALE) print(img.shape)#整幅图像做普通的直方图均衡化 img_hist_equalized cv.equalizeHist(img)#图像直方图自适应均衡化 #1. 创…

一、MQ的基本概念

1、初识MQ MQ全称是Message Queue&#xff0c;消息队列&#xff0c;多用于系统之间进行异步通信。队列的概念数据结构中有详细介绍过&#xff0c;先进先出&#xff0c;消息队列就是存储消息的数据结构。 同步调用和异步调用两者之间的区别&#xff1a; 同步调用&#xff1a;发…

使用yapi生成漂亮接口文档

YApi-教程 1. 进入yapi 的菜单 2. 从微服务中导出swagger的json 从浏览器页面访问http://localhost:端口/服务/swagger-ui.html&#xff0c;然后打开浏览器的控制台&#xff0c;查看network&#xff0c;刷新下页面&#xff0c;找到XHR中的api-docs&#xff0c;然后查看res…

【代码】Java中的动态代理实战

文章目录 1. JDK 动态代理2、CGLIB 动态代理 动态代理允许你在运行时创建代理对象&#xff0c;来代替原始对象执行某些操作。这在AOP&#xff08;面向切面编程&#xff09;中非常有用&#xff0c;用于实现日志记录、性能监控、事务管理等功能。 Java提供了两种主要的动态代理实…

缓存的设计方式

问题情况&#xff1a; 当有大量的请求到内部系统时&#xff0c;若每一个请求都需要我们操作数据库&#xff0c;例如查询操作&#xff0c;那么对于那种数据基本不怎么变动的数据来说&#xff0c;每一次都去数据库里面查询&#xff0c;是很消耗我们的性能 尤其是对于在海量数据…

【0基础入门Python Web笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作

一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型&#xff08;Numbers&#xff09;字符串类型&#xff08;String&#xff09;布尔类型&#xff08;Boolean&#xff09; 复合数据类型List&#xff08;列表&#xff09;Tuple&…

【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

题目&#xff1a;有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 题解 数组其实是有序的&#xff0c; 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的…

shell 编写一个带有进度条的程序安装脚本

需求 使用 shell 写一个 软件安装脚本&#xff0c;带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…

JVM——类加载与字节码技术—类加载器+运行期优化

5.类加载器 jdk的类加载器具有层级关系。 启动类加载器》扩展类加载器》应用程序类加载器》自定义类加载器 对应类加载器只会负责加载对应目录的类。 双亲委派上级机制 应用程序类加载器加载一个类之前会先查询上级加载器是否已经加载过了该类。然后再让上级询问上上级。都…