9、ids参数说明

ids参数就是给每一个变量起一个别名。

示例:

import pytest

data = [("孙悟空", 666), ("猪八戒", 777), ("沙和尚", 888)]

# ids参数的个数要与params参数的个数相同,用的很少
@pytest.fixture(params=data, ids=['suk', 'zbj', 'shs'])
def need_data(request):
return request.param def test_data(need_data):
print(f"测试人物:{need_data[0]}")
print(f"测试分数:{need_data[1]}") if __name__ == '__main__':
pytest.main() """
之前的测试结果:
test_01.py::test_data[need_data0] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[need_data1] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[need_data2] 测试人物:沙和尚
测试分数:888
PASSED 加上ids参数后的执行结果:只是[]的内容变化了,这就是ids参数的作用
test_01.py::test_data[suk] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[zbj] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[shs] 测试人物:沙和尚
测试分数:888
PASSED
"""

10、name参数说明

name参数就是给Fixture修饰的方法起个别名。

示例:

import pytest

data = [("孙悟空", 666), ("猪八戒", 777), ("沙和尚", 888)]

# ids参数的个数要与params参数的个数相同,用的很少
@pytest.fixture(params=data, name="abc")
def need_data(request):
return request.param # 注意,如果定义了name属性,用例的方法参数就需要传入name属性定义的值。
# 否则将会报错。
# 还有用例中调用参数的使用,也需要使用name定义的别名。
# 即:当取了别名之后,那么原来的方法名就用不了了。
def test_data(abc):
print(f"测试人物:{abc[0]}")
print(f"测试分数:{abc[1]}") if __name__ == '__main__':
pytest.main() """
执行结果: test_01.py::test_data[abc0] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[abc1] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[abc2] 测试人物:沙和尚
测试分数:888
PASSED
"""

11、scope参数说明

scope参数有四个级别:function(默认)classmodulesession

作用范围:session > module > class > function

  • scope="function"@pytest.fixture()装饰器如果不写参数,默认参数就是scope="function"。它的作用范围是,在每个测试用例执行的前(后)运行一次。
  • scope="class"@pytest.fixture()装饰器为class级别的时候,Fixture方法只在此class里所有用例开始执行前(后)执行一次。与class中的function没有关系。
  • scope="module"@pytest.fixture()装饰器为module级别的时候,在一个.py脚本中所有用例开始执行前(后)执行一次。
  • scope="session"@pytest.fixture()装饰器为session级别的时候,是可以跨.py模块调用的,每个.py文件就是module

(1)scope="function"

import pytest

@pytest.fixture(scope="function")
def login():
print("打开APP")
print("输入账号,密码,进行登录")
yield # 当用例执行完成后,执行yield后的代码
print("关闭APP") def test_add_cart(login):
print("添加购物车--需要登录") def test_browser_goods():
print("浏览商品--不需要登录") if __name__ == '__main__':
pytest.main() """
执行结果: 只作用域方法或者函数范围 test_01.py::test_add_cart 打开APP
输入账号,密码,进行登录
添加购物车--需要登录
PASSED关闭APP test_01.py::test_browser_goods 浏览商品--不需要登录
PASSED
"""

(2)scope="class"

import pytest

@pytest.fixture(scope="class")
def login():
print("\nscope=class 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=class 作用域的后置函数") class Test_Demo: def test_add_cart(self, login):
print("添加购物车--测试用例") def test_add_address(self):
print("添加收货地址--测试用例") if __name__ == '__main__':
pytest.main() """
执行结果: 只在测试类开始前后执行了 scope=class 作用域的前置函数 添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED scope=class 作用域的后置函数
"""

(3)scope="module"

import pytest

@pytest.fixture(scope="module")
def login():
print("\nscope=module 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=module 作用域的后置函数") # 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods(login):
print("浏览商品--不需要登录") class Test_Demo: def test_add_cart(self, login):
print("添加购物车--测试用例") def test_add_address(self):
print("添加收货地址--测试用例") class Test_Demo2: def test_add_cart(self, login):
print("第2次-添加购物车--测试用例") def test_add_address(self):
print("第2次-添加收货地址--测试用例") if __name__ == '__main__':
pytest.main() """
执行结果:
说明一下:scope=module时,整个.py模块中fixture只执行一次 scope=module 作用域的前置函数 浏览商品--不需要登录
PASSED
test_01.py::Test_Demo::test_add_cart 添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED
test_01.py::Test_Demo2::test_add_cart 第2次-添加购物车--测试用例
PASSED
test_01.py::Test_Demo2::test_add_address 第2次-添加收货地址--测试用例
PASSED scope=module 作用域的后置函数 """

