【问题标题】:How to find out the current running test如何找出当前正在运行的测试
【发布时间】:2017-01-04 15:23:27
【问题描述】:

我正在使用 pytest 来运行我的测试方法。我正在尝试为每个测试方法实现一个日志文件。

考虑以下带有测试方法的测试模块。

#content of test_module.py
def test_1(log):
    log.info('inside test_1')
    util.abc(log)


def test_2(log):
    log.info('inside test_2')
    util.abc(log)

我的util模块的内容是:

#content of util.py module
def abc(log):
    # perform some logic here and calculate result.      
    log.info('the value is: %s' % result)

这是我的 conftest.py 文件。

#conftest.py
@pytest.fixture()
def log(request):
    test_path = request.node.parent.name.strip(".py")
    test_name = request.node.name
    node_id = request.node.nodeid
    logs_dir = pkg_resources.resource_filename("test_results", "logs")
    log_file_path = '%s/%s' % (logs_dir, test_path)
    if not os.path.exists(log_file_path):
        os.makedirs(log_file_path)
    logger_obj = logger.make_logger(test_name, log_file_path, node_id)
    yield logger_obj
    handlers = logger_obj.handlers
    for handler in handlers:
        handler.close()
        logger_obj.removeHandler(handler)

测试模块 test_module.py 位于 tests/ 目录下。因此,当我使用 py.test tests/ 运行测试时,它会执行 test_1 和 test_2 方法,并将 test_results/ 目录下的测试特定信息记录到每个测试特定的日志文件中。 test_1.log 和 test_2.log。

这对我有用。但是,问题是我必须将日志对象从测试方法传递给我从测试方法调用的每个方法。

在此示例中,当我调用 util.abc 方法时,我从测试方法传递日志对象。因此,util 模块中的方法 abc 知道要记录到哪个日志文件。但是,我不想以这种方式将日志对象传递给我从测试方法调用的所有方法。我相信应该有更好的方法。我在想,如果有办法找出哪个测试方法称为方法 abc,那么我不必以这种方式传入日志对象。任何人都知道如何解决这个问题?或任何其他想法来实现这一目标?谢谢!

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    好吧,你总是可以创建logger 模块。在您的测试方法中,您会将log 分配给logger.log

    #content of test_module.py
    def test_1(log):
        logger.log = log
        log.info('inside test_1')
        util.abc()
    
    def test_2(log):
        logger.log = log
        log.info('inside test_2')
        util.abc()
    

    在你的正常方法中调用它

    def abc():
        # perform some logic here and calculate result.      
        logger.log.info('the value is: %s' % result)
    

    【讨论】:

    • 我认为如果我按顺序运行我的测试,这将起作用。但是,我计划并行运行它们。
    • @sridhar249 我从来没有并行运行 pytest,但如果它基于多处理(很可能;不是多线程),那么我认为它们不应该共享 logger.log
    • @sridhar249 我检查了文档pypi.python.org/pypi/pytest-xdist 并且所有内容都基于子流程,因此该解决方案应该可以工作。
    • 如果我理解正确,测试方法中的 logger.log = log 将作为参数传递给测试方法的日志对象分配给记录器模块内的日志变量。我认为当我并行运行测试时这不会很好,因为记录器模块内的日志变量一次只能保存一个实例。因此,test_1 将初始化 logger.log,而当 test_1 仍在运行时,test_2 会将 logger.log 初始化为其他内容。因此,如果此时 test_1 调用 util.abc(),那么它将获取到 test_2 的日志文件的记录器。对吗?
    • 您已经完全理解了这个概念。但是如果你并行运行它,例如同时运行 4 个测试,那么 pytest-xdist 会创建 4 个子进程。每个子流程都独立于另一个子流程,因此不会出现您描述的情况。如果运行测试基于并发,而不是并行——多线程,而不是多处理,你害怕的事情就会发生。多线程用于使您的应用程序对用户保持响应,多处理 - 以快速完成诸如运行测试之类的事情。正如我在文档中检查的那样,您不必担心。
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多