python web自动化(Pytest实战)

1.UnitTest框架与Pytest框架对⽐

                1) unittest框架介绍
                Unittest则是Python语⾔的标准单元测试框架。 Unittest⽀持⾃动化测试,测试⽤例的初                始化、关闭和测试⽤例的聚合等功能,它有⼀个很重要的特性:它是通过类(class)的⽅                   式,将测试⽤例组织在⼀起

                2) pytest框架介绍:

                        Pytest是Python的另⼀个第三⽅单元测试库。提供更简单、更灵活、更强⼤的测试                    框架,以便于编写和执⾏测试⽤例。它提供了许多有⽤的功能和插件,能够⾃动发现                    测试⽤例、丰富的断⾔⽀持、参数化测试、丰富的插件系统等等,使得测试更加容易 管 

                    理和执⾏。

                        

                pytest 安装和配置:

                1.使⽤命令进⾏安装: pip install pytest 2.验证安装成功的命令: pytest --version 3.运                     ⾏模式的配置,把pycharm的运⾏模式改为pytest

                 pytest框架默认的⽤例运⾏规则:

                1.pytest将在当前⽬录及其⼦⽬录中运⾏所有格式为 test**.py 或者 **test.py ⽂件

                2.测试⽅法/测试函数 默认必须是 test开头

                3.测试类必须是 Test开头

                4. 测试类不能有构造⽅法__init__

2.Pytest的常⽤应⽤

               断⾔pytest

                借助Python的运算符号 和 assert关键字 来实现的。

                

def test_kkk_01():
print("kkk")
# 测试相等
assert 1 == 2

        

        pytest框架的常⽤参数:


                -s 输出打印信息到控制台:pytest.main(['-s'])

                 " -s" 参数 ⽤于关闭捕捉,从⽽输出打印信息到控制台

                -v ⽤于显示具体的⽤例执⾏信息:pytest.main(['-v'])

                -k 运⾏名称中包含某字符串的测试⽤例:pytest.main(['-k','kkk'])
 

                -q 简化输出信息:pytest.main(['-q'])

                -x 失败就退出:pytest.main(['-x'])



                指定⽬录以及特定类或⽅法执⾏:

                 pytest.main(['-s','./doc/test_112233.py::TestShopping::test03'])

                ⽣成简单的测试报告:

                    pytest.main(['--junit-xml=./report/junit_report01.xml'])

                ⽤例失败控制:

                在第N个很⽤例失败之后,结束测试执⾏:

                pytest.main(['--maxfail=2'])

                通过标记表达式取执⾏:
                这条命令会执⾏被装饰器 @pytest.mark.smoke 装饰的所有测试⽤例

                注:需要先在pytest.ini ⽂件中注册⾃定义标记

                pytest.main(['-m','smoke'])

                

                多进程运⾏⽤例:

                        

# 单线程运行方式# pytest.main(['-vs', 'test_02 多线程执行用例.py'])# 将测试执行发送给多个cpu# pytest.main(['-vs', '-n', '3', 'test_02 多线程执行用例.py'])# 使用与计算机具有cpu内核一样多的进程# pytest.main(['-vs', '-n', 'auto', 'test_02 多线程执行用例.py'])

                        

重新运⾏失败⽤例:
 

 # 在每次重跑之间,增加⼀次延迟时间pytest.main(['--reruns', '3','--reruns-delay','2','test_rerun.py'])# 重新运⾏所有测试失败⽤例pytest.main(['--reruns', '3', 'test_rerun.py'])

 pytest的 setup 和 teardown 函数

           setup_module/teardown_module: 在当前⽂件中,所有的⽤例执⾏之前执⾏

# ---> 在当前⽂件中,所有的⽤例执⾏之前/后执⾏
# def setup_module(module):
# print("setup_module --->")
# #
# def teardown_module(module):
# print("teardown_module --->")


        setup_function/teardown_function: 在每个测试函数之前和之后执⾏
        

# ---> 在每个测试函数之前和之后执⾏
# def setup_function(function):
# print("setup_function --->")
# #
# def teardown_function(function):
# print("teardown_function --->")

setup_method/teardown_method:在每个测试函数之前和之后执⾏(现在常用的方法)

# ---> 在每个测试函数之前和之后执⾏(在类中每次都执⾏,在类的外⾯,只执⾏⼀次)
class TestDemo:
def setup_method(self):
print("setup --->")
def teardown_method(self):
print("teardown --->")
# --- 测试⽤例 ---
def test_multiply_3_4(self):
print("test_multiply_3_4")
assert multiply(3, 4) == 12




                

  修改pytest框架的基本规则 

        我们在pytest.ini中修改规则

                

