6.接口自动化测试-Pytest自动化测试框架(2)

1.@pytest.fixture装饰器及执行级别

作用:相当于unittest中的setup_class和teardown_class函数
set up:在所有方法之前执行
tear down:在所有方法之后执行
fixture(scope='function',params=None,autouse=False,ids=None,name=None)

(1)scope:四个级别function(默认),class,module,session
# function:每个函数或方法之前都会调用执行一次
# class:每个类之前调用执行一次
# module:每个模块(.py文件)之前执行一次,一个模块可以包含多个类和方法(一个模块就是当前文件)
# session:(优先级最高)相同目录里的所有文件共用这个配置,即多个文件调用一次,可以跨.py文件(模块)调用,fixture的内容写到conftest.py里,
(2)params:可选的参数列表,会导致多个参数调用fixture功能和所有测试使用它
(3)autouse:如果为True,则代表测试开始执行时,会自动调用它
(4)ids:每个字符串id的列表
(5)name:fixture的名称

import pytest
# 装饰器,声明下面的函数是setup函数,即会在所有方法之前执行
#scope参数:可省略,缺省值默认是function级别
#function:每个函数或方法之前执行一次
#class:每个类之前执行一次
# module:每个模块之前执行一次,一个模块包含多个类(一个模块就是当前文件)
# session:(优先级最高)fixture的内容写到conftest.py里,相同目录里的所有文件共用这个配置
#autouse=True:自动调用,不需要作为参数传到test方法里
@pytest.fixture(scope='module')
def fun1():
    print('===测试开始')
    yield  # yield关键字之后的语句是teardown用法
    print('测试结束===')


class Test1:
    def test_some1(self, fun1):
        assert 1 == 2

    def test_some2(self, fun1):
        assert 1 == 1

class Test2:
    def test_some1(self, fun1):
        assert 1 == 2

    def test_some2(self, fun1):
        assert 1 == 1
class Test3:
    def test_some1(self, fun1):
        assert 1 == 2

    def test_some2(self, fun1):
        assert 1 == 1
        
if __name__ == '__main__':
    # -s:允许执行print()语句,-v:详细的测试信息
    pytest.main([__file__, '-sv'])

test_pytest2.py模块中有3个类,但只执行一次装饰器里的语句
在这里插入图片描述

session级别举例:

在这里插入图片描述
conftest.py文件

import pytest
#autouse=True--自动使用
# 其他模块里的测试方法不用专门写(def test_c01(self,func100):)进行调用了
#可以直接这样写:def test_c01(self):
@pytest.fixture(scope='session',autouse=True)
def func100():
    print('====测试开始======')
    yield
    print('====测试结束=====')
if __name__ == '__main__':
    pytest.main([__file__,'-sv'])

test_pytest.py文件

import pytest

class Test:
    def test_c01(self):
        assert 1 == 1

    def test_c02(self):
        assert 1 == 2


if __name__ == '__main__':
    # __file__当前文件名,-v:报错详细,展示是哪个类的哪个方法报错
    pytest.main([__file__, '-sv'])

执行test_pytest.py文件,会自动执行conftest.py里的内容
在这里插入图片描述

fixture函数使用

(1)无返回值的fixture函数调用

conftest.py文件

import pytest
"""
fixture(autouse=True)
场景一:有些操作开始执行自动化测试就一定需要做--自动调用fixture
场景二:有些初始化操作是某一些业务特定的,手动调用fixture 

fixture函数调用
(1)没有返回值,但需要在test_函数中调用该fixture方法时
  @pytest.mark.usefixtures('fixture函数名'),就近原则,倒序执行
(2)有返回值
 哪里需要这个fixture函数,就直接引用这个函数名对象,这个函数名就是返回值
"""
@pytest.fixture(scope='class')
def test_fix1():
    print("fix1--没有返回值的fixture函数")
@pytest.fixture(scope='class')
def test_fix2():
    print("fix2--没有返回值的fixture函数")

测试文件-test_use.py

import pytest
# 手动调用无返回值的fixture函数,fixture函数在conftest.py文件中(test_fix1)
# 手动调用多个无返回值的fixture函数,执行顺序为就近原则
@pytest.mark.usefixtures('test_fix1')
@pytest.mark.usefixtures('test_fix2')
class TestUse():
    def test_us1(self):
        print("111就近原则")

@pytest.mark.usefixtures('test_fix1')
class TestUse2():
    def test_us1(self):
        print("222哪个类调用,哪个类才能使用")
if __name__ == '__main__':
        pytest.main([__file__,'-sv'])

fixture无返回值的测试结果:
在这里插入图片描述

2.@pytest.mark.parametrize装饰器

使用场景:如果一个模块中需要测试多个用例,每次都新加test_方法和断言会很冗余
装饰器作用:让测试数据参数化,实现数据驱动,方便代码和测试数据分离

import pytest
# 如果一个模块中有多个测试用例
# 以前的写法:代码冗余,效率不高
# class Test:
#     def test_c01(self):
#         assert 1==2
#     def test_c02(self):
#         assert  2==3
#     def test_c03(self):
#         assert 3==5

list=[[1,2],[2,3],[3,5],[6,6]]
# 使用装饰器,只需要设置列表的值即可
class Test1:

    @pytest.mark.parametrize('expected_result,actual_result',list)
    def test_c100(self,expected_result,actual_result):
        assert expected_result==actual_result
    @pytest.mark.parametrize('x,y,z',[[1,2,3],[4,5,6]])
    def test_c101(self,x,y,z):
        assert x+y==z
if __name__ == '__main__':
    pytest.main([__file__,'-sv'])

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值