ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pytest学习--之conftest.py

2021-11-18 19:31:43  阅读:164  来源: 互联网

标签:文件 -- py fixture conftest pytest test


在上一篇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 =========================

  

  

标签:文件,--,py,fixture,conftest,pytest,test
来源: https://www.cnblogs.com/1050619969kong/p/15573891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有