[pytest]
addopts = -vs
testpaths = ./testcase_set
python_files = demo_*.py
python_classes = Demo*
python_functions = demo*

        

[pytest]
; 01 命令行参数,默认加到执行过程中
addopts = -vs
; 02 指定要运行的测试目录
testpaths = ./testcase_set
; 03 指定要运行的测试文件规则
python_files = demo_*.py
; 04 指定要运行的类名规则
python_classes = Demo_*
; 05 指定要运行的测试用例名称规则
python_functions = demo*

                

                

3.Pytest⾼阶⽤法之函数数据参数化

                        parametrize⽅法:

                        

parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为⼀个时格式: [value]
当参数个数⼤于⼀个时,格式为:[(param_value1,param_value2.....),
(param_value1,param_value2.....)]使用方法
@pytest.mark.parametrize(argnames,argvalues)

代码示例:(单个参数)


import pytestdef get_data():return [("qsdd的账号", "qsdd的密码"), ("wang的账号", "wang的密码"), ("yeye的账号", "yeye的密码")]@pytest.mark.parametrize('get_value', get_data())  # 第一个值,用引号括起来,是自定义的参数
def test_login01(get_value):print(f"获取的账号信息:{get_value[0]}")print(f"获取的密码信息:{get_value[1]}")if __name__ == '__main__':pytest.main(['-vs', 'test_01 单个参数接收函数传值.py'])

多个参数:

        

""""""import pytestdef get_data():return [("qsdd的账号", "qsdd的密码"), ("wang的账号", "wang的密码"), ("yeye的账号", "yeye的密码")]@pytest.mark.parametrize('get_value', get_data())  # 第一个值,用引号括起来,是自定义的参数
def test_login01(get_value):print(f"获取的账号信息:{get_value[0]}")print(f"获取的密码信息:{get_value[1]}")if __name__ == '__main__':pytest.main(['-vs', 'test_01 单个参数接收函数传值.py'])

引用框架的装饰器完成单个传值

        

""""""import pytest@pytest.mark.parametrize('get_value', [("qsdd的账号", "qsdd的密码"), ("qq的账号", "qq的密码"), ("ss的账号", "ss的密码")])
def test_login01(get_value):print(f"获取的账号信息:{get_value[0]}")print(f"获取的密码信息:{get_value[1]}")if __name__ == '__main__':pytest.main(['-vs', 'test_03 引用框架的装饰器完成单个传值.py'])

引用框架的装饰器完成多个传值           

""""""import pytest@pytest.mark.parametrize('username, password', [("qsdd的账号", "qsdd的密码"), ("qs的账号", "qs的密码"), ("dd的账号", "dd的密码")])
def test_login01(username, password):print(f"获取的账号信息:{username}")print(f"获取的密码信息:{password}")if __name__ == '__main__':pytest.main(['-vs', 'test_04 引用框架的装饰器完成多个传值.py'])

        

4.Pytest之Fixture介绍

                        什么是fixture:在软件测试中, Fixture 是⼀种⽤于管理测试环境和测试数据的机制。它允许在测试函数或⽅法运⾏之前和之后执⾏特定的代码,以确保测试的可重复性和⼀致性。 Fixture 主要⽤于设置测试环境、准备测试数据、执⾏清理操作等,以便测试能够按预期运⾏

简单理解: 就是可以⽤它对需要执⾏的测试⽤例,设置前置或者后置操作

                示例如下

        

""""""
import pytest"""fixturn 快速入门
"""@pytest.fixture
def first_fix():return ['a']def test_01(first_fix):first_fix.append("qsdd")print("first_fix: ", first_fix)def test_02(first_fix):first_fix.append("测试")print("first_fix: ", first_fix)if __name__ == '__main__':pytest.main(['-vs', "test_01_fixture简单演示.py"])

        2.fixture配置作⽤域       

