外卡日志检查在测试夹具中

2024-04-26 14:06:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用testfixureslog.check()来验证日志的输出。我的日志语句包含会话和持续时间等可变部分。例如:

2014-02-13T12:04:40.013822 user=user action=do_x session=4a5869aa-f581-4263-a567-918b792587e5 duration=200

我的log.check()看起来像这样,但目前不起作用。你知道吗

...
log.check(
              ('root', 'INFO', '2014-02-13T12:04:40.013822 user=user action=do_x  session=4a5869aa-f581-4263-a567-918b792587e5 duration=200'),
...

是否可以检查第一部分但允许第二部分使用通配符?你知道吗

@编辑

@威尔哈特道歉,目前的问题是我的日志声明与我的预期不符。我的日志行由静态文本(键)和变量(值)组成。问题是有些值是在方法中生成的,比如session\u id。因此我无法编写有意义的期望值,因为它永远不会与方法中生成的log语句匹配。你知道吗

我所追求的几乎是一个“包含”检查,以验证我知道的那些值的存在是静态的,我可以模拟。你知道吗

实际上,我离开了testfixture,转而尝试使用Mock来实现这一点,方法是模拟我的记录器,然后调用assert \u called \u with(“var1=%s var2=%s var3=s%”,var1,var2,var3),但是问题仍然存在,如果var1和var2是从方法调用返回的值,我可以模拟它们,但是假设var3是一个时间戳。这是在方法内部生成的,所以在我的测试中,我不想断言val3的值。在Java中,您可以使用任何匹配任何值的()。我在Python中找不到任何等价的东西。你知道吗


Tags: 方法logsessioncheck静态action语句do
1条回答
网友
1楼 · 发布于 2024-04-26 14:06:15

最好的方法是不使用testfixture,而是模拟我的记录器并传递给类构造函数,以便我可以模拟它。你知道吗

所以我的日志语句看起来像:

self.logger.info("%s user=%s action=%s nodegroup=%s session=%s", datetime.datetime.now().isoformat(), options.username, options.action, options.nodegroup, str(session_id))

在测试中,我可以验证输出:

action_log_text = '%s user=%s action=%s nodegroup=%s session=%s'
fin_log_text = '%s %s user=%s action=%s nodegroup=%s session=%s duration=%s'

...

calls = [call(self.action_log_text, ANY, options.username, options.action, options.nodegroup, ANY),
                 call(self.fin_log_text, ANY, '[FIN]', options.username, options.action, options.nodegroup, ANY, ANY)]

self.logger.info.assert_has_calls(calls)

结果发现pythonmock有任何匹配任何东西的属性。很可爱。你知道吗

相关问题 更多 >