pytest测试框架

pytest介绍:

pytest是一个非常成熟的全功能的python测试框架,与python自带的unittest测试框架类似,但pytest使用起来更简洁和高效,并且兼容unittest框架

pytest能够支持简单的单元测试和复杂的功能测试,结合requests实现接口测试,结合selenium、appnium实现自动化功能测试

pytest结合allure可实现测试报告自动生成

pytest支持多种第三方插件,可以跟Jenkins集成

pytest访问网址:https://docs.pytest.org/en/stable/

pytest安装(简单介绍一下):

通过python的包管理工具pip进行安装:pip install pytest;升级pytest:pip install -U pytest

pytest测试用例识别和运行:

用例名称规范:

1、python文件以test_开头,或者以_test结尾:test_.py、_test.py

2、测试类以Test开头,并且不能带有init方法

3、测试函数或者测试类中的用例方法以test_开头

运行pytest测试用例:

1、可以直接在terminal直接执行pytest或py.test,此时会自动去查找当前路径下符合规范的所有py文件并执行符合规范的测试用例

pytest测试框架

2、pytest -v 打印详细运行的日志信息,比如每条用例的文件路径和属于哪个类

pytest测试框架

3、pytest -s 带控制台输出结果,当代码中有print输出语句,如果想在运行结果中打印print的信息,可以加-s参数

pytest测试框架

4、pytest -k 运行含有某个关键字的一类用例,使用方法如下:

pytest -k ‘classname’ 运行类里所有方法,这里的匹配不是精准匹配,而是模糊匹配

pytest -k ‘methodname’ 运行某个方法,同理,模糊匹配

pytest -k ‘name1 or name2’ 运行匹配的所有用例,or为并列关系,模糊匹配

pytest -k ‘classname and not methonname’ 运行类里所有方法,不包含某个方法

5、pytest -x 遇到失败用例立即停止运行

6、pytest –maxfail=[num] 用例失败个数达到设定值时停止运行

7、pytest -m [标记名] 将运行有@pytest.mark.[标记名]这个标记的测试用例,在自动化过程中可以将测试用例添加标签进行分类

8、–lf,–last-failed 运行上一次执行失败的用例,上一次没有失败的用例则全部执行

9、–ff,–failed-first 先执行上一次失败的用例,后执行上一次成功的用例

10、pytest –collect-only 只收集用例,不执行用例

运行模式:

1、使用pycharm里面自带的调试方式,用例方法名前面有个绿色按钮,直接点击就即可运行

pytest测试框架

使用这种方式需要在pycharm中设置运行方式为pytest,File-Settings-Tools-Python Integrated Tools

pytest测试框架

2、使用pytest运行

pytest 文件名.py 单独执行某个py文件

pytest 文件名.py::类名 单独执行某个py文件中的类

pytest 文件名.py::类名::方法名 单独执行某个py文件下某个类的某个方法

3、使用python解释器运行

pytest参数化用例

应用场景:测试数据是传入的,测试的预期结果也是传入的,两个不同的参数一一对应

1、通过@pytest.mark.parametrize(argnames, argvalues)来进行参数化

argnames:要参数化的变量,string(用逗号分隔),list,tuple

argvalues:argnames每个对应的要参数化的值,list,list[tuple],需要和argnames一一对应

@pytest.mark.parametrize(['a', 'b'], [(1, 2), (2, 3)])
def test_param(a, b):
    c = a + b
    print(f"{a} + {b} eq {c}")

上图中的参数化的代码也可以修改为以下几种方式:

@pytest.mark.parametrize(('a', 'b'), [(1, 2), (2, 3)])
@pytest.mark.parametrize("a, b", [(1, 2), (2, 3)])

上面test_param代码运行结果如下:可以看到这一个用例的代码,运行结果有2条测试用例[(1-2),(2-3)],因为输入进行的参数化,并且测试用例的名称是自动生成的,格式:方法名[参数值-参数值]

pytest测试框架

可以在parametrize参数中传入ids参数,将pytest自动命名的名称替换为ids中定义的名称

@pytest.mark.parametrize("a, b", [(1, 2), (2, 3)], ids=["case1", "case2"])
def test_param(a, b):
    c = a + b
    print(f"{a} + {b} eq {c}")

pytest测试框架

2、参数的堆叠使用

参数的堆叠使用
@pytest.mark.parametrize("a", [0, 1])
@pytest.mark.parametrize("b", [2, 3])
def test_param2(a, b):
    c = a + b
    print(f"{a} + {b} eq {c}")

