Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么使用pytest参数记录会在记录中对返回行进行参数化,每个参数的增量?_Python_Logging_Pytest - Fatal编程技术网

Python 为什么使用pytest参数记录会在记录中对返回行进行参数化,每个参数的增量?

Python 为什么使用pytest参数记录会在记录中对返回行进行参数化,每个参数的增量?,python,logging,pytest,Python,Logging,Pytest,我编写了一段Python代码,在这里我正在学习如何使用pytest和日志进行测试。我想发送一个参数列表,pytest函数将循环通过这些参数。这是我的代码: import pytest import numpy as np import logging class TestClass: @pytest.fixture def initializeLogger(self): logger = logging.getLogger(__name__)

我编写了一段Python代码,在这里我正在学习如何使用pytest和日志进行测试。我想发送一个参数列表,pytest函数将循环通过这些参数。这是我的代码:

import pytest
import numpy as np
import logging

class TestClass:

    @pytest.fixture
    def initializeLogger(self):
        logger = logging.getLogger(__name__)
        logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s')

        file_handler = logging.FileHandler(r'C:\Users\user\Data\Cross correlation\RunLog.log')
        file_handler.setFormatter(formatter)

        logger.addHandler(file_handler)
        return logger

    # Define parameters
    params = []
    params.append({'no' : 1})
    params.append({'no' : 2})
    params.append({'no' : 3})



    @pytest.mark.parametrize("params", params)
    def test_ZeroI(self, initializeLogger, params):
        logger = initializeLogger
        read = params['no']
        logger.info(f'Value inputted: {read}, Value read: {read}')
        print('success')
        assert params['no'] == read
我已经将initializeLogger(self)定义为一个pytest fixture,它在调用主测试函数test_ZeroI(..)之前初始化

initializeLogger(self)函数只是初始化记录器,我将它附加到一个文件处理程序,该处理程序为我创建文件。然后我返回记录器

我创建了一个名为params的列表,并添加了带有“no”键的字典值以及我想要迭代的值;所以在这个场景中:1,2,3

然后(据我所知)testZeroI()函数应该运行三次,参数依次为1、2和3。我添加了行:logger.info(f'valueinputed:{read},valueread:{read}'),它只读取值并输出到日志中

但是,问题在日志中,我看到的是:

信息:模块2:输入值:1,读取值:1 信息:模块2:输入值:2,读取值:2 信息:模块2:输入值:2,读取值:2 信息:模块2:输入值:3,读取值:3 信息:模块2:输入值:3,读取值:3 信息:模块2:输入值:3,读取值:3

如您所见,值1只记录一次。值2记录两次。值3记录三次。我在代码中做错了什么?我的目的是让我的代码输出如下日志:

信息:模块2:输入值:1,读取值:1 信息:模块2:输入值:2,读取值:2
信息:模块2:输入的值:3,读取的值:3

在您的设备中
初始化logger
您每次在同一个记录器上调用
logger.addHandler(文件处理程序)
,因此您每次使用该设备时都会得到一个额外的记录器

您可以确保代码只调用一次(例如使用单例,或将其放入类设置中),或者在使用后删除记录器。
如果使用夹具,可以执行以下操作:

@pytest.fixture
def get_记录器():
logger=logging.getLogger(_名称__)
...
logger.addHandler(文件处理程序)
产量记录器
logger.handlers.clear()
或者您可以使用
设置
/
拆卸
执行相同的操作:

class测试类:
def设置方法(自身):
self.logger=logging.getLogger(_名称__)
...
self.logger.addHandler(文件\处理程序)
def拆卸方法(自):
self.logger.handlers.clear()
如果要在整个测试过程中使用相同的处理程序,可以使用类初始值设定项:

class测试类:
记录器=无
@类方法
def设置_类(cls):
cls.logger=initializeLogger()
@类方法
def拆卸类(cls):
cls.logger.handlers.clear()

在fixture中
initializeLogger
每次在同一个记录器上调用
logger.addHandler(文件处理程序)
,因此每次使用fixture时都会得到一个额外的记录器。您只需调用代码一次,例如,通过检查代码是否已初始化,或者在类设置方法中。您知道我是否可以使用任何标记,以便在整个测试中只调用fixture函数initializeLogger一次吗?我添加了一个具有不同可能性的答案。