Pytest的Fixture装饰器如何使用?

2026-05-23 02:191阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1447个文字,预计阅读时间需要6分钟。

目录

1.Fixture装饰器用途

2.Fixture参数说明

3.Fixture装饰器简单应用

4.yield执行后置函数

1.Fixture装饰器的用途

- 用于测试前的初始化设置,如测试数据准备、数据库连接等 - 用于测试后的清理工作,如关闭数据库连接、删除临时文件等

2.Fixture参数说明

- `setup`:测试开始前执行的函数,用于初始化测试环境 - `teardown`:测试结束后执行的函数,用于清理测试环境

3.Fixture装饰器简单应用

- 使用`@pytest.fixture`装饰器标记函数,作为测试的装饰器 - 在测试函数中调用装饰器返回的值,实现测试依赖

4.yield执行后置函数

- 使用`yield`语句返回测试数据,以便在测试中使用 - `yield`之后的代码块将在测试完成后执行,用于清理资源

目录
  • 1、Fixture装饰器的用途
  • 2、Fixture参数说明
  • 3、Fixture装饰器简单应用
  • 4、yield执行后置函数

1、Fixture装饰器的用途
  1. 做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用Fixture来实现。
  2. 测试用例的前置条件可以使用Fixture实现,比直接使用Pytest框架的setup()teardown()函数更加灵活。
  3. Fixture是Pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制!
  4. Fixture可以实现Unittest不能实现的功能,比如:Unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是Fixture却可以解决这个问题。
2、Fixture参数说明

可以使用pytest.fixture()查看fixture()函数的源码和所需要的参数,同Fixture装饰器需要的参数一样。

fixture(scope="function", params=None, autouse=False, ids=None, name=None):

说明:

  • scope:表示被@pytest.fixture()装饰器所标识方法的作用域。
    作用域有四个级别,函数function(默认),类class,模块module,包package/session
    说明:function作用域包含函数和方法。
  • params:一个可选的参数列表,用于做Fixture的参数化。
    可将数据提供给其他的Fixture,或者所有测试使用它 。
  • autouseautouse=Ture则开启自动使用Fixture功能,也是调用Fixture函数一种方法。
    Fixture装饰器会自动执行作用域范围内的所有用例的前后置。
    autouse默认值为Flase。
  • ids:一个字符串id的列表,即当使用params参数化时,给每一个值设置一个变量名。
    如果没有提供ID,params将自动生成ID 。
  • name:表示给被@pytest.fixture()装饰器修饰的方法取一个别名,调用时可以使用别名调用。
    默认为装饰器所装饰的函数名称。
3、Fixture装饰器简单应用

使用Fixture装饰器来实现部分用例的前后置。

比如:我们在测试一个操作流程时,有的测试用例需要登陆,有的测试用例执行不需要用户登陆。

如果要直接使用setup_function()前置函数来实现,该文件中的所有用例执行前都需要进行用户登陆。

如下示例:

import pytest # 函数级,前置函数 def setup_function(): print("用户登陆") def test_add_cart(): print("添加购物车--需要登录") def test_add_address(): print("添加收货地址--需要登录") def test_browser_goods(): print("浏览商品--不需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 用户登陆 添加购物车--需要登录 PASSED用户登陆 添加收货地址--需要登录 PASSED用户登陆 浏览商品--不需要登录 PASSED """

我们可以使用Fixture装饰器来实现部分用例的前后置,如下示例:

""" 1.学习目标 掌握pytest fixture定义 2.操作步骤 1.在定义的函数前添加装饰器 @pytest.fixture() 2.编写函数 @pytest.fixture() def 函数名(): 代码 3.使用fixture 在测试用例中,将上面定义的函数名称,当做参数传入到测试用例中即可 def test_xx(函数名): 用例步骤 """ import pytest # 步骤1 @pytest.fixture() def login(): # 步骤3 print("输入账号,密码,进行登录") def test_add_cart(login): # 步骤3 print("添加购物车--需要登录") def test_add_address(login): # 步骤3 print("添加收货地址--需要登录") def test_browser_goods(): print("浏览商品--不需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 输入账号,密码,进行登录 添加购物车--需要登录 PASSED输入账号,密码,进行登录 添加收货地址--需要登录 PASSED浏览商品--不需要登录 PASSED 只有添加购物车,添加收货地址的用例,执行了登陆操作 """

提示:Fixture装饰器既可以实现部分用例的前后置,也可以是现实全部用例的前后置,所以比单独使用前置setup()函数和后置teardown()函数灵活多了。

4、yield执行后置函数

前面的示例,是在用例前加前置条件,相当于执行了setup()前置函数,既然有setup()前置函数那就会有teardown()后置函数,Fixture里面的teardown()后置函数用yield来唤醒。

示例:

import pytest # 步骤1 @pytest.fixture() def login(): # 步骤2 print("打开APP") print("输入账号,密码,进行登录") yield # 当用例执行完成后,执行yield后的代码 print("关闭APP") def test_add_cart(login): # 步骤3 print("添加购物车--需要登录") def test_add_address(login): # 步骤3 print("添加收货地址--需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 打开APP 输入账号,密码,进行登录 添加购物车--需要登录 关闭APP PASSED打开APP 输入账号,密码,进行登录 添加收货地址--需要登录 关闭APP PASSED """