运行的输出结果:根据参数堆叠,可以生成不同组合的测试数据

pytest测试框架

3、通过yml数据文件来进行用例参数化(数据驱动,也可以使用json、excel等数据文件)

可以将1章节的参数化的数据写入一个yml文件中,通过读取yml中已经预置好的数据进行参数化

yml的基础教程参考:https://www.runoob.com/w3cnote/yaml-intro.html

步骤1:首先新建一个data.yml文件,并在文件中写入如下数据:

pytest测试框架

步骤2:在参数化中采用读取yml文件内容的方式将数据传入:

通过yml文件读取测试数据,需要在文件开始导入yaml模块
@pytest.mark.parametrize("a, b", yaml.safe_load(open("./data.yml"))['datas'],
                         ids=yaml.safe_load(open("./data.yml"))['ids'])
def test_param3(a, b):
    c = a + b
    print(f"{a} + {b} eq {c}")

步骤3:运行结果:

pytest测试框架

以上内容可以进一步的优化或者封装:

1、将yaml.safe_load(open(“./data.yml”))[‘datas’]使用函数封装后直接调用

定义获取yml文件数据函数
def get_datas():
    with open("./data.yml") as f:
        yml_data = yaml.safe_load(f)
        print(yml_data)
        datas = yml_data['datas']
        ids = yml_data['ids']
        return [datas, ids]

@pytest.mark.parametrize("a, b", get_datas()[0], ids=get_datas()[1])
def test_param4(a, b):
    c = a + b
    print(f"{a} + {b} eq {c}")

pytest -m参数详解

pytest -m [标记名] 将运行有@pytest.mark.[标记名]这个标记的测试用例,在自动化过程中可以将测试用例添加标签进行分类,比如将测试用例的等级进行分类,基本功能用例,冒烟用例等

比如,如下代码段,两个测试用例分别标记了label1和label2

class TestDemo:
    @pytest.mark.label1
    def test_haha(self):
        assert 1 == 1

    @pytest.mark.label2
    def test_hehe(self):
        assert 2 == 3

1、可以使用pytest -m “label1” test_mark.py只运行标记了label1的测试用例,运行结果为1条用例:test_haha

2、可以使用pytest -m “label1 or lable2” test_mark.py运行标记了label1或者label2的测试用例,运行结果为2条用例

3、将test_hehe的用例改为如下标记,一个用例可以标记多个标签:

@pytest.mark.label1
@pytest.mark.label2
    def test_hehe(self):
        assert 2 == 3

那么可以使用pytest -m “label1 and lable2” test_mark.py运行同时标记了label1和label2的测试用例,运行结果为1条用例:test_hehe

4、使用自己定义的标记名执行用例时,运行结果会出现warning,可以使用pytest.ini文件配置自定义标签后消除warning信息

在同级目录下创建一个pytest.ini文件,并进行如下设置:

[pytest]
markers = label1
          label2

pytest的框架结构

pytest提供了setup和teardown的方法来实现用例的前置和后置条件,比如某一类用例需要在执行步骤之前进行登录,执行完成后退出登录,登录和退出登录的操作可以同一使用一个方法来进行覆盖

根据用例的运行级别可以分为以下几类:

模块级:setup_module,teardown_module,在模块的开始调用setup_module方法,结束调用teardown_module方法,在python中,一个py文件就是一个模块

函数级:setup_function,tearndown_function,在函数的开始和结束分别调用那两个方法(不在类中的函数,setup开始,teardown结束)

类级:setup_class,tearndown_class,在类的开始和结束分别调用两个方法

方法级:setup_method,teardown_method,在方法的开始和结束分别调用(专门用于类里面的方法)

方法级:setup,teardown,如果在类里面定义,使用范围和setup_method、teardown_method一样;如果在类外面定义,使用范围和setup_function、teardown_function一样

调用的顺序:

setup_module>setup_class>setup_method>setup>teardown>teardown_method>tearndown_class>teardown_module

自定义pytest的运行规则:

1、自定义标记名,跟上面的pytest -m运行参数配合使用的,自定义了之后可以消除warning

2、自定义运行时增加的默认参数

addopts = -vs

3、自定义可以被pytest识别的运行文件、运行类、运行用例等

[pytest]
markers = label1
          label2
addopts = -vs
python_files = check* test*
python_classes = Test*
python_funtions = check_* test_*

