簡體   English   中英

如何在pytest conftest.py中導入之前設置配置?

[英]how to set config before import in pytest conftest.py?

我有myprj項目,文件如下。

$ tree myprj/
myprj/
├── prj
│   ├── __init__.py
│   ├── config.py
│   ├── my_logger.py
│   ├── my_module.py
│   └── tests
│       ├── __init__.py
│       ├── conftest.py
│       └── unit
│           ├── __init__.py
│           └── test_my_module.py
├── setup.py
└── tox.ini

配置文件

LOG_FILE='/path/exists/on/production/prj.log'

my_logger.py

from prj import config
import logging

class MyLogger():
    def __init__(self):
        self.setup_logger()

    def setup_logger(self):
        logFilename = config.LOG_FILE

        file_hdlr = logging.FileHandler(logFilename)

my_module.py

from prj import my_logger

myLogger = my_logger.MyLogger()


def my_method():
    return 1

test_my_module.py

from prj import my_module

def test_my_method():
    assert 1 == my_module.my_method()

設置文件

from setuptools import setup

setup(name="Tox Testing")

配置文件

[tox]
envlist = py35

[testenv]
deps=pytest
commands=py.test

當我運行tox它失敗了,日志文件的path not exists

GLOB sdist-make: /private/tmp/myprj/setup.py
py35 inst-nodeps: /private/tmp/myprj/.tox/dist/Tox Testing-0.0.0.zip
py35 installed: attrs==17.4.0,pluggy==0.6.0,py==1.5.2,pytest==3.3.2,six==1.11.0,Tox-Testing==0.0.0
py35 runtests: PYTHONHASHSEED='2231398989'
py35 runtests: commands[0] | py.test
========================================================================================================= test session starts =========================================================================================================
platform darwin -- Python 3.5.2, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /private/tmp/myprj, inifile:
collected 0 items / 1 errors

=============================================================================================================== ERRORS ================================================================================================================
__________________________________________________________________________________________ ERROR collecting prj/tests/unit/test_my_module.py __________________________________________________________________________________________
prj/tests/unit/test_my_module.py:1: in <module>
    from prj import my_module
prj/my_module.py:3: in <module>
    myLogger = my_logger.MyLogger()
prj/my_logger.py:6: in __init__
    self.setup_logger()
prj/my_logger.py:11: in setup_logger
    file_hdlr = logging.FileHandler(logFilename)
/Users/nile2691/.pyenv/versions/3.5.2/lib/python3.5/logging/__init__.py:1008: in __init__
    StreamHandler.__init__(self, self._open())
/Users/nile2691/.pyenv/versions/3.5.2/lib/python3.5/logging/__init__.py:1037: in _open
    return open(self.baseFilename, self.mode, encoding=self.encoding)
E   FileNotFoundError: [Errno 2] No such file or directory: '/path/exists/on/production/prj.log'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
======================================================================================================= 1 error in 0.36 seconds =======================================================================================================
ERROR: InvocationError: '/private/tmp/myprj/.tox/py35/bin/py.test'
_______________________________________________________________________________________________________________ summary _______________________________________________________________________________________________________________
ERROR:   py35: commands failed

我明白了,我的本地系統中不存在日志文件路徑,並且它給出了錯誤。

我嘗試使用conftest.py夾具在config.py設置LOG_FILE變量。

conftest.py

import pytest
from prj import config


@pytest.fixture(scope="session", autouse=True)
def set_config():
    config.LOG_FILE = '/tmp/prj.log'

但它仍然返回相同的錯誤。 如果我能夠在開始執行測試之前調用某些內容,例如py.test的第一個執行步驟,那么我可以設置LOG_FILE並且它不會引發錯誤。

my_module.py的全局范圍內,您創建一個實例my_logger.MyLogger()並在MyLogger.__init__中設置日志處理程序。

您的問題是在導入時設置日志處理程序的反模式 不要那樣做。

對於應用程序,日志處理程序應該在運行時配置(通過main()或其他方式完成)。 對於庫,根本不應該配置日志處理程序(除了可能添加NullHandler ) - 由您的庫用戶決定他們希望如何配置處理程序。

請注意,pytest 不需要已經配置日志處理程序來測試記錄的記錄並對日志事件進行斷言 - caplog夾具將插入自己的處理程序以捕獲日志記錄事件,因此它甚至可以與未配置的日志系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM