zoukankan      html  css  js  c++  java
  • Pytest框架的使用

    Pytest框架的使用
    1、Pytest介绍

    基于unittest之上的单元测试框架
    (1)、自动发现测试模块和测试方法;
    (2)、断言使用assert+表达式即可;
    (3)、可以设置会话(从运行所有用例开始-用例结束)级,模块(.py)级,类级(setupClass/teardownClass),
    函数(测试用例)级的fixtures,数据准备+清理工作
    (4)、有丰富的插件,300+以上。==allure
    (5)、测试用例不一定要放在测试类当中。
    安装命令:pip install pytest
    安装html报告插件:pip install pytest-html
    pytest插件地址:http://plugincompat.herokuapp.com/
    pytest收集测试用例的规则:
    (1)、默认从当前目录中收集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索;
    (2)、搜索规则:
    a、符合命名规则,test_*.py 或者 *_test.py的文件;
    b、以test_开头的函数名;
    c、以Test开头的测试类,(没有__init__函数)当中,以test_开头的函数;
    d、断言使用基本的assert即可;
    Pytest的特点:
    1、简单灵活,容易上手,文档丰富;
    2、支持参数化,可以细粒度地控制要测试的测试用例;
    3、能够支持简单的单元测试和复杂的功能测试,
    还可以用来做selenium/appnium等自动化测试、
    接口自动化测试(pytest+requests);
    4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如:
    pytest-selenium(集成selenium)、
    pytest-html(完美html测试报告生成)、
    pytest-rerunfailures(失败case重复执行)、
    pytest-xdist(多CPU分发)等;
    5、测试用例的skip和xfail处理;
    6、可以很好的和CI工具结合,例如jenkins

    2、pytest之mark功能

    mark机制 4.6
    先注册 pytest.ini [pytest] markers=标签名:说明
    去给用例打标签
    @pytest.mark.已注册的标签名

    测试类和模块: 类下面设置类属性值,模块下面设置全局变量。
    pytestmarker=pytest.mark.已注册的标签名
    多个标签:pytestmarker=[pytest.mark.已注册的标签名,pytest.mark.已注册的标签名]

    3、pytest之命令运行用例

    4、pytest之fixture功能

    (1)、定义fixture
    1.1 创建了一个conftest.py文件
    1.2 在conftest中,创建fixture
    1.3 定义函数,函数前面加上@pytest.fixture(scope=作用域)
    函数内部:yield 隔开前置后后置的代码,之前是前置,之后是后置
    yield 返回值(后面跟上返回值用于调用)
    (2)、调用fixture
    在测试用例.测试类 前面加上(@pytest.mark.usefixtures("fixture对应的函数名称"));
    fixture对应的函数名称=它的返回值;
    fixture对应的函数名称作为测试用例的参数,将返回值传给测试用例;
    fixure 在conftest.py当中,定义的时候,就已经决定了他的用例域,决定了它的命运;
    fixture可以有很多个;
    无论在测试类、测试用例去主动调用fixture,都不能够改变它的命运;
    调用就是决定在哪儿去使用它。在哪个测试类?
    pytest的用例执行顺序:
    基本原则:按照搜索规则,先匹配到的先执行。
    1、文件名称:按名称名称顺序去搜索。先找到的,先去内部找用例。
    2、在py文件内部:按照代码顺序去找用例。先找到的先执行。
    (3)、fixture暂不支持与unittest同用,断言都用assert.
    (4)、pytest之fixture参数化-多运行,pytest层级覆盖。测试用例与其同级或者在其子目录
    (5)、fixture的scope参数
    scope参数有四种,分别是'function','module','class','session',默认为function。
    function:每个test都运行,默认是function的scope
    class:每个class的所有test只运行一次
    module:每个module的所有test只运行一次
    session:每个session只运行一次
    (6)、setup和teardown操作
    setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
    teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
    备注:也可以通过在fixture函数中通过yield实现setup和teardown功能

    (7)、fixture定义与调用
    定义 == 定命运。session、modle、class、function
    调用 == 你准备把它在哪儿用?
    session:整个会话都有效。
    module:模块内有效。
    class:类内有效。
    function:测试用例内有效。
    conftest.py文件。 === 定义多个fixture.

    5、pytest之参数化—ddt

    参数化 ddt 参数名 = 用例的参数名称
    在测试用例的前面加上:
    @pytest.mark.parametrize("参数名",列表)
    参数名:用来接收每一项数据,并作为测试用例的参数;
    @pytest.mark.parametrize("参数1,参数2",[(数1,数2),(数1,数2)]);
    排列组合。多个参数的值排列组合。在一个用例前面 ,使用多个@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

    6、pytest之重运行

    插件名称:rerunfailures
    安装方法:pip install pytest-rerunfailures(失败case重复执行)
    使用方式:
    命令行参数形式:
    命令:pytest -reruns 重试次数
    比如:pytest --reruns 2 表示:运行失败的用例可以重新运行两次
    命令:pytest --reruns 重试次数 --reruns-delay 次数之间设置的延时(单位:秒)
    Pytest --reruns 2 --reruns-delay 5
    表示失败的用例可以重新运行2次,第一次和第二次的时间间隔为5秒;

    7、pytest之HTML报告

    测试报告 = junitxml,html,allure
    1、先装插件
    2、命令行的参数:
    --html=相对路径/report.html # 相对于pytest命令运行时,所在的根目录。
    --alluredir=相对路径
    3、安装allure命令行工具:下载,解压,配置环境变量
    4、生成allure文件之后,用命令:allure serve alluredir
    os.system("")
    allure与jenkins的集成、重运行机制、pytest中的失败截图。

    Pytest可以生成多种样式的结果: pytest plugin(下载插件用)
    1、生成JunitXML格式的测试报告:命令:--junitxml = path
    2、生成result log格式的测试报告:命令:--resultlog=report、log.txt
    3、生成Html格式的测试报告:命令:--html=report est_one_func.html(相对路径)
    # pytest -v -s -m demo --html=Demo/PO_V6/Outputs/reports/pytest_run_reports.html

    8、pytest之allure测试(allure测试报告)

    https://docs.qameta.io/allure/#_pytest

    9、fixture 之 conftest.py

    fixture 优势
    1、命名方式灵活,不局限于 setup 和 teardown 返几个命名
    2、conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到一些配置
    3、scope="module" 可以实现多个.py 跨文件共享前置
    4、scope="session" 以实现多个.py 跨文件使用一个 session 来完成多个用例


    :arg scope: scope 有四个级别参数 "function" (默认), "class","module" or "session".
    :arg params: 一个可选的参数列表,它将导致多个参数调用fixture 功能呾所有测试使用它
    :arg autouse: 如果为 True,则为所有测试激活 fixture func 可以看到它。
    如果为 False(默讣值)则显式需要参考来激活 fixture
    :arg ids: 每个字符串 id 的列表,每个字符串对应于 params 返样他们就是测试 ID 的一部分。
    如果没有提供 ID 它们将从 params 自动生成
    :arg name: fixture 的名称。 返默讣为装饰函数的名称。 如果fixture 在定义它的同一
    模块中使用,夹具的功能名称将被请求夹具的功能 arg 遮蔽; 解决返个问题的一种方法
    是将装饰函数命名

    10、conftest.py 配置

    conftest.py 配置脚本名称是固定的,不能改名称 conftest.py 与运行的用例要在同一个 pakage 下,并且有__init__.py 文件 不需要 import 导入 conftest.py,pytest 用例会自动查找

    11、fixture 之 yield 实现 teardown

    1、yield 执行 teardown
    在用例前加前置条件,相当于 setup,既然有 setup 那就有 teardown,fixture 里面的 teardown
    用 yield 来唤醒 teardown的执行
    2、yield 遇到异常
    a、如果其中一个用例出现异常,不影响 yield 后面的 teardown 执行,运行结果互不影响,并且全部
    用例执行完后,yield 呼唤 teardown操作
    b、如果在 setup 就异常了,那么是不会去执行 yield 后面的teardown 内容了
    c、yield 也可以配合 with 语句使用
    3、addfinalizer 终结函数
    a、除了 yield 可以实现 teardown,在 request-context 对象中注册addfinalizer 方法也可以实现终结函数。
    b、yield 呾 addfinalizer 方法都是在测试完成后呼叫相应的代码,addfinalizer不同的是:
    他可以注册多个终结函数。
    返些终结方法总是会被执行,无论在乊前的 setup code 有没有抛出错诨。返个方法对于正确关闭
    所有的 fixture 创建的资源非常便利,即使其一在创建戒获取时失败。

    12、fixture 之 autouse=True
    调用 fixture 三种方法
    1、函数或类里面方法直接传 fixture 的函数参数名称
    2、使用装饰器@pytest.mark.usefixtures()修饰
    3、autouse=True 自动使用

    用例传 fixture 参数
    方法一:先定义 start 功能,用例全部传 start 参数,调用该功能

    装饰器 usefixtures
    方法二:使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例

    设置 autouse=True
    方法三、autouse 设置为 True,自动调用 fixture 功能
    start 设置 scope 为 module 级别,在当前.py 用例模块叧执行一次,autouse=True 自动使用
    open_home 设置 scope 为 function 级别,每个用例前都调用一次,自动使用

    13、参数化 parametrize
    pytest.mark.parametrize 装饰器可以实现测试用例参数化。
    参数组合
    1.若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器
    在返个例子中设计的,叧有一条输入/输出值的简单测试功能。和往常一样函数的参数,
    你可以在运行结果看到在输入和输出值
    2.它也可以标记单个测试实例在参数化,例如使用内置的mark.xfail
    参数组合
    1.若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

    14、assert断言
    断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。
    什么是断言呢?
    简单来讲就是实际结果和期望结果去对比,符合预期那就测试 pass,不符合预期那就测试 failed
    为了写关于引发异常的断言,可以使用 pytest.raises 作为上下文管理器

  • 相关阅读:
    idea的tomcat配置
    idea设置类文件的头部信息
    设置idea注释颜色
    Idea设置字体
    python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
    python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)
    python 全栈开发,Day9(函数的初始,返回值,传参,三元运算)
    python 全栈开发,Day8(文件操作)
    python 全栈开发,Day7(元组转换,列表以及字典的坑,集合,关系测试,深浅copy,编码补充)
    python 全栈开发,Day6补充(is,小数据池,编码转换)
  • 原文地址:https://www.cnblogs.com/dydxw/p/12886883.html
Copyright © 2011-2022 走看看