""""""
import pytest"""
# 知识拓展:1.当用例很多的时候,每次通过传参来调用fixture,会很麻烦。
fixture里面有个参数autouse,默认是False,没有开启的,
可以设置为True开启自动使用fixture功能,
这样用例就不用每次都去传参了。2.fixture里面还有个参数,scope,
定义被标记方法的作用域:session > module > class > function3."function":作用于每个测试方法,每个test都运行一次
4."class":作⽤于整个类,每个class的所有test只运⾏⼀次 ⼀个类中可以有多个⽅法
5."module":作⽤于整个模块,每个module的所有test只运⾏⼀次;每⼀个.py⽂件调⽤⼀次,该⽂件内⼜有多个
function和class
6."session":作⽤于整个session(慎⽤),每个session只运⾏⼀次;是多个⽂件调⽤⼀次,可以跨.py⽂件调⽤,每
个.py⽂件就是module
"""@pytest.fixture(autouse=True, scope="session")
def fix01():print("session 级别的fixture")@pytest.fixture(autouse=True, scope="module")
def fix02():print("module 级别的fixture")@pytest.fixture(autouse=True, scope="class")
def fix03():print("class 级别的fixture")# 测试用例:def test_a():print("test_a 用例执行")def test_d():print("test_d 用例执行")class TestCase:def test_b(self):print("test_b 用例执行")def test_c(self):print("test_c 用例执行")if __name__ == '__main__':pytest.main(['-vs', "test_02_fixture的作用域.py"])


 

5.Conftest.py(重要)

        conftest.py是pytest特有的本地测试配置⽂件,既可以⽤来设置项⽬级的Fixture,也可以⽤来导⼊外部插件,还可以⽤来指定Hook函数(钩⼦函数)
         conftest.py⽂件名称是固定 , pytest会⾃动识别该⽂件, 只作⽤于它所在的⽬录及⼦⽬录

                

""""""
import pytest"""不能自定义名称: conftest.py
"""@pytest.fixture
def fix1():print("conftest 中的 fix1 方法")

""""""
import pytestdef test01(fix1):print("test01 测试用例执行")assert 1 == 1if __name__ == '__main__':pytest.main(['-vs'])

结果看出,可以调用conftest中的函数

        

6.Conftest.py+fixture+yield 实现⽤例前置后置

