pytest之fixture前置后置设置、打标记、重运行

首先来看看设置unittest前置后置的方法:

unittest:

          setup/teardown

          setup当中得到的变量,怎么传递给测试用例的:self.XXX = value

          setupClass,tearDownClass

          setupClass当中得到的变量,怎么传递给测试用例的:cls.XXX = value

fixture前置后置的方法:

原则上:先定义再调用、共享。

定义:

1、用函数实现,函数名称不固定。--- 如何知道它是前置还是后置?

@pytest.fixture

def fix():

    pass

2、前置操作和后置操作,写在一个函数里。 --用yeild 关键字区分前置后置

  @pytest.fixture

def fix():

    前置代码

    yeild  #分隔线

    后置代码

3、4个作用域,即给到这4个类型的语句试用的前置后置,4选一,默认是测试函数类型。测试函数(function)、测试类(class)、测试模块文件(module)、测试会话(session)

@pytest.fixture(scope=function(默认值)/class/module/session)

def fix():

        前置代码

        yeild  #分隔线

        后置代码

4、不跟测试类/测试函数放在一起。 ---如果说有测试类要用的话,怎么办?需要的时候再调用。

5、前置操作得到的一些数据,如何传递给测试用例?

yeild返回值

在测试用例当中:以fixture函数名作为用例参数。用例参数接收返回值。

测试函数的参数:1、fixture  2、参数化

6、共享机制:conftest.py

conftest.py定义fixture,可以定义多个。

7、调用:

用例/类 主动调用fixtures.

  哪儿需要哪儿调:

@pytest.mark.usefixtures("fixture的函数名称")

  测试类/测试函数

如果fixture有返回值,那么,将它作为测试函数的参数时,则可以不用使用:@pytest.mark.usefixtures("fixture的函数名称")

参考代码:

pytest之fixture前置后置设置、打标记、重运行_第1张图片

conftest.py共享

原则上:

1、所在目录下全面共享

2、支持嵌套

conftest.py规则:

1、放的都是fixture

2、fixtures可以对外共享。

3、共享的范围:

  当前conftest.py所在目录下的(含子孙目录),所有用例共享

4、conftest.py,是可以创建多个,在不同的包下。可以层级创建的。

5、优先级:就近原则!!

    发现fiXture:用例自己的模块 -》用例所在目录下的conftest.py -》目录的父级目录下的conftest.py

6、嵌套方式:

  6.1什么时候嵌套?  一个fixture,想完全使用另外一个fixture,并在人家的基础上新增一些代码。

  6.2怎么嵌套?

@pytest.fixture

def fix1():

           pass

@pytest.fixture

def fix2(fix1):

            #新增的代码

            pass

6.3嵌套后的执行顺序?

      fix1的前置

      fix2的前置

      fix2的后置

      fix1的后置

  6.4可以任意fixture级别嵌套吗?

      fix1 >= fix2的级别

数据驱动实现:

@pytest.mark.parametrized()

在测试用例的前面加上:

@pytest.mark.parametrize("参数名",列表数据)

参数名:用来接收每一项数据,并作为测试用例的参数。

列表数据:一组测试数据。

@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])

示例:

@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])

def test_add(a,b,c):

          res = a + b

          assert res == c

组合参数化:多组参数,依次组合。

使用多个@pytest.mark.parametrize

示例:用例有4个:0,2/0,3/1,2/1,3 迪卡尔积

@pytest.mark.parametrize("x", [0, 1])

@pytest.mark.parametrize("y", [2, 3])

def test_foo(x, y):

          pass

打标记:mark功能

对用例打标记,运行的时候,只运行打标记的用例。

300个回归用例。-- 打标记50个,作为冒烟测试。

1、得先注册标记名

pytest.ini

[pytest]

markers=

       标签名:说明(只能是英文)

        标签名

        标签名

图示:

pytest之fixture前置后置设置、打标记、重运行_第2张图片

2、给测试用例/测试类打标记

  @pytest.mark.已注册的标记名

3、运行时设置只运行标记的用例

 使用方法-1: pytest命令行:-m标记名

  在收集到的所有用例当中,只运行有标记名的用例。

pytest之fixture前置后置设置、打标记、重运行_第3张图片

另外一种方式:

打标记范围:测试用例、测试类、模块文件

使用方法-2:

在测试类里,使用以下申明(测试类下,所有用例都被打上该标签):

class TestClass(object):

         pytestmark = pytest.mark.已注册标签名

         pytestmark = [pytest.mark.标签1, pytest.mark.标签2]  #多标签模式

在 模块文件里,同理(py文件下,所有测试函数和测试类里的测试函数,都有该标签):

import pytest

pytestmark = pytest.mark.webtest

pytestmark = [pytest.mark.标签1, pytest.mark.标签2]  #多标签模式


失败重运行机制  :

用例失败的情况下,可以重运行用例。

一旦用例失败,马上重运行。重运行的次数?

Pytest提供了失败重试机制:

插件名称:rerunfailures

    安装方法:pip install pytest-rerunfailures

使用方式:

命令行参数形式:

命令:pytest --reruns 重试次数

比如:pytest --reruns 2 表示:运行失败的用例可以重新运行2次。

命令:pytest --reruns 重试次数--reruns-delay 次数之间的延时设置(单位:秒)

Pytest --reruns 2 --reruns-delay 5

    表示失败的用例可以重新运行2次。第一次和第二次的间隔时间为5秒钟。

你可能感兴趣的:(pytest之fixture前置后置设置、打标记、重运行)