本文共计1447个文字,预计阅读时间需要6分钟。

目录

1.Fixture装饰器用途

2.Fixture参数说明

3.Fixture装饰器简单应用

4.yield执行后置函数

1.Fixture装饰器的用途

- 用于测试前的初始化设置,如测试数据准备、数据库连接等 - 用于测试后的清理工作,如关闭数据库连接、删除临时文件等

2.Fixture参数说明

- `setup`:测试开始前执行的函数,用于初始化测试环境 - `teardown`:测试结束后执行的函数,用于清理测试环境

3.Fixture装饰器简单应用

- 使用`@pytest.fixture`装饰器标记函数,作为测试的装饰器 - 在测试函数中调用装饰器返回的值,实现测试依赖

4.yield执行后置函数

- 使用`yield`语句返回测试数据,以便在测试中使用 - `yield`之后的代码块将在测试完成后执行,用于清理资源

目录
  • 1、Fixture装饰器的用途
  • 2、Fixture参数说明
  • 3、Fixture装饰器简单应用
  • 4、yield执行后置函数

1、Fixture装饰器的用途
  1. 做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用Fixture来实现。
  2. 测试用例的前置条件可以使用Fixture实现,比直接使用Pytest框架的setup()teardown()函数更加灵活。
  3. Fixture是Pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制!
  4. Fixture可以实现Unittest不能实现的功能,比如:Unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是Fixture却可以解决这个问题。
2、Fixture参数说明

可以使用pytest.fixture()查看fixture()函数的源码和所需要的参数,同Fixture装饰器需要的参数一样。

fixture(scope="function", params=None, autouse=False, ids=None, name=None):

说明:

  • scope:表示被@pytest.fixture()装饰器所标识方法的作用域。
    作用域有四个级别,函数function(默认),类class,模块module,包package/session
    说明:function作用域包含函数和方法。
  • params:一个可选的参数列表,用于做Fixture的参数化。
    可将数据提供给其他的Fixture,或者所有测试使用它 。
  • autouseautouse=Ture则开启自动使用Fixture功能,也是调用Fixture函数一种方法。
    Fixture装饰器会自动执行作用域范围内的所有用例的前后置。
    autouse默认值为Flase。
  • ids:一个字符串id的列表,即当使用params参数化时,给每一个值设置一个变量名。
    如果没有提供ID,params将自动生成ID 。
  • name:表示给被@pytest.fixture()装饰器修饰的方法取一个别名,调用时可以使用别名调用。
    默认为装饰器所装饰的函数名称。
3、Fixture装饰器简单应用

使用Fixture装饰器来实现部分用例的前后置。

比如:我们在测试一个操作流程时,有的测试用例需要登陆,有的测试用例执行不需要用户登陆。

如果要直接使用setup_function()前置函数来实现,该文件中的所有用例执行前都需要进行用户登陆。

如下示例:

import pytest # 函数级,前置函数 def setup_function(): print("用户登陆") def test_add_cart(): print("添加购物车--需要登录") def test_add_address(): print("添加收货地址--需要登录") def test_browser_goods(): print("浏览商品--不需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 用户登陆 添加购物车--需要登录 PASSED用户登陆 添加收货地址--需要登录 PASSED用户登陆 浏览商品--不需要登录 PASSED """

我们可以使用Fixture装饰器来实现部分用例的前后置,如下示例:

""" 1.学习目标 掌握pytest fixture定义 2.操作步骤 1.在定义的函数前添加装饰器 @pytest.fixture() 2.编写函数 @pytest.fixture() def 函数名(): 代码 3.使用fixture 在测试用例中,将上面定义的函数名称,当做参数传入到测试用例中即可 def test_xx(函数名): 用例步骤 """ import pytest # 步骤1 @pytest.fixture() def login(): # 步骤3 print("输入账号,密码,进行登录") def test_add_cart(login): # 步骤3 print("添加购物车--需要登录") def test_add_address(login): # 步骤3 print("添加收货地址--需要登录") def test_browser_goods(): print("浏览商品--不需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 输入账号,密码,进行登录 添加购物车--需要登录 PASSED输入账号,密码,进行登录 添加收货地址--需要登录 PASSED浏览商品--不需要登录 PASSED 只有添加购物车,添加收货地址的用例,执行了登陆操作 """

提示:Fixture装饰器既可以实现部分用例的前后置,也可以是现实全部用例的前后置,所以比单独使用前置setup()函数和后置teardown()函数灵活多了。

4、yield执行后置函数

前面的示例,是在用例前加前置条件,相当于执行了setup()前置函数,既然有setup()前置函数那就会有teardown()后置函数,Fixture里面的teardown()后置函数用yield来唤醒。

示例:

import pytest # 步骤1 @pytest.fixture() def login(): # 步骤2 print("打开APP") print("输入账号,密码,进行登录") yield # 当用例执行完成后,执行yield后的代码 print("关闭APP") def test_add_cart(login): # 步骤3 print("添加购物车--需要登录") def test_add_address(login): # 步骤3 print("添加收货地址--需要登录") if __name__ == '__main__': pytest.main() """ 执行结果: 打开APP 输入账号,密码,进行登录 添加购物车--需要登录 关闭APP PASSED打开APP 输入账号,密码,进行登录 添加收货地址--需要登录 关闭APP PASSED """