当前位置: 首页 > news >正文

pytest 框架学习总结

视频:pytest01-快速上手_哔哩哔哩_bilibili

资料:pytest 框架 - 白月黑羽

基于 Python 语言的自动化测试框架 最知名的 有如下 3 款unittest、pytest、robotframework

前两款框架主要(或者说很大程度上)是 聚焦 在 白盒单元测试而 robotframework 主要聚焦在 系统测试。

pytest可以利用第三方插件,生成表报。

安装:

安装直接执行命令:pip install pytest

还需要产生测试报表,执行如下命令安装:pip install pytest-html

快速上手:

测试用例代码规格:我们编写的测试用例代码文件, 必须以 test_ 开头,或者以 _test 结尾

要求:类名(Class 类名)必须以Test为前缀,其中的类方法(def 类方法)必须以test为前缀。

pytest 中用例的检查点 直接用 Python 的 assert 断言。assert 后面的表达式结果 为 True ,就是 检查点 通过,结果为False ,就是检查点 不通过。和hytest中的check_point()方法不一样。

执行:pytest  或者pytest+对应目录。直接执行 pytest 命令不会将当前目录设置为模块搜索路径
所以更推荐 执行命令 python -m pytest 。

目前 项目根目录 中 只有一个cases 目录用例存放测试用例, 将来还会有其他目录,比如:lib目录存放库代码、cfg目录存放配置数据 等等。为了防止 pytest 到其他目录中找测试用例项,执行测试时,我们可以在命令行加上目标目录 cases ,就是这样:python -m pytest cases

产生报告:python -m pytest cases --html=report.html --self-contained-html

初始化清除:

对自动化测试框架来说,初始化清除功能 至关重要。

模块级别模块级别 的初始化、清除 分别 在整个模块的测试用例 执行前后执行,并且 只会执行1次 。定义 setup_module 和 teardown_module 全局函数。和hytest中的名称不一样。

def setup_module():print('\n *** 初始化-模块 ***')def teardown_module():print('\n ***   清除-模块 ***')

类级别类级别 的初始化、清除 分别 在整个类的测试用例 执行前后执行,并且 只会执行1次。定义 setup_class 和 teardown_class 类方法。主要是用来为该  中的所有测试用例做 公共的 初始化 和 清除。

def setup_module():print('\n *** 初始化-模块 ***')def teardown_module():print('\n ***   清除-模块 ***')class Test_错误密码:@classmethoddef setup_class(cls):print('\n === 初始化-类 ===')@classmethoddef teardown_class(cls):print('\n === 清除 - 类 ===')

方法级别:方法级别 的初始化、清除 分别 在类的 每个测试方法 执行前后执行,并且 每个用例分别执行1次定义 setup_method 和 teardown_method 实例方法

class Test_错误密码:@classmethoddef setup_class(cls):print('\n === 初始化-类 ===')@classmethoddef teardown_class(cls):print('\n === 清除 - 类 ===')def setup_method(self):print('\n --- 初始化-方法  ---')def teardown_method(self):print('\n --- 清除  -方法 ---')

目录级别:目标级别的 初始化清除,就是针对整个目录执行的初始化、清除。需要在初始化的目录下面创建 一个名为 conftest.py 的文件,里面内容如下所示

import pytest @pytest.fixture(scope='package',autouse=True)
def st_emptyEnv():print(f'\n#### 初始化-目录甲')
//这里清除环境的代码就是 yield 之后的代码。 这是一个生成器yieldprint(f'\n#### 清除-目录甲')

挑选用例执行:

指定一个模块:python -m pytest cases\登录\test_错误登录.py
指定目录:python -m pytest cases
指定模块里面的函数或者类:python -m pytest cases\登录\test_错误登录.py::Test_错误密码

根据名字:使用 命令行参数 -k 后面加名字来挑选要执行的测试项.
例如:python -m pytest -k C001001 -s

-k 后面的名字:可以是测试函数的名字,可以是类的名字,可以是模块文件名,可以是目录的名字;是大小写敏感的;不一定要完整,只要能有部分匹配上就行;可以用 not 表示选择名字中不包含。

根据标签:需要先给标签,然后再使用此方法-m。标签也支持中文.

import pytestclass Test_错误密码2:@pytest.mark.webtest    //或者@pytest.mark.网页测试def test_C001021(self):print('\n用例C001021')assert 1 == 1

然后,可以这样运行指定标签的用例:python -m pytest cases -m webtest -s

Pytest 助手:

大佬开发的助手。看看即可。

实战案例:

这样执行命令

python -m pytest cases -sv

因为 -m 这种执行模块的方式运行python, 会自动把当前工作目录作为模块搜索路径,这样就能避免Python解释器 搜索不到 库文件的问题 ModuleNotFoundError: No module named 'xxxx'

但是,实际上仍然会出现这种问题。如果以上方法没能解决。可以尝试使用:pip install pytest。

这样就会在类方法旁边形成一个可以运行的按钮。直接点击运行按钮即可。

数据驱动:

和hytest的用法一样。只是方法名不一样。简约很多了!!!

class Test_错误登录:@pytest.mark.parametrize('username, password, expectedalert', [(None, '88888888', '请输入用户名'),('byhy', None, '请输入密码'),('byh', '88888888', '登录失败 : 用户名或者密码错误'),('byhy', '8888888', '登录失败 : 用户名或者密码错误'),('byhy', '888888888', '登录失败 : 用户名或者密码错误'),])def test_UI_0001_0005(self, username, password, expectedalert):alertText = loginAndCheck(username, password)assert alertText == expectedalert

调试:

添加断点。

使用 fixture(清除):

使用方法:相比前面讲的初始化清除方法,fixture 最大的特点是:声明式使用。就是:测试方法需要那个初始化清除,就在参数里面声明它。先来看初始化:其实就是依赖注入。

# 定义一个fixture函数 @pytest.fixture def createzhangSan(): 。。。  //会先执行此函数方法

这就是 pytest 的 denpendcy injection 中文称之为 : 依赖注入 

清除:如果需要清除,最推荐的使用 yield 代替 return , yield后面的代码就是清除部分的代码。

fixture 参数:需要根据参数来创建不同的用户,就需要使用 parametrize 装饰器,并指定参数 indirect=True

fixture学的东西较多,暂时跳过,后面用到时可以翻阅资料在写。


http://www.mrgr.cn/news/94582.html

相关文章:

  • 论Linux进程间通信
  • 高德地图猎鹰服务调用指南(Java后端)
  • Flutter三棵树是什么,为什么这么设计
  • 使用kubeadm方式以及使用第三方工具sealos搭建K8S集群
  • synchronized与 Java内置锁(未写完)
  • 嵌入式八股C语言---面向对象篇
  • 【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现
  • 备赛蓝桥杯-Python-Day1-基础语法回顾
  • Java 学习记录:基础到进阶之路(二)
  • windows安装两个或多个JDK,并实现自由切换
  • 【VUE】day03-vue过滤器、计算属性、vue-cli、vue组件
  • Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
  • 蓝桥杯Python赛道备赛——Day5:算术(一)(数学问题)
  • 网络协议栈
  • 【动态规划】- 线性dp
  • SSO单点登录
  • 011【fate/extra link】【概率论与数理统计】大数定律与中心极限定理 ,数理统计的基本概念,常用的统计三大分布,正态总体的抽样分布定理
  • 理解C++值类别(lvalue, rvalue, prvalue, xvalue)
  • 【C++】—— 一篇文章解决面试 继承菱形继承
  • 深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对