• Pytest自动化测试框架


     fixture

    特点:

    1. 命令灵活:对于setup,teardown可以省略

    2. 数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入,可以跨文件共享

    3. scope的层次及神奇的yield组合相当于各种setup和teardown

    4. 实现参数化

    应用

    • 场景:

    测试用例执行时,有的用例需要登录才能执行,有些用例不需要登录。

    setup和teardown无法满足这种情况,但是fixture可以。默认scope(范围):function

    • 步骤:

      1. 导入pytest

      2. 在登录的函数上添加@pytest.fixture()

      3. 在要使用的测试方法中传入(登录函数名称)

      4. 不传入的就不登录,直接执行测试方法。

    fixture作用域

    取值范围说明
    function函数级每一个函数或方法都会调用
    class类级别每个测试类只执行一次
    module模块级每个.py文件调用一次
    package包级每个python包只调用一次(暂不支持)
    session会话每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

    session是在整个项目中只执行一次的代码

    yield关键字

    场景:

    你已经可以将测试方法【前要执行的或依赖的】解决了,那测试方法后销毁清除数据要如何进行?

    解决:

    通过在fixture函数中加入yield关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回。

    步骤:

    @pytest.fixture(scope=module)

    在登录的方法中加yield,之后加销毁清除的步骤

    1. import pytest
    2. @pytest.fixture()
    3. def login():
    4. # setup
    5. token = '1235236fdg'
    6. print("登录功能")
    7. yield token# 相当于return 返回none
    8. # teardown
    9. print("退出登录操作")
    10. def test_search():
    11. print("搜索功能")
    12. def test_cart(login):
    13. print(f"token:{login}")
    14. print("购物车")

    '

    运行

    运行

    数据共享

    场景:

    你与其他工程师合作一起开发时,公共的模块要在不同文件中,要在大家都访问的到的地方

    解决:

    使用conftest.py这个文件进行数据共享,并且它可以放在不同位置起着不同的范围共享作用

    • 前提:

      1. conftest文件名不能换

      2. 放在项目下是全局的数据共享

    • 执行:

      1. 系统执行到参数login时先从本模块中查找是否有这个名字的变量之类的

      2. 之后在conftest.py中找是否含有

    • 步骤:

    将登录模块带@pytest.fixture写在conftest.py

    自动应用

    • 场景:

    不想原测试方法有任何改动,或全部都自动实现自动应用,没特例,也都不需要返回值时可以选择自动应用的方法

    • 解决:

    使用fixture中的参数autouse=True实现

    • 步骤:

    在方法上面加@pytest.fixture(autouse=Ture)

    参数化

    • 场景:

    测试离不开数据,为了数据灵活,一般数据都是通过参数传的

    • 解决:

    使用fixture中的固定参数request传递

    • 步骤:

    在fixture中添加@pytest.fixture(params=[1,2,3,'linda'])

    在方法参数写request,方法体里面使用request.param接受参数

    1. @pytest.fixture(params=['hogwarts','joker'])
    2. def demo_params(request):
    3. print(f'用户名为:{request.param}')
    4. return request.param
    5. def test_demo(demo_params):
    6. print(f"数据为:{demo_params}")
    • 注意:fixture的参数是params,而调用的时候是request.param,没有s

    总结:

    1. 模拟setup,teardown(一个用例可以引用多个fixture)

    2. yield的用法

    3. 作用域(session,module,类级别,方法级别)

    4. 自动执行(autouse参数)

    5. conftest.py用法,一般会把fixture写在conftest.py文件中

    6. 实现参数化

    pytest.ini文件

    1. pytest.ini是pytest的配置文件

    2. 可以修改pytest的默认行为

    3. 不能使用中文符号,包括汉字,空格 ,引号,冒号等

    作用:

    1. 修改用例的命名规则

    2. 配置日志格式,比代码配置方便很多

    3. 添加标签,防止运行过程报警告错误

    4. 指定执行目录

    5. 排除搜索目录

    改变pytest运行规则

    1. [pytest]
    2. ;执行check_开头的所有文件
    3. python_files = check_* test_*
    4. ;执行所有的以Test和Check开头的类
    5. python_classes = Test* Check*
    6. ;执行所有以test_和check_开头的方法
    7. python_functions = check_* test_*
    • 注意:win系统的pytest.ini文件不能写中文,注释也不行

    pytest配置-添加默认参数

    addopts = -v -s --alluredir=./results

    指定/忽略执行目录

    1. ;设置执行得路径
    2. ;testpaths = bilibili baidu
    3. ;忽略某些文件夹/目录
    4. norecursedirs = result logs datas test_demo*

    插件开发

    • pytest插件分类

      1. 外部插件:pip install 安装的插件

      2. 本地插件:pytest自动模块发现机制(conftest.py存放的)

      3. 内置插件:代码内部的_pytest目录加载(hook函数)

    官网:PyPI · The Python Package Index

    常用插件

    每一种测试框架收集测试用例的顺序是不一样的

    pytest执行顺序控制

    • 场景:

    对于集成测试,经常会有上下文依赖关系的测试用例。如十个步骤,拆分成十个case,这时候能知道到底执行到哪步报错。

    用例默认执行顺序:自上而下执行

    • 解决:

    可以通过setup,teardown和fixture来解决,也可以使用pytest-ordering插件来解决

    • 安装:pip install pytest-ordering

    • 用法:@pytest.mark.run(order=2)

    • 注意:多个插件装饰器(>2)的时候,有可能会发生冲突

    并行与分布式并发执行(xdist)

    场景1:

    • 测试用例1000条,一个用例执行1分钟,一个测试人员需要1000分钟,通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会缩短。这就是一种分布式场景。

    场景2:

    • 假设有个报名系统,对报名总数进行统计,数据同时进行修改操作的时候有可能出现问题,需要模拟这个场景,需要多用户并发请求数据

    解决:

    • 使用分布式并发执行测试用例,分布式插件:pytest-xdist

    • 安装:pip install pytest-xdist

    • 注意:用例多的时候效果明显,多进程并发执行,同时支持allure

    hook函数

    1. 介绍

    • 是个函数,在系统消息触发时被系统调用

    • 自动触发机制

    • Hook函数的名称是确定的

    • pytest有非常多的hook函数

    • 使用时直接编写函数体

    • 执行是有先后顺序的

    • 可以在不同阶段实现不同的功能

    pytest执行过程

    执行顺序:

    pytest编写插件1-修改默认编码

    pytest_collection_modifyitems收集上来的测试用例实现定制化功能

    解决问题:

    • 自定义用例的执行顺序

    • 解决编码问题(中文的测试用例名称)

    • 自动添加标签

    1. from typing import List
    2. # 修改编码的hook函数
    3. def pytest_collection_modifyitems(
    4. session: "Session", config: "Config", items: List["Item"]
    5. ) -> None:
    6. # items里的name是测试用例的名字,nodeid是测试用例的路径
    7. print(items)
    8. for item in items:
    9. # 如果想改变unicode编码格式的话,需要先encode成utf-8格式的,再decode成unicode-escape就可以了
    10. item.name = item.name.encode('utf-8').decode('unicode-escape')
    11. item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
    编写插件2-添加命令行参数
    1. # 定义命令行参数的hook函数
    2. def pytest_addoption(parser):
    3. # group 将下面所有的option都展示在这个group组下
    4. mygroup = parser.getgroup('hogwarts')
    5. mygroup.addoption('--env', # 注册一个命令行选项
    6. default='test', # 参数的默认值
    7. dest='env', # 存储的变量,为属性命令,可以使用option对象访问到这个值
    8. help='set your run env') # 帮助提示,参数的描述信息
    9. @pytest.fixture(scope='session')
    10. def cmd_option(request):
    11. # request获取命令行的参数,config拿到pytest相关配置,getoption拿到命令行参数
    12. return request.config.getoption('--env')

    打包发布

    打包项目构成:

    • 源码包

    • setup.py

    • 测试包

    1. from setuptools import setup, find_packages
    2. setup(
    3. name='pytest_encode',
    4. url='',
    5. version='1.0', # 版本
    6. author='joker', # 作者
    7. author_email='', # 邮箱
    8. description='set your encoding and logger', # 描述用法
    9. long_description='Show Chinese for you mark.parametrize().', # 完整描述
    10. classifiers=[ # 分类索引,pip所属包的分类,方便在pip官网中搜索
    11. 'Framework :: Pytest',
    12. 'Programming Language :: Python',
    13. 'Topic :: Software Development :: Testing',
    14. 'Programming Language :: Python :: 3.8',
    15. ],
    16. license='proprietary', # 程序授权信息
    17. packages=find_packages(), # 通过导入的方式发现当前项目下所有的包
    18. keywords=[ # 便于pip进行分类
    19. 'pytest', 'py.test', 'pytest_encode'
    20. ],
    21. # 需要安装的依赖
    22. install_requires=[
    23. 'pytest'
    24. ],
    25. # 入口模块,或者入口函数(最重要的)
    26. entry_points={
    27. 'pytest11': [
    28. 'pytest_encode = pytest_encode.main'
    29. ]
    30. },
    31. zip_safe=False
    32. # 针对win系统,不设置成false会出错
    33. )

    打包命令

    依赖包安装:

    • pip install setuptools python的包管理工具,负责安装和发布,尤其是安装拥有依赖关系的包

    • pip install wheel 生成 *.whl格式的安装包,本质上也是一个压缩包

    打包命令:(切到setup.py所在的目录下执行)

    python setup.py sdist bdist_wheel

    dist目录下.whl的文件,可以通过pip install 下载

    发布命令
    • python3 -m pip install --user --upgrade twine ## 安装twine工具

    • python3 -m twine upload --repository testpypi dist/* ## 上传代码

    行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群:,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 相关阅读:
    three.js创建基础模型
    【LeetCode最详尽解答】15-三数之和 3sum
    重要通告 | 公司更名为“浙江实在智能科技有限公司”
    基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)
    数仓4.0(三)------数据仓库系统
    计算机网络---UDP协议
    Windows系统管理一:操作系统概述
    File类与IO流相关面试知识(一)
    基于Echarts实现可视化数据大屏治理运行分析云图
    SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine
  • 原文地址:https://blog.csdn.net/qq_48811377/article/details/140405151