Python测试框架pytest(05) fixture error和failed、fixture实例化、多个fixture 目录 1、error和failed区别 2、fixture的实例化顺序 3、 具有相同作用域的 fixture 遵循测试函数中声明的顺序,并遵循 fixture 之间的依赖关系。 在 fixture_A 里面依赖的 fixture_B 优先实例化,然后到 fixture_A 实例化。 () def fixture_one(): print("====fixture_one====") @pytest.fixture() def fixture_two(): print 函数执行前按顺序先执行fixture_two,之后执行fixture_one。
以下主要介绍fixture的介绍、调用方式及作用域。 一 fixture基本介绍 1 fixture概念 fixture是 pytest 用于将测试前后进行预备、清理工作的代码处理机制。 fixture; name:装饰器的名称,同一模块的fixture相互调用建议写不同的name。 4 定义fixture 定义fixture,在函数上添加@pytest.fixture即可。 @pytest.fixture() def fixture_demo(): print("这是fixture") 5 如何区分前后置 在pytest中,用yield区分前后置,即yield前面代码为前置 fixture的三种方式。
Python测试框架pytest(04) fixture 测试用例调用fixture、fixture传递测试数据 目录 1、测试用例调用fixture 2、fixture传递测试数据 setup、teardown fixture 的作用是可以让我们自定义测试用例的前置条件。 () 装饰器用于声明函数是一个 fixture,如果测试用例的参数中包含此 fixture 函数,则在测试用例运行前会先运行此 fixture 函数。 1、测试用例调用fixture 1、创建test_fixture.py文件 调用的三种方式: (1)将 fixture 名称作为测试用例函数的输入参数,例如 login 是 test_s1 函数的输入参数 (2)测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name) (3)fixture 设置 autouse=True 脚本代码: #!
fixture定义 通过一个例子来看下fixture的定义: @pytest.fixture() 装饰器用于声明函数是一个fixture。 fixtureFunc 这个函数就是一个fixture,fixture函数内部可以实现一些初始化的操作。 ? 运行结果: ? 3. fixture函数存放的位置 (1)如果你希望fixture函数的作用域仅限于某个测试文件,那么将它写在该测试文件中; (2)如果希望fixture被多个测试文件共享,可以在公共目录下创建一个conftest.py 6. fixture的作用范围 fixture包含一个叫scope(作用范围)的可选参数,用于控制fixture执行和销毁逻辑的频率。 (3)scope='module' 模块级别的fixture每个模块只需要运行一次,无论模块里面有多少个测试函数、类方法或其他fixture都可以共享这个fixture。 ? ?
前言 一个用例是可以传多个fixture参数的,如果fixture之间用依赖关系,也可以互相调用。 使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组、list或字典,然后从里面取出对应数据。 # test_fixture4.py import pytest @pytest.fixture() def user(): print("获取用户名") a = "yoyo" .py"]) 当然也可以分开定义成多个fixture,然后test_用例传多个fixture参数 # test_fixture5.py import pytest @pytest.fixture() .py"]) fixture与fixture互相调用 fixture与fixture直接也能互相调用的 import pytest @pytest.fixture() def first():
首先定义fixture,怎么定义呢? 它是一个函数,只不过这个函数,我们要加上一个装饰说明,说明这个函数是有特殊用途的。什么特殊用途呢? 是作为我们的前置和后置。 那这个装饰器就是@pytest.fixture,在函数名称前面。 ? 在pytest中,环境准备和环境清理是完全放在一起的。 fixture可以在当前的文件中来定义,也可以额外得去定义。 第一种,公有化的方式: 前置和后置定义在特殊的文件当中,以后谁想要用,就直接调用就好了。 fixture是一个函数。 2个测试类用不一样的fixture。 以上私有化的方式的2种方法需要实操,根据实际情况判断2种方法的可用性以及调试。 ----
如果没有提供ID它们将从params自动生成 name: 默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name fixture的使用方式 将fixture名称作为测试用例函数的输入参数 对于每个参数名,如果fixture已经声明定义,会自动创建一个实例并传入该测试函数。fixture函数通过装饰器标志@pytest.fixture来注册。 区别 fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式 方式三:fixture设置 autouse的fixture遵循以下规则: autouse fixture遵守scope的定义,如果autouse fixture的scope为”session”,那么这个fixture无论定义在哪儿都只会运行一次 fixture 最后,请谨慎使用该功能,如果你在插件中定义了一个autouse的fixture,那么所有使用了该插件的测试用例都会自动调用该fixture。
,允许根据配置和组件选项对fixture和测试用例进行参数化 2.Pytest fixture定义 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture( ,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入; fixture可以返回一个元组、列表或字典; 测试用例可传单个、多个fixture参数; fixture 与fixture间可相互调用; 3.Pytest fixture用法 1)用法一:作为参数使用 fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称 fixture函数 ① 用例类中的测试用例调用fixture 执行fixture定义的动作,以及此测试类的所有用例结束后同样要运行fixture指定的动作 @pytest.fixture(scope=" 4)session级别(使用conftest.py共享fixture) 当fixture的scope定义为session时,是指在当前目录下的所有用例之前和之后执行fixture对应的操作 fixture
fixture是在测试函数运行前后,由pytest执行的外壳函数。首先来看fixture的函数返回值,也就是返回数值。先看如下的案例代码: #! /usr/bin/python3 #coding:utf-8 import pytest @pytest.fixture() def login(): return 'safghj43567dsafg 继续来解释装饰器@pytest.fixture(),它是声明一个函数是fixture,如果测试函数的参数列表中包含了fixture名,那么pytest执行的时候,就会检测到,并且在测试函数运行之前执行该 fixture,fixture可以完成任务,也可以返回数据给测试函数。 来看在fixture的案例应用,先来看被测试的代码,也就是flask 写的api,见如下: #!
固件(Fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们。我们可以用它做一些事情,比如数据库的链接操作之类的。如何使用呢。 import pytest @pytest.fixture() def post_code(): return '010' def test_postcode(post_code): 以下测试模拟数据库查询,使用固件来模拟数据库的连接关闭: import pytest @pytest.fixture() def db(): print('Connection success'
Pytest执行命令 Pytest(四)Pytest断言 Pytest(五)标记函数 Pytest(六)跳过测试 Pytest(七) pytest之参数化 Pytest(八) pytest Fixture (一) Pytest(九) pytest Fixture(二) ---- 重命名 固件的名称默认为定义时的函数名,如果不想使用默认,可以通过 name 选项指定名称: @pytest.fixture import pytest @pytest.fixture(params=[ ('redis', '6379'), ('elasticsearch', '9200') ]) def param (request): return request.param @pytest.fixture(autouse=True) def db(param): print('\nSucceed 执行结果: tmpdir_factory 可以在所有作用域使用,包括 function, class, module, session @pytest.fixture(scope='module')
在Pytest的测试框架中,也是内置了fixture的功能,这些内置的fixture在特定的测试场景下能够提高测试的效率,另外一个好处是它是内置的fixture,就不需要单独再写fixture 下面具体来看这些内置的fixture它的含义以及在测试场景下的案例应用。 一、tmpdir 内置的fixture负责在测试开始前创建文件,和测试结束后删除临时文件。 在Pytest的测试框架中,内置fixture的catch可以实现每个会话可以重复,而不会因为上一段会话的运行影响这一段的测试行为。它的作用是:存储一段测试会话,在下一段测试会话中使用。 test_catch_fixture.py ✓ 50% █████ test_catch_fixture.py ⨯ 100% █ + test_catch_fixture.py:16: AssertionError test_catch_fixture.py ⨯ 100% █████
Pytest执行命令 Pytest(四)Pytest断言 Pytest(五)标记函数 Pytest(六)跳过测试 Pytest(七) pytest之参数化 Pytest(八) pytest Fixture @pytest.fixture(scope='function') def func_scope(): pass @pytest.fixture(scope='module') def mod_scope (): pass @pytest.fixture(scope='session') def sess_scope(): pass @pytest.fixture(scope='class 下面是两个自动计时固件,一个用于统计每个函数运行时间(function 作用域),一个用于计算测试总耗时(session 作用域) date = '%Y-%m-%d %H:%M:%S' @pytest.fixture time.localtime(finished)))) print('Total time cost: {:.3f}s'.format(finished - start)) @pytest.fixture
测试数据初始化', ()=>{ // 文件路径根目录为 cypress/fixtures 文件夹,所以文件路径是填写以 cypress/fixtures 为根目录的相对路径 cy.fixture ('./3-testingpai-data/login-data').as("loginData") }) // 使用前置用例中fixture数据,使用it定义测试用例读取数据需要使用 *,所以不能使用箭头函数 it('test login data from fixture().as', function(){ cy.visit('http://testingpai.com click().type(this.loginData.password) }) // 使用 then 获取数据时可以使用箭头函数 it('test login data from fixture ().then', ()=>{ cy.visit('http://testingpai.com/') cy.fixture('./3-testingpai-data/login-data
fixture功能 传入测试中的数据集 配置测试前系统的数据准备,即初始化数据 为批量测试提供数据源 fixture可以当做参数传入 如何使用 在函数上加个装饰器@pytest.fixture(),个人理解为 fixture是有返回值,没有返回值默认为None。用例调用fixture返回值时,把fixture的函数名当做变量用就可以了。 2、scope="class" fixture为class级别的时候,如果一个class里面有多个用例,都调用了此fixture,那么此fixture只在此class里所有用例开始前执行一次。 fixture的调用 将fixture名作为测试用例函数的输入参数 测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name) fixture设置autouse=True 必须用传参的方式(参考方式一) 不是test开头,加了装饰器也不会执行fixture fixture依赖其他fixture的调用 添加了 @pytest.fixture ,如果fixture还想依赖其他
参数化params fixture的参数可以解决大量重复代码工作,比如数据库的连接、查询、关闭等.同样可以使用参数化来测试多条数据用例。 fixture源码: 传入参数scope,params,autouse,ids,name def fixture(scope="function", params=None, autouse=False Test functions can directly use fixture names as input arguments in which case the fixture instance :arg name: the name of the fixture. the fixture will be shadowed by the function arg that requests the fixture; one way
2.按模块化的方式实现,每个fixture都可以互相调用。 3.fixture的范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围。 fixture可以当做参数传入 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开。 fixture是有返回值得,没有返回值默认为None。用例调用fixture的返回值,直接就是把fixture的函数名称当做变量名称。 如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 加载位于文件中的一组固定数据 语法格式 cy.fixture (filePath) cy.fixture(filePath, encoding) cy.fixture(filePath, options) cy.fixture(filePath, encoding ascii base64 binary hex latin1 utf8 utf-8 ucs2 ucs-2 utf16le utf-16le 正确用法 // 从 users.json 文件中加载数据 cy.fixture ('users').as('usersJson') cy.fixture('logo.png').then((logo) => { // 加载 logo.png }) 不指定文件后缀名的栗子 cy.fixture cypress/fixtures/admin.tif cypress/fixtures/admin.tiff cypress/fixtures/admin.zip 读取的数据的栗子 需要读取 cypress/fixture
Pytest中我们经常会用到数据参数化,我们来介绍下装饰器@pytest.fixture()配合request传参的使用 user = request.param 如果想把登录操作放到前置操作里,也就是用到 @pytest.fixture装饰器,传参就用默认的request参数 user = request.param 这一步是接收传入的参数,本案例是传一个参数情况 @pytest.mark.parametrize input_user",user_list,indirect=True)中indirect=True是指用user_list、pwd_list数据对“input_user”、“input_pwd”这个fixture 进行参数化,虽然装饰器写在测试用例上,但是却是对测试用例使用的fixture进行传递数据,这正是indirect的意思. request传多个参数、多个fixtrue import pytest user_list ): user=request.param print("用户名:%s"%user) return user @pytest.fixture(scope="module") def
扫码关注腾讯云开发者
领取腾讯云代金券