三、fixture介绍

发布时间 2023-09-01 15:05:40作者: 闲鱼卖闲鱼

3.1 fixture介绍:
fixture用 @pytest.fixture() 标识,定义在函数前面。

在编写测试函数时,可以将此函数的名称作为传入参数,pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数。
fixture 允许通过配置和组件选项参数化 fixture 和测试用例,或者跨功能、类、模块,甚至整个测试会话复用 fixture。

 

3.2 fixture目标:
fixture 主要目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。例如在测试网站时,每个测试用例都要登录和退出,利用 fixture 就可以只执行一次,否则每个测试用例都要执行这两步也是冗余。
fixture以一种模块化的方式实现,因为每个 fixture 的名字都能触发一个 fixture 函数,而这个函数本身又能调用其他的 fixture,这就是 fixture 的嵌套功能。
fixture 还提供了参数化功能,根据配置和不同组件来选择不同的参数。

 

3.3 fixture 基本的依赖注入功能:
fixture 允许测试用例可以轻松地接受和处理特定的需要与初始化操作的应用对象。
最典型的使用场景:
登录功能,有些功能需要登录才能使用,例如支付功能和查看购物车,而浏览商品功能不需要登录。
fixture 实现步骤如下:
1.导入 pytest
2.创建 login() 函数
3.在login() 函数上加 @pytest.fixture()
4.在要使用的测试方法中传入登录函数名称,也就是先执行login() 函数再执行本测试方法
5.不传入参数表明不需要登录
@pytest.fixtrue() 中不带参数时范围默认 scope='function',也就是共享数据为函数级,就是在本用例中搜索是否有需要的共享数据。

 


3.4 fixture的应用:
3.4.1 fixture应用在初始化配置:
初始化过程一般进行数据初始化、连接初始化等。
常用场景:测试用例执行时,有的用例的数据是可读取的,需要把数据读进来再执行测试用例。setup 和 treadown 可以实现,fixture 可以灵活命名实现。
具体实现步骤:
1.导入pytest
2.创建 data() 函数
3.在 data() 函数上加 @pytest.fixture()
4.在要使用的测试方法 test_login 中传入data函数名称,也就是先执行 data() 函数再执行测试方法
5.不传入参数表明可以直接执行测试方法

3.4.2 fixture应用在配置销毁:
测试方法后需要销毁并清除数据:yield,yield调用第一次返回结果,第二次执行它下面的语句并返回结果
步骤:
(1)添加 @pytest.fixture(scope=module) 语句。
(2)在登录的方法中添加 yield,之后添加销毁清除的步骤。


3.5 不同层级 scope 使用 fixture 实例:
fixture(scope='function', params=None, autouse=False, ids=None, name=None) :
scope 有 5 个级别参数:function(默认)、class、module、package(实验性的)、session
function:每个函数或方法都会调用
class:每个类调用一次,一个类可以有多种方法
module:每个 .py 文件调用一次,该文件内又有多个 function 和 class
session:多个文件调用一次,可以跨 .py 文件调用,每个 .py 文件就是 module

3.5.1 模块(module)级别使用 fixture 实例:
当把 scope 参数设置为 module 时,只在文件开始执行一次。

3.5.2 类(class)级别使用fixture 实例:
当 fixture 为class级别时,如果一个 class 里有多个用例,则都调用了此 fixture,此 fixture 只在该class中所有用例开始前执行一次。

3.5.3 会话(session)级别使用 fixture 与 conftest.py 配合:
fixture 为 session 级别是可以跨 .py 模块调用的,也就是当有多个 .py 文件用例时,如果多个用例只需调用一次 fixture,那就设置为 scope='session'。
采用一个单独的 conftest.py 文件,文件名称固定,pytest会自动识别该文件。放到工程目录下就可以全局调用,放到 package 下,就只在该 package 内有效。

 

 

3.6 使用 params 传递不同数据:
fixture(scope='function', params=None, autouse=False, ids=None, name=None),params是参数,默认可以不选。
如果需要在一系列测试用例的执行中,每轮执行都使用同一个 fixture,但是有不同的依赖场景,则可以考虑对 fixture 进行参数化,这种方式适用于对多场景的功能模块进行详尽测试。在 fixture 的声明函数中,可以使用 request.param 获取当前使用的入参。

3.6.1 有效测试数据与预期失败 xfail 的测试数据:
在测试某些功能时,如果步骤一致,则可以使用数据驱动方式执行测试,也就是说多组数据使用一个测试方法。
当步骤相同而数据不同时,预期失败和预期正确的数据可以在一个测试方法中实现,这样就只有一组或几组数据会引起预期的失败,但不能在测试方法中标记预期失败,而应该通过参数传递的测试数据中使用 pytest.param 标记预期失败。

3.6.2 params与ids的应用:
对于复杂类型的测试数据通常加上 id 或 name 来表明数据的含义,并标记测试要点。测试数据除了字符串外,还可以是表达式、元组、字典、类等类型。
使用 ids 关键字参数自定义测试id


3.7 自动调用 fixture:
(1)在 fixture 的参数中将 autouse 参数设置为 True,这样变回自动应用所作用的范围。
autouse=True 的 fixture 在其他级别作用域中国的工作流程:
scope='session',不管它在哪定义都将只执行一次
scope='class',表示每个测试类执行一次
scope='module',表示这个而测试模块所有的用例自动使用
conftest.py 中定义 autouse fixture,那么同文件夹和子文件夹中的所有测试模块中的用例都将自动使用它

(2)使用 @pytest.mark.usefixtures('fixture_name'),在需要的测试方法上添加

 

3.8 fixture的并列与嵌套调用:
3.8.1 并列使用 fixture:
常用使用场景:前提条件有多个可以并列使用多个 fixture,多个@注解,在一个测试方法中使用时将传入的参数写多个就能解决问题。

3.8.2 嵌套调用 fixture:
常用使用场景:有先后关系的嵌套调用,多个@注解依赖可以通过传参方式,测试方法调用时只需调用最后的那种方法 fixture,然后调用其他的 fixture。

3.8.3 多个 fixture 的实例化顺序:
高级别作用域的实例化(如:session)先于低级别作用域(如:class)实例化;
相同级别作用域的实例化,其实例化顺序遵循它们在测试用例中被声明的顺序,也就是形参顺序或者 fixture 之间的相互调用关系;
自动应用 autouse 的 fixture,先于其同级别的其他 fixture 实例化。