(4)scope="session"

test_01.py文件中的用例。

import pytest

@pytest.fixture(scope="session")
def login():
print("\nscope=session 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=session 作用域的后置函数") # 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods(login):
print("浏览商品--不需要登录") class Test_Demo: def test_add_cart(self, login):
print("添加购物车--测试用例") def test_add_address(self):
print("添加收货地址--测试用例") if __name__ == '__main__':
pytest.main()

test_02.py文件中的用例。

# 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods():
print("第2次-浏览商品--不需要登录") class Test_Demo2: def test_add_cart(self):
print("第2次-添加购物车--测试用例") def test_add_address(self):
print("第2次-添加收货地址--测试用例")

all.py文件内容:

import pytest

if __name__ == '__main__':
pytest.main() """
执行结果:只在该包内执行一次fixture前后置 scope=session 作用域的前置函数 浏览商品--不需要登录
PASSED
test_01.py::Test_Demo::test_add_cart 添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED
test_02.py::test_browser_goods 第2次-浏览商品--不需要登录
PASSED
test_02.py::Test_Demo2::test_add_cart 第2次-添加购物车--测试用例
PASSED
test_02.py::Test_Demo2::test_add_address 第2次-添加收货地址--测试用例
PASSED scope=session 作用域的后置函数
"""

说明:

我把session作用域的Fixture写在了test_01.py文件中,其实应该提取出来写到conftest.py文件中。(后面文章会说明)

all.py文件就是为了执行所有测试用例,pytest.ini文件中配置的模糊匹配查询,这样两个文件中的用例就都能执行到了。

这里就是一个练习,写的十分不规范,理解其意思就可以。

12、autouse参数说明

示例:实全部用例的前后置

很简单,只需要把Fixture中的autouse参数设置为True即可。

Fixture装饰器会自动执行作用域范围内的所有用例的前后置。

import pytest

@pytest.fixture(autouse=True)
def login():
print("输入账号,密码,进行登录") def test_add_cart(): # 不需要传入fixture方法
print("添加购物车--需要登录") def test_add_address(): # 不需要传入fixture方法
print("添加收货地址--需要登录") if __name__ == '__main__':
pytest.main() """
执行结果: 输入账号,密码,进行登录
添加购物车--需要登录
PASSED输入账号,密码,进行登录
添加收货地址--需要登录
PASSED
"""

『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)的更多相关文章

  1. 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)

    目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...

  2. 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)

    目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...

  3. 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件

    目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...

  4. 『德不孤』Pytest框架 — 15、Pytest参数化

    目录 1.Pytest参数化说明 2.Pytest参数化方式 3.parametrize装饰器参数说明 4.Pytest参数化(单个参数) 5.Pytest参数化(多个参数) 6.ids参数说明 1. ...

  5. Typescript中的装饰器原理

    Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ...

  6. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

  7. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  8. django ----CBV中加装饰器

    CBV中加装饰器 from django import views from django.utils.decorators import method_decorator def login_aut ...

  9. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

随机推荐

  1. [HNOI2009]双递增序列

    不难发现本题贪心是不好做的,可以考虑 \(dp\). 首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个 ...

  2. 在IDE中添加widfly依赖

    动机:在IDE中添加widfly依赖 原由:widfly实现了servlet接口,有我们对外交互时所需求的jar包 步骤: 第一步: 找到module依赖的地方 第二步:点击左侧的添加按钮,点击Lib ...

  3. js演示面向对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Guava学习之EventBus

    一.EventBus的使用案例 EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单 ...

  5. 入门 - 复习Kubernetes核心概念 (八)

    本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...

  6. Google hacker

    转载请注明来源:https://www.cnblogs.com/hookjc/ Google Hacking其实并算不上什么新东西,在早几年我在一些国外站点上就看见过相关的介绍,但是由于当时并没有重视 ...

  7. 【转】Nginx服务并发过10万的Linux内核优化配置

    http://www.linuxidc.com/Linux/2012-11/75151.htm以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一 ...

  8. Java链式写法

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11613067.html Java 链式写法:详细看代码 package chain; /** ...

  9. iOS 七大手势之轻拍,长按,旋转手势识别器方法-赵小波

    一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听vi ...

  10. 还在做廉价的劳动力?部署PXE实现Kickstart无人值守安装

    搭建PXE实现Kickstart无人值守安装 1.搭建PXE远程安装服务器 2.实现kicstart无人值守安装 1.PXE介绍及搭载: PXE是有Intel公司开发的网络引导技术,工作在Client ...