python-pytest学习(十七)-conftest.py作用范围

Posted 给自己一个向前进的理由

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-pytest学习(十七)-conftest.py作用范围相关的知识,希望对你有一定的参考价值。

一、前言

  一个测试工程下是可以有多个conftes.py文件,一般在工程根目录放一个conftest.py起到全局作用。

  不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录生效。

二、conftest层级关系

  在web_conf_py项目工程下建两个子项目baidu,blog,并且每个目录下都放一个conftest.py和init.py(python的每个package必须要有init.py)

web_conf_py是工程名称

├─baidu
│  │  conftest.py
│  │  test_1_baidu.py
│  │  __init__.py
│  
│          
├─blog
│  │  conftest.py
│  │  test_2_blog.py
│  │  __init__.py
│   
│  conftest.py
│  __init__.py

 

 

三、案例分析

  web_conf_py工程下conftest.py文件代码案例

web_conf_py/conftest.py
import pytest

@pytest.fixture(scope="session")
def start():
    print("\\n打开首页")

  baidu目录下conftest.py和test_1_baidu.py

# web_conf_py/baidu/conftest.py
import pytest

@pytest.fixture(scope="session")
def open_baidu():
    print("打开百度页面_session")
# web_conf_py/baidu/test_1_baidu.py
import pytest

def test_01(start,open_baidu):
    print("测试用例test_01")
    assert 1

def test_02(start,open_baidu):
    print("测试用例test_02")
    assert 1

if __name__=="__main__":
    pytest.main(["-s","test_1_baidu.py"])

  运行test_1_baidu.py结果可以看出,start和open_baidu是session级别的,只运行一次。

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\\YOYO\\web_conf_py\\baidu, inifile:
plugins: metadata-1.7.0, html-1.19.0
collected 2 items

test_1_baidu.py 
打开首页
打开百度页面_session
测试用例test_01
.测试用例test_02
.

========================== 2 passed in 0.01 seconds ===========================

 

  blog目录下conftest.py和test_2_blog.py代码

web_conf_py/blog/conftest.py
import pytest

@pytest.fixture(scpoe="function")
def open_blog():
    print("打开blog页面_function")
web_conf_py/blog/test_2_blog.py

import pytest

def test_03(start,open_blog):
    print("测试用例test_03")
    assert 1

def test_04(start,open_blog):
    print("测试用例test_04")
    assert 1

def test_05(start,open_baidu):
    """跨模块调用baidu模块下的conftest"""
    print("测试用例test_05,跨模块调用baidu")
    assert 1

if __name__=="__main__":
    pytest.main(["-s","test_2_blog.py"])

  运行结果可以看出,start起到全局作用,blog目录下的open_blog是function级别,每个用例调用一次。

  test_05(start,open_baidu)用例不能跨模块调用baidu模块下的open_baidu,所以test_05用例会运行失败。

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\\YOYO\\web_conf_py\\blog, inifile:
plugins: metadata-1.7.0, html-1.19.0
collected 3 items

test_2_blog.py 
打开首页
打开blog页面_function
测试用例test_03
.打开blog页面_function
测试用例test_04
.E

=================================== ERRORS ====================================
__________________________ ERROR at setup of test_05 __________________________
file E:\\YOYO\\web_conf_py\\blog\\test_2_blog.py, line 11
  def test_05(start, open_baidu):
E       fixture \'open_baidu\' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, metadata, monkeypatch, open_blog, pytestconfig, record_property, record_xml_attribute, record_xml_property, recwarn, start, tmpdir, tmpdir_factory
>       use \'pytest --fixtures [testpath]\' for help on them.

E:\\YOYO\\web_conf_py\\blog\\test_2_blog.py:11
====================== 2 passed, 1 error in 0.02 seconds ======================

 

参考文章:https://www.jianshu.com/p/359477cc8990

以上是关于python-pytest学习(十七)-conftest.py作用范围的主要内容,如果未能解决你的问题,请参考以下文章

python-pytest学习-参数化

python-pytest学习函数传参

python-pytest学习函数传参

python-pytest学习-标记失败xfail

python-pytest学习-标记失败xfail

python-pytest学习(十三)-fixture之autouse=True