Original: https://blog.csdn.net/gchh_spring/article/details/112380036
Author: gchh_spring
Title: pytest测试框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/775678/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django Form组件

    Django Form 组件有两大功能,用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交对数据进行校验(显示错误信息) 数据重置 校验规则 form组件和传统for…

    Python 2023年8月4日
    064
  • PyCharm快速创建Web项目(Flask)

    一般步骤: 1、文件-新建项目 2、选择Flask 3、选择环境、选择Python安装位置,然后创建 4、结果(等待) 5、运行 控制台出现:Running on http://1…

    Python 2023年8月9日
    069
  • python绘制一个简单的函数图像使用到了matplotlib库和numpy库

    文章目录 效果展示: 视频链接 实现的思想 使用到的函数包 图片一对应的代码展示 图片二 对应的代码展示 注意事项 效果展示: ; 视频链接 python绘制一个简单的函数图像(B…

    Python 2023年9月1日
    053
  • SQL Archery 代码说明及优化(一)

    1.字段加密–django-mirage-field 一个django模型字段,在保存到数据库时对数据进行加密,在从数据库获取数据时进行解密。它使数据库中的数据始终加密…

    Python 2023年11月2日
    049
  • 03 最小CMake项目

    03 最小CMake项目 所有CMake项目都从一个CMakeLists.txt文件开始,此文件应该放在源代码树的最顶层目录下。可以将CMakeLists.txt想象成CMake项…

    Python 2023年10月22日
    037
  • pandas提取时间里面的年月日_Pandas怎样解析日期的年月日

    哈喽大家好,我是蚂蚁啊,给大家分享个Pandas的小知识。 如果一个数据文件中,有一列是日期列,怎样快速提取日期的年、月、日、周、季等信息呢? 方法就是pandas提供的to_da…

    Python 2023年8月19日
    072
  • Python 这几种方法进行机器学习特征筛选,有效提升模型性能

    大家好,今天我来说说如何对数据集进行特征筛选,有时候我们拿到的数据集是非常庞大的,但模型其实真的不需要这么多的数据,减少冗余的数据必不可少,这样可以带来很多的好处,例如 提高预测的…

    Python 2023年8月8日
    073
  • 【HTTP】HTTP Stream 模式,服务端判断请求是否存在

    要实现一个基本的 服务器,你需要完成以下步骤: 1. 创建一个TCP套接字并绑定到一个端口 2. 监听传入的连接 接受连接 并处理客户端 解析 处理 并生成 响应 6. 发送 响应…

    Python 2023年8月13日
    057
  • Linux系统中GCC编译环境的安装

    Linux操作系统是免费开源的系统软件,允许用户编译安装自己编写的系统软件和应用软件,但是在安装Linux操作系统的时候一般默认是不安装编译环境的,所以当用户需要编译安装软件时,必…

    Python 2023年6月6日
    088
  • 人工智能:支持向量机SVM 练习题(带解析)

    1.对于线性可分的二分类任务样本集,将训练样本分开的超平面有很多,支持向量机试图寻找满足什么条件的超平面?(A) A.在正负类样本”正中间”的B.靠近正类样…

    Python 2023年9月27日
    0105
  • ORM增删改查并发性能测试2

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月22日
    023
  • Scrapy 框架架构

    Scrapy 框架架构 目录 Scrapy 框架架构 前言 一、核心组成 二、数据流 三、项目结构 总结 前言 Scrapy (/ˈskreɪpaɪ/) 是一个用于抓取网站和提取结…

    Python 2023年10月1日
    033
  • 论文复现|Panoptic Deeplab(全景分割PyTorch)

    摘要:这是发表于CVPR 2020的一篇论文的复现模型。 本文分享自华为云社区《Panoptic Deeplab(全景分割PyTorch)》,作者:HWCloudAI 。 这是发表…

    Python 2023年10月29日
    070
  • 医学影像人工智能实战(一):医学图像格式(nii和dicom)

    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped …

    Python 2023年6月3日
    0144
  • 零基础入门数据挖掘——二手车交易价格预测:baseline

    零基础入门数据挖掘 – 二手车交易价格预测 赛题理解 比赛要求参赛选手根据给定的数据集,建立模型,二手汽车的交易价格。 赛题以预测二手车的交易价格为任务,数据集报名后可…

    Python 2023年10月24日
    030
  • 利用matplotlib绘制圆环图的案例

    一、概念介绍 圆环图(Donut Chart),又称为环形图,甜甜圈图。它从饼图变形而来,单环的作用上与饼图相似,用于展示定性数据中小类占大类的比例关系。 Q:那既然都有饼图了,为…

    Python 2023年9月1日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球