Python测试框架Pytest的基础入门

2023-11-19

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 items

test_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 + y

def 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 items

test_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 requests

def 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"])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python测试框架Pytest的基础入门 的相关文章

随机推荐

  • jquery实现checkbox全选、取消全选

  • Mac用自带软件QuickTime Player进行录屏

    Mac电脑用自带软件QuickTime Player进行录屏的教程 几步就可以学会 挺简单的 1 首先 找到并打开QuickTime Player软件 可以鼠标右键这个图标 选择 选项 在程序坞中保留 这样 软件就固定在了Dock栏 方便以
  • 一串有趣的代码

    啊哈 已经来学校四五天了 日子还不错 前些天遇见一段蛮有趣的 代码段 在 窗口输出常量 给大家分享分享 称的上是程序员的一点小浪漫吧 Protected Sub Button1 Click sender As Object e As Eve
  • 人体姿态估计数据集

    数据集 1 PASCAL VOC challenge voc挑战在2005年至2012年间展开 该数据集中有20个分类 该数据集包含11530张用于训练和验证的图像 以下是数据集中20个分类 人 鸟 猫 牛 狗 马 羊 飞机 自行车 船 巴
  • 打包工具 Inno Setup 介绍

    Inno Setup 详解中文资料 其一 使用教程 一 Inno Setup 是什么 InnoSetup 是一个免费的 Windows 安装程序制作软件 第一次发表是在 1997 年 Inno Setup 今天在功能设置和稳定性上的竞争力可
  • CPU缓存一致性动态图

    https www scss tcd ie Jeremy Jones VivioJS caches MESI htm
  • mysql常用工具

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 语法 mysql options database 参数 u user name 指定用户名 p password name 指定密码 h host name
  • js中精确判断对象类型--关于typeof 和Object.prototype.toString方法的区别

    在javascript中可以使用typeof来判断数据类型 但typeof只能判断区分基本类型 即number string boolean undefinded和object这5种
  • STM32定时器详解

    目录 前言 一 定时器基本介绍 1 STM32定时器 2 通用定时器功能和特点 3 计数器模式 4 定时器工作原理 a 定时器框图 b 时钟产生器部分 c 时基单元 d 输入捕获通道 e 输出比较通道 PWM 二 定时器中断应用 1 内部时
  • 【MySQL】表的基本操作

    1 数据类型 1 1 数值类型 数据类型 大小 说明 bit M M指定位数 默认为1 二进制 M范围从1到64 存储数值范围从0到2 M 1 tinyint 1字节 smallint 2字节 int 4字节 bigint 8字节 floa
  • Flutter沉浸式状态栏

    在Android 这入口activity 添加如下代码即可 Android 4 4 默认支持设置状态栏颜色 if Build VERSION SDK INT gt Build VERSION CODES LOLLIPOP API gt 21
  • MYSQL出错代码及出错信息对照

    MYSQL出错代码及出错信息对照 1005 创建表失败 1006 创建数据库失败 1007 数据库已存在 创建数据库失败 1008 数据库不存在 删除数据库失败 1009 不能删除数据库文件导致删除数据库失败 1010 不能删除数据目录导致
  • maven命令行以及配置整理

    mvn的相关概念 maven构建生命周期 mvn validate 验证 mvn compile 编译 mvn test 测试 mvn package 打包 mvn verify 检查 mvn install 安装 mvn deploy 部
  • python识别图片上的文字_Python如何识别图片中的文字 【转】

    Python如何识别图片中的文字 这里给个案例并附上详细步骤 模块包的安装 1 安装PIL pip install Pillow 2 安装pytesser3 pip install pytesser3 3 安装pytesseract pip
  • SpringBoot中通过AOP进行全局事务管理

    SpringBoot中使用AOP进行全局事务管理 不废话 直接上干货 实现步骤如下 第一步 pom文件中添加依赖
  • 软件工程基础复习_7

    第7章软件测试 软件验证是通过检查和提供客观证据表明软件已经满足规定的需求 是确保软件质量和降低软件成本的重要手段 进行软件验证的方式有两种测试和证明 软件测试又可以分为两类 静态测试和动态测试 静态测试又称评审 是对软件进行的一种分析和检
  • 前端搜索JS库 Elasticlunr.js

    有Github账号的小伙伴们 帮忙点赞啦 Star 本人写了一个JS的离线搜索库 支持Field search 采用BM25模型进行Ranking Ranking的算法和Elasticsearch一样的 效果比lunr js有很高提升 希望
  • 期权分仓开户资金是否安全?具体保障措施有哪些?

    网上关于期权分仓系统的真假一直都没有定论 两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑 那么期权分仓靠谱吗 资金在里面安全吗 下文为大家科普期权分仓开户资金是否安全 具体保障措施有哪些 一 期权分仓开户资金的安全性是一个重要的问
  • 延时任务!redis key失效监听,rabbitmq死信队列实现,线程池,任务调度==>实现超时订单/默认好评/定时考试等

    实现超时订单 超期默认好评等等很多常见需要用到延时任务 大概用几种做法 redis key失效监听 rabbitmq死信队列 调度线程池 定时调度 一 redis key失效监听实现 推荐 注意redis conf 放开 notify ke
  • Python测试框架Pytest的基础入门

    Pytest简介 Pytest is a mature full featured Python testing tool that helps you write better programs The pytest framework