Pytest进阶使用

fixture特点:

  • 命令灵活:对于setup , teardown可以省略
  • 数据共享:在conftest.py配置里写方法可以实现数据共享 , 不需要import导入 , 可以跨文件共享
  • scope的层次及神奇的yield组合相当于各种setup和teardown
  • 实现参数化
应用
  • 场景:
测试用例执行时,有的用例需要登录才能执行,有些用例不需要登录 。
setup和teardown无法满足这种情况,但是fixture可以 。默认scope(范围):function
  • 步骤:
    • 导入pytest
    • 在登录的函数上添加@pytest.fixture()
    • 在要使用的测试方法中传入(登录函数名称)
    • 不传入的就不登录,直接执行测试方法 。
fixture作用域取值范围说明function函数级每一个函数或方法都会调用class类级别每个测试类只执行一次module模块级每个.py文件调用一次package包级每个python包只调用一次(暂不支持)session会话每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法
  • session是在整个项目中只执行一次的代码
yield关键字
  • 场景:
你已经可以将测试方法【前要执行的或依赖的】解决了 , 那测试方法后销毁清除数据要如何进行?
  • 解决:
通过在fixture函数中加入yield关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回 。
  • 步骤:
@pytest.fixture(scope=module)
在登录的方法中加yield,之后加销毁清除的步骤
import pytest@pytest.fixture()def login():# setuptoken = '1235236fdg'print("登录功能")yield token# 相当于return 返回none# teardownprint("退出登录操作")def test_search():print("搜索功能")def test_cart(login):print(f"token:{login}")print("购物车")数据共享
  • 场景:
你与其他工程师合作一起开发时,公共的模块要在不同文件中,要在大家都访问的到的地方
  • 解决:
使用conftest.py这个文件进行数据共享 , 并且它可以放在不同位置起着不同的范围共享作用
  • 前提:
    • conftest文件名不能换
    • 放在项目下是全局的数据共享
  • 执行:
    • 系统执行到参数login时先从本模块中查找是否有这个名字的变量之类的
    • 之后在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接受参数
@pytest.fixture(params=['hogwarts','joker'])def demo_params(request):print(f'用户名为:{request.param}')return request.paramdef test_demo(demo_params):print(f"数据为:{demo_params}")
  • 注意:fixture的参数是params,而调用的时候是request.param,没有s
总结:
  • 模拟setup,teardown(一个用例可以引用多个fixture)
  • yield的用法
  • 作用域(session,module,类级别,方法级别)
  • 自动执行(autouse参数)
  • conftest.py用法,一般会把fixture写在conftest.py文件中
  • 实现参数化
pytest.ini文件
  • pytest.ini是pytest的配置文件
  • 可以修改pytest的默认行为
  • 不能使用中文符号 , 包括汉字,空格  , 引号,冒号等
作用:
  • 修改用例的命名规则
  • 配置日志格式,比代码配置方便很多
  • 添加标签,防止运行过程报警告错误
  • 指定执行目录
  • 排除搜索目录
改变pytest运行规则[pytest];执行check_开头的所有文件python_files = check_* test_*;执行所有的以Test和Check开头的类python_classes = Test* Check*;执行所有以test_和check_开头的方法python_functions = check_* test_*
  • 注意:win系统的pytest.ini文件不能写中文 , 注释也不行
pytest配置-添加默认参数

推荐阅读