pytest学习--之conftest.py

在上一篇fixture的案例实在同一个.py文件中,多个用例调用一个登陆功能,如果有多个.py的文件都需要调用这个登陆功能的haul,那就不能把登陆写到用例py文件中了。

此时需要一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置

一、特点

conftest.py配置需要注意以下几点:

  -conftest.py配置脚本的名称是固定的,不能改名

  -conftest.py 域运行的用例要在同一个package下,并且要有__init__.py文件

  - 不需要import导入conftest.py,pytest会自动查找

  -conftest.py文件不能被其他文件导入

  -所有同目录测试文件运行前都会执行conftest.py文件

二、conftest.py的用法

  conftest.py文件实际应用需要结合fixture来使用,fixture中参数scope也适用于conftest中的fixture特性,这里说明一下:

  1、fixture源码详解:

  fixture(scope = 'function',params = None,autouse = False,ids = None,name = None)

  fixture 里面有个scope参数可以控制fixture的作用范围,scope:有四个参数级别“function”-默认,class module session

  params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它

  autouse:如果为True,则为所有测试激活fixture func可以看到它。如果为False则显式需要参来激活fixture,参考怎么激活呢?就是在调用fixture函数的 函数中传递fixture函数名

  ids:每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分,如果没有提供ID它们将从params自动生成

  name:fixture函数的名称,这默认为被装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称江北请求夹具的功能arg遮蔽,解决这个问题的一种方法是将装饰函数命令

  "fixture_<fixturename>"然后使用@pytest.fuxture(name = 'fixture_name')

  2、fixture的作用范围

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

  -function:每个函数或者方法都会调用

  -class:每个类调用一次,一个类中可以有多个方法

  -module:每个.py文件调用一次,该文件内有多个functions和class

  -session/package: 是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

  3、conftest结合fixture的使用

    -conftest中的fixture的scope参数为session/ package(看fixture源代码 session和 package都支持,而且作用范围也一样),所有测试的.py文件执行前执行一次

    -conftest中fixture的scope参数为module,每一个测试.py文件执行前都会执行一次conftest文件中的fixture

    -conftest中fixture的scope参数为class,每一个测试文件中的测试类执行前都会执行一次conftest文件中的fixture

    -conftest中fixture的scope参数为function,所有文件的测试用例执行前都会执行一次conftest文件中的fixture

 例子:

  conftest.py文件如下:

  

import pytest


@pytest.fixture(scope='function')
def login():
    print("\n fixture login function")
    return 'hahaha'

  test_fix1.py文件如下:

import pytest


def test_s1(login):
    print("test_s1-------------")
    x = 'this'
    assert 'h' in x

@pytest.mark.usefixtures('login')
def test_s2():
    print("test_s2----------------")
    x = 'hello'
    assert hasattr(x,'hello')


if __name__ == '__main__':
    pytest.main(['-s'])

  运行结果如下:----每次测试用例执行前都执行 fixture函数

============================= test session starts =============================
collecting ... collected 2 items

test_fix1.py::test_s1 
 fixture login function
PASSED                                             [ 50%]test_s1-------------

test_fix1.py::test_s2 
 fixture login function
FAILED                                             [100%]test_s2----------------

test_fix1.py:17 (test_s2)
@pytest.mark.usefixtures('login')
    def test_s2():
        print("test_s2----------------")
        x = 'hello'
>       assert hasattr(x,'hello')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'hello')

test_fix1.py:22: AssertionError


========================= 1 failed, 1 passed in 0.11s =========================

  

  

上一篇:函数计算搭建 Serverless Web 应用(三)- 为 Web 应用开启 CDN 加速


下一篇:macbook air m1芯片关闭sip教程(超详细,防踩坑)