Pytest如何嘲笑threading.Timer

问题描述 投票:0回答:2

我知道如何嘲笑当前的时间,我有tried.The问题是我的程序使用threading.Timer,这似乎被嘲讽的时间不受影响。

当然这个问题以前也发生过。我怎么能“睡”我的单元测试,或在某种程度上嘲笑时间的流逝?

调用sleep可能是一个坏主意,因为执行的实际速度取决于哪些硬件单元测试运行上。

在这个问题上有什么建议?

python unit-testing pytest
2个回答
0
投票

Upate:您的评论终于明确你打算实现的,即不必等待真正的60年代在您的测试内容。已经有话题的一些讨论如何单元测试代码,用定时器的工作原理:

其基本思路是,使用一个名为“控制反转”技术:与其让测试(SUT)系统的控制时间,改变设计,使得测试可以做到这一点。有许多不同的方式,例如a)将计时器对象为自变量,或,b)以能够由测试覆盖,或一个辅助方法的SUT内访问它,已在SUT从工厂获得它(您在测试过程中替换),或者,有可能使一个测试用的setter方法等将其覆盖

原来的答案(侧重于不同方面):

从你的问题和评论我的结论是,你的测试你接受测试的执行实际上将需要大约60秒(引用你:“我需要测试任务是60秒后确实执行。”和“我如何”睡眠 “我的单元测试[...]”)。要测试程序使用的定时器来执行任务 - 这是不是一个单元测试场景的集成测试场景。

测试说明还不是很精确的,所以我会做一些假设。让我们假设你要测试的“任务”之前没有执行,也就是说,59S,也不得迟于,比如说,61S。有几种方法来实现这一目标。一个简单的方法是,实际使用睡眠58S,检查任务尚未执行(测试用例1),并有另一个测试用例61S的睡眠和检查任务执行。但是,由于各种效果是不完全健壮,因为你已经提到。您可以通过放大的时间间隔也更稳健。

另一种方法需要设计变更:在你的程序在启动定时器之前立即读取时钟与这次邮票传递给你的计划任务。在计划任务的第一件事又是读时钟。这一次,然后可以对其他时间戳进行比较。这些结果做出的测试,其读取时间戳或增量访问。这可能是更准确的,但仍然是,例如,通过调度所造成的操作系统效应的影响。

我会说,因为这问题是关于Python程序,你就只能忍受一定程度的不准确性。即使在C甚至汇编语言程序的实时系统,达到精度高的水平是具有挑战性的 - 但我们谈论的是不同级别的精确度在这里(微秒更好)。


2
投票

如果你看一下the source for threading.Timer,你可以看到延时效果来自Timer(这本身就是一个Thread)只调用.wait()一个threading.Event对象。

你可以使用unittest.mockpytest-mock以取代一个实际上不等待任何事情Event.wait()实施。

© www.soinside.com 2019 - 2024. All rights reserved.