我有一个python测试,我想测试日志记录是否正常工作.例如,我有一个创建用户的函数,最后日志记录将响应写入日志文件.
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.WatchedFileHandler('mylogfile.log')
formatter = logging.Formatter('%(asctime)s: %(message)s',
'%d/%b/%Y:%H:%M:%S %z')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('Some log text')
Run Code Online (Sandbox Code Playgroud)
在我的测试用例中,我想将日志输出发送到StringIO.
class MyTest(unittest.TestCase):
def setUp(self):
stream = StringIO()
self.handler = logging.StreamHandler(stream)
log = logging.getLogger('mylogger')
log.removeHandler(log.handlers[0])
log.addHandler(self.handler)
def tearDown(self):
log = logging.getLogger('mylogger')
log.removeHandler(self.handler)
self.handler.close()
Run Code Online (Sandbox Code Playgroud)
问题是,我不确定我应该如何测试我的记录器是否正常工作.
举一个简单的例子,取一个可以返回其属性的class 椭圆,例如面积A,周长C,长轴/短轴a/b,偏心率e等.为了得到它,显然必须提供其两个参数以获得所有其他参数,虽然作为一个特殊情况,只提供一个参数应该假设一个圆圈.三个或更多一致的参数应该产生警告但是有效,否则显然会引发异常.
所以有效Ellipses的一些例子是:
Ellipse(a=5, b=2)
Ellipse(A=3)
Ellipse(a=3, e=.1)
Ellipse(a=3, b=3, A=9*math.pi) # note the consistency
Run Code Online (Sandbox Code Playgroud)
而无效的将是
Ellipse()
Ellipse(a=3, b=3, A=7)
Run Code Online (Sandbox Code Playgroud)
因此构造函数要么包含许多=None参数,
class Ellipse(object):
def __init__(self, a=None, b=None, A=None, C=None, ...):
Run Code Online (Sandbox Code Playgroud)
或者,可能更明智,一个简单的**kwargs,可能添加提供a,b作为位置参数的选项,
class Ellipse(object):
def __init__(self, a=None, b=None, **kwargs):
kwargs.update({key: value
for key, value in (('a', a), ('b', b))
if value is not None})
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但现在实际实现,即确定提供哪些参数,哪些参数不是,并根据它们确定所有其他参数,或在需要时检查一致性.
我的第一种方法是许多人的简单而乏味的组合
if 'a' in kwargs:
a = kwargs['a'] …Run Code Online (Sandbox Code Playgroud) django.test.TestCase在 PyCharm 下运行/调试单个测试时,不会显示 logging.logger 消息。我已经尝试logging.basicConfig(level=logging.DEBUG)按照在 PyCharm 中进行单元测试时如何查看日志消息的建议进行设置?但这也无济于事。我怀疑这可能是 django 的TestCase设置干扰。
在测试设置或运行器配置中是否有其他方法可以为测试运行打开调试日志记录?
我现在在 settings.py 中设置的日志记录是:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': '/var/log/em/mcqueen-dev.log',
'when': 'midnight',
'formatter': 'verbose',
},
},
'formatters': {
'verbose': {
'format': '%(asctime)s.%(msecs).03d - %(process)d - %(thread)d - %(levelname)8s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s'
},
'simple': {
'format': '%(asctime)s - %(levelname)s %(message)s'
},
}, …Run Code Online (Sandbox Code Playgroud)