pytest2--固件fixture

一.使用场景。

        当多个测试函数需要在测试执行开始前做一些准备工作或者执行结束后做一些收尾工作,并且许多测试函数需要执行这些重复工作时。我们可以定义“固件”函数来解决这个问题。

二.fixture的定义和使用方式

1.先定义固件

        定义固件就是定义函数,要为fixture函数用装饰器@pytest.fixture定义

2.再使用固件

        方式1:在要使用“固件”的测试函数的形参位置上,传入固件函数的函数名做形参,例1

        方式2:在要使用“固件”的测试函数上,使用@pytest.mark.usefixtures装饰器来声明这个测试函数。例2

        方式3:定义固件函数时,为“固件”声明要自动被使用。“autouse”赋值为True。那么所有的用例都会自动使用固件.例3

方式一举例

方式2举例:

方式3举例:

        

 3.如何使用“固件”函数的返回数据

写法如下图。

两个作用:1是在执行test1之前执行固件函数。2是固件函数的函数名就是固件函数的返回值。

本例中connect_device就是固件函数connect_device的返回值。见下图

4.如何执行收尾工作:yield关键字。上面的办法都是为了做准备工作,下面是yield做收尾工作。许多“测试函数”执行后要共同,统一的执行代码(往往是为了释放资源),就可以写在“固件函数”yield关键字后面。

运行机制过程:

1可以在“固件”函数的主体代码中,使用yield关键字将return代替
2那么固件函数执行时,遇到yield关键字时,会将yield关键字后面的数据返回给“测试函数”
3并封住固件函数的现场,将所有函数的状态数据存储到内存中,等待“测试函数”执行完成
4当测试函数执行完成后,再将yield关键字下一行代码继续执行完成固件函数的所有内容

简单讲就是,固件函数先运行,yield给返回值同时固件函数暂停运行,等待被测函数运行结束后,固件函数继续运行以执行收尾工作释放资源。

注意:无论测试函数是否报错,都会执行yield后面的语句以释放资源

5.conftest.py文件。

承上启下:上面解释了固件的好处。但是有新的问题,如果每个模块都要使用相同的固件,岂不是要在每个模块都写一次?很麻烦。这时可以使用conftest.py文件。把所有的公用的固件函数放到conftest.py文件中,所有后代目录模块都可以共享固件函数

规则如下:

1.这个文件文件名必须为conftest.py

2.这个文件无需也不应该被其他测试模块导入,会自动被pytest框架发现。当别的测试模块请求一个固件是,pytest会自动找到conftest文件中来。

3.范围:conftest.py文件所定义的包及其后代包中,都可以使用conftest.py中的固件函数

例子如下:

        图二未定义固件,直接请求的图一conftest.py中的固件函数成功。

6.固件的作用域--scope skoʊp

1)function(函数)--函数范围的作用域(默认作用域

        如果将一个固件声明成function范围的作用域

        那么使用使用这个固件的每个测试函数或方法在执行时,都要使用一次固件

2)class(类)--类范围的作用域

        如果将一个固件声明成class范围的作用域

        那么一个类中所有使用了这个固件的测试方法,仅会整体使用一次固件

                ==》一个类中所有的测试方法,总会有第一个测试方法被发现,仅在第一个测试方法执行前,先执行测试固件一次

                ==》如果固件函数中有yield,那么也仅会在这个类的测试方法都执行完成后,最后执行yield语句后剩余的语句

3)module(模块)--模块范围的作用域

        如果将一个固件声明成module范围的作用域

        那么一个模块中所有使用了这个固件的测试方法,仅会整体使用一次固件

                ==》一个模块中所有的测试函数,总会有第一个测试方法被发现,仅在第一个测试方法执行前,先执行测试固件一次

 4)session(会话)--会话范围的作用域

         如果将一个固件声明成session范围的作用域

        那么在一次测试工作的运行过程(会话)中,所有的使用了这个固件的测试函数,仅会整体使用一次固件

        ==》在所有模块中所有的测试函数中,总会有第一个测试函数被发现,仅在第1个第一个测试函数执行前先运行一次固件函数

        ==》如果固件函数中有yield,那么也仅会在所有的测试函数都执行完后,最后执行固件函数中yield语句后剩余的语句

举例一:

     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值