pytest学习(二)

1.什么是fixture

fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。
fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。

fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。

  • 把函数作为参数

代码:

import pytest

class Testlogin:
    def test_lg(self, aaa):
        print(aaa)

    @pytest.fixture()
    def aaa(self):
        return 5

结果:
结果

  • 使用多个fixture
    代码:
import pytest

class Testlogin:

    def test_lg(self, aaa):
        print(aaa['message'])

    @pytest.fixture()
    def aaa(self):
        url = 'http://api.XXXX.XXXX.com/companyuser/logincompany'
        data = 'account=176XXXX5569&password=123456'
        r = requests.post(url=url, data=data).json()
        assert r['code'] == '203'
        return r

结果:
在这里插入图片描述
注:添加indirect=True参数可以把login当成一个函数去执行,而不是一个参数

2.fixture的作用范围(scope)

fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function

  • function:每一个函数或方法都会调用
  • class:每一个类调用一次,一个类中可以有多个方法
  • module:每一个.py文件调用一次,该文件内又有多个function和class
  • session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

代码:

import pytest

@pytest.fixture(scope='class')
def bbb():
    return 'bbb'


class Testlogin:

    def test_01(self, bbb):
        print('01开始')
        print(bbb)
        print('01结束')

结果:
在这里插入图片描述

3.调用fixture的两种方法

  1. 函数或类里面方法直接传fixture的函数参数名称

  2. 使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
    @pytest.mark.usefixtures()可以叠加使用

代码:

import pytest

@pytest.fixture(scope='class')
def aaa():
    return 'aaa'

@pytest.fixture(scope='class')
def bbb():
    return 'bbb'

@pytest.mark.usefixtures('aaa')
@pytest.mark.usefixtures('bbb')
class Testlogin:

    def test_01(self, bbb,aaa):
        print('01开始')
        print(aaa)
        print(bbb)
        print('01结束')

结果:
在这里插入图片描述

usefixtures与传fixture区别

如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。

4.fixture如何带参数

需要用到request属性
代码:

import pytest

test_data_1 = [('账号密码正确', '17671875569', 'b44fa1f41aab36ef3d214b01f98d4b12c83e730fcaa0c5f591078e345a7a98fc'),
               ('密码错误账号正确', 'zhangsan', '123456')]

# ()里是params
@pytest.fixture(params=test_data_1)
def aaa(request):
	# 这里返回的是param
    return request.param


@pytest.mark.usefixtures('aaa')
class Testlogin:

    def test_01(self, aaa):
        print(aaa)


结果:
在这里插入图片描述

传递字典形式数据:

import pytest
test_user_data = [{"user": "admin1", "passwd": "111111"},
                  {"user": "admin1", "passwd": "123456"}]

@pytest.fixture(params=test_user_data, autouse=True)
def aaa(request):
    return request.param

class Testlogin:

    def test_02(self, aaa):
        print(aaa['user'])
        print(aaa['passwd'])


在这里插入图片描述

5.autouse=True

fixture自动使用autouse=True 当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了 autouse设置为True,自动调用fixture功能。

代码:

import pytest

test_data_1 = [('账号密码正确', '17671875569', 'b44fa1f41aab36ef3d214b01f98d4b12c83e730fcaa0c5f591078e345a7a98fc'),
               ('密码错误账号正确', 'zhangsan', '123456')]
test_user_data = [{"user": "admin1", "passwd": "111111"},
                  {"user": "admin2", "passwd": "123456"}]

@pytest.fixture(params=test_data_1, autouse=True)
def ccc(request):
    print(request.param)

class Testlogin:

    def test_01(self):
        print('01用例')

    def test_02(self):
        print('02用例')

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值