提前在conftest.py中配置好前置、后置操作(通过conftest.py+fixture+yield,可轻松实现⽤例前置后置,包括项⽬级的

                

""""""
import pytestdef test01(fix1):print("test01 测试用例执行")if __name__ == '__main__':pytest.main(['-vs'])

""""""
import pytest@pytest.fixture
def fix1():a = "123"print("\n 测试用例的前置步骤/条件")yield aprint("\n 测试用例的后置步骤/条件")

        

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

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

相关文章

深度学习-转置卷积

转置卷积 转置卷积(Transposed Convolution),也被称为反卷积(Deconvolution),是深度学习中的一种操作,特别是在卷积神经网络(CNN)中。它可以将一个低维度的特征图&#x…

Java面试八股之有哪些线程安全的集合类

Java中有哪些线程安全的集合类 在Java中,并非所有的集合类都是线程安全的,但在多线程环境下,确保集合操作的线程安全性至关重要。以下是几个典型的线程安全集合类: Vector: 类似于ArrayList,但它是线程安全的。它通过…

搭建python环境

要想能够进行python开发,就需要搭建好python的环境。 需要安装的环境主要是两个部分: 运行环境:python 开发环境:pycharm 官方网站:https://www.python.org pycharm软件调节字体大小 pycharm 软件调节背…

QT C++ QTableWidget 演示

本文演示了 QTableWidget的初始化以及单元格值改变时响应槽函数,打印单元格。 并且,最后列不一样,是combobox ,此列的槽函数用lambda函数。 在QT6.2.4 MSVC2019 调试通过。 1.界面效果 2.头文件 #ifndef MAINWINDOW_H #define MAINWINDOW…

vue小记——小组件(1)

代码&#xff1a; <template><div><el-steps :active"active" finish-status"success" simple><el-step title"数据导入"><i class"fa fa-cloud-upload fa-icon-custom" slot"icon"></i…

大语言模型预训练新前沿:「最佳适配打包」重塑文档处理标准

源自&#xff1a;机器之心 "人工智能技术与咨询“ 发布 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&#xff0c;请立即联系…

BGP(一)边界网关协议

BGP协议基础 路由分类 直连路由 非直连路由&#xff08;间接路由&#xff09; 静态路由动态路由 IGP&#xff1a;内网网关路由协议&#xff08;在企业内部或数据中心内部使用&#xff09; DV&#xff1a;距离矢量路由协议RIP&#xff08;v1/v2&#xff09;IGRP——网络直径&…

【易生支付官网注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【会议征稿,IEEE独立出版】第四届计算机技术与信息科学国际研讨会(ISCTIS 2024)

第四届计算机技术与信息科学国际研讨会&#xff08;ISCTIS 2024)将于2024年7月12-14日在中国西安举行。大会将邀请国内外计算机技术与信息科学领域的知名专家学者出席会议&#xff0c;在大会上通过主题演讲、口头报告等方式与学者们分享最新研究成果、交流探讨学术难题。同时&a…

彩信JSON接口对接发送

随着通讯技术的飞速发展&#xff0c;传统的短信已经无法满足人们日益增长的沟通需求。在这样的背景下&#xff0c;群发彩信作为一种更为先进、更为丰富的信息传递方式&#xff0c;逐渐受到了企业和个人的青睐。那么&#xff0c;群发彩信应该怎么对接&#xff0c;又具体有哪些优…

模特百度百科怎么做出来的

百度百科是一个公正、开放、客观的平台&#xff0c;收录了大量的百科词条内容&#xff0c;形成了一定的“权威性”。以下是关于模特百度百科制作的具体步骤和注意事项&#xff1a; 准备阶段 收集资料&#xff1a;为了确保参赛作品的真实性和权威性&#xff0c;需要收集相关信息…

招展工作全面启动!2024深圳国际数字能源展览会

2024深圳国际数字能源展览会 2024 International Digital Energy Expo 时间:2024年9月8-11日 地点:深圳会展中心 指导单位&#xff1a; 国家能源局 深圳市人民政府 中国电力企业联合会 主办单位&#xff1a; 深圳市投资控股有限公司 深圳能源集团股份有限公司 深圳市资…

【Android14 ShellTransitions】(一)开篇

说来惭愧&#xff0c;AndroidU都已经开发这么久了&#xff0c;但是我还没有整理过ShellTransition相关的知识。我本来希望能够系统的写一篇关于ShellTransition的笔记出来&#xff0c;但是发现一来这是一个比较庞大的模块&#xff0c;二来我个人能力有限&#xff0c;对ShellTra…

插件“猫抓”使用方法 - 浏览器下载m3u8视频 - 合并 - 视频检测下载 - 网课下载神器

前言 浏览器下载m3u8视频 - 合并 - 网课下载神器 chrome插件-猫抓 https://chrome.zzzmh.cn/info/jfedfbgedapdagkghmgibemcoggfppbb 步骤&#xff1a; P.s. 推荐大佬的学习视频&#xff01; 《WEB前端大师课》超级棒&#xff01; https://ke.qq.com/course/5892689#term_id…

discuzX2.5的使用心得 札记一

从开始接受php论坛的开发任务&#xff0c;对php感兴趣的我开始迷恋上discuz这个产品了&#xff0c; 像戴志康这样的创新人才&#xff0c;是我们这代人的骄傲和学习的榜样 应该是了解一下&#xff0c;啥事discuzX2.5&#xff0c;百度看一下 discuz x2.5_百度百科 看完百度词条…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…

selenium 爬取今日头条

由于今日头条网页是动态渲染&#xff0c;再加上各种token再验证&#xff0c;因此直接通过API接口获取数据难度很大&#xff0c;本文使用selenium来实现新闻内容爬取。 selenium核心代码 知识点&#xff1a; 代码中加了很多的异常处理&#xff0c;保证错误后重试&#xff0c;…

SerDes系列之CTLE均衡技术

CTLE&#xff08;连续时间线性均衡&#xff09;是一种施加在接收器上的线性模拟高通滤波器&#xff0c;通过衰减低频信号分量&#xff0c;以补偿奈奎斯特频率附近的衰减比例&#xff0c;从而实现信道补偿。当低频信号分量向下衰减并推入底噪范围时&#xff0c;CTLE就会失去调节…

C#利用WinForm实现可以查看指定目录文件下所有图片

目录 一、关于Winform 二、创建应用 三、功能实现 四、代码部分 一、关于Winform Windows 窗体是用于生成 Windows 桌面应用的 UI 框架。 它提供了一种基于 Visual Studio 中提供的可视化设计器创建桌面应用的高效方法。 利用视觉对象控件的拖放放置等功能&#xff0c;可…

支付风险智能风控应用与评估指引

伴随宏观经济环境变化、支付监管愈趋从严、金融科技不断创新、支付参与主体日趋多元&#xff0c;支付行业正面临着业务发展与合规经营、支付便捷与安全、数据挖掘与隐私保护等诸多挑战&#xff0c;支付风险的复杂性与日俱增&#xff0c;共同建设安全支付生态的必要性不断凸显&a…