单元测试未执行时,鼻子测试失败

纳撒尼尔·福特

我们看到Python鼻子测试和单元测试的结果之间有一个奇怪的区别。这是导致问题的代码,尤其是最后一行:

import logging

class ClassThatLogsBadly:
    log = logging.getLogger(__name__)

    def method_that_logs_badly(self):
        self.log.error('A message', 'Another string')
        return ('I ran')

上面的内容log是从Python的日志记录库中检索到的,由于以下原因(从Python库:),在调用时会产生问题logging/__init__.py:328

def getMessage(self):
    """
    Return the message for this LogRecord.

    Return the message for this LogRecord after merging any user-supplied
    arguments with the message.
    """
    msg = str(self.msg)
    if self.args:
        msg = msg % self.args
    return msg

如您所见,它尝试拼接Another stringA message,但后者没有%s要填充的有效插槽(类型为),因此无法执行。这是一个已知的问题,解决方案是在记录器外部格式化您的内容。但是,我们的问题是进行测试以确保做到这一点。

针对使用unittest或py.test调用日志记录库的代码运行测试不会引起任何故障。用鼻子进行相同的测试会导致错误,并且测试失败。我们的大多数构建工作都是围绕py.test库构建的,并且没有使测试失败是令人担忧的:我们不确定这是否由于某些原因是预期的行为,这些库之间的处理之间的根本区别是什么以及通常是什么?去做。

我们正在使用Python 3.4。这是运行此代码的示例测试:

import logging
import unittest

from mycode import ClassThatLogsBadly

class TestClassThatLogsBadly(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_method_that_logs_badly(self):
        clz = ClassThatLogsBadly()
        result = clz.method_that_logs_badly()
        self.assertEquals('I ran', result)
奥列克西

由于日志记录配置是全局的,因此为了正确地行使日志记录功能,您必须正确配置日志记录。在您的特定情况下,没有在根级别配置任何处理程序,也没有为配置任何处理程序self.log,因此将不会发出任何日志消息(只是“找不到针对记录程序“ mycode”的处理程序”)。旨在指示日志记录配置中存在错误,因为您的日志树如下所示:

<--""
   Level WARNING
   |
   o<--"mycode"
       Level NOTSET so inherits level WARNING

由于您没有处理程序,因此您的log.error消息不会做任何事情,并且在unittest下运行时,代码不会被执行py.test

nose默认情况下,在根级别添加日志捕获处理程序,因此正确配置了最终的日志记录配置,并且log.error正确执行了代码。

一个快速的解决方法是在初始化时logging.basicConfig()在代码之上添加ClassThatLogsBadly或向log类成员添加适当的处理程序这样,unittest和py.test都可以捕获它。

最后,您实际上不应该在记录器之外格式化您的内容:如果未配置级别,则根本不应该进行格式化,而只是跳过整个日志记录以加快执行速度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

鼻子的Phabricator Arcanist单元测试2

来自分类Dev

单元测试失败

来自分类Dev

Android单元测试未报告失败(失败)

来自分类Dev

总单元测试执行时间消失了

来自分类Dev

总单元测试执行时间消失了

来自分类Dev

Umbraco单元测试失败

来自分类Dev

验证单元测试失败

来自分类Dev

“单元测试失败”的BeautifulSoup

来自分类Dev

Umbraco单元测试失败

来自分类Dev

Rails单元测试失败

来自分类Dev

检测鼻子测试失败

来自分类Dev

python鼻子测试失败

来自分类Dev

Swift进行单元测试:闭包主体未执行

来自分类Dev

vertx单元测试未执行,超时异常

来自分类Dev

Swift进行单元测试:闭包主体未执行

来自分类Dev

在运行所有测试或执行特定测试后,C ++单元测试失败

来自分类Dev

单元测试未运行

来自分类Dev

Python:鼻子没有接受单元测试

来自分类Dev

python 3.8上的鼻子单元测试发现

来自分类Dev

角度单元测试失败,但本地失败

来自分类Dev

根据测试执行顺序,使用TestBed.inject进行角单元测试成功/失败

来自分类Dev

根据测试执行顺序,使用TestBed.inject进行角单元测试成功/失败

来自分类Dev

当数据库架构和实体更改时,单元测试失败,但单元测试未更改

来自分类Dev

失败的鼻子测试退出脚本

来自分类Dev

标有@ unittest.skip的单元测试不会在鼻子测试下标记

来自分类Dev

Laravel单元测试迁移失败

来自分类Dev

无条件失败单元测试

来自分类Dev

模板别名导致单元测试失败

来自分类Dev

单元测试HtmlHelper扩展方法失败