Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pytest如何模拟线程.Timer_Python_Unit Testing_Pytest - Fatal编程技术网

Python Pytest如何模拟线程.Timer

Python Pytest如何模拟线程.Timer,python,unit-testing,pytest,Python,Unit Testing,Pytest,我知道如何模拟当前时间,我已经尝试过了。问题是我的程序使用了线程.Timer,它似乎不受模拟时间的影响 这个问题以前肯定发生过。我如何才能“睡眠”我的单元测试或以某种方式嘲笑时间的流逝 调用sleep可能是个坏主意,因为实际执行速度取决于单元测试运行在什么硬件上 关于这个问题有什么建议吗?更新:你的评论最终澄清了你想要达到的目标,即不必等待真正的60岁考试。关于如何对使用计时器的代码进行单元测试的主题,已经有一些讨论: 其基本思想是,使用一种称为“控制反转”的技术:不允许被测系统(SUT

我知道如何模拟当前时间,我已经尝试过了。问题是我的程序使用了
线程.Timer
,它似乎不受模拟时间的影响

这个问题以前肯定发生过。我如何才能“睡眠”我的单元测试或以某种方式嘲笑时间的流逝

调用
sleep
可能是个坏主意,因为实际执行速度取决于单元测试运行在什么硬件上


关于这个问题有什么建议吗?

更新:你的评论最终澄清了你想要达到的目标,即不必等待真正的60岁考试。关于如何对使用计时器的代码进行单元测试的主题,已经有一些讨论:

其基本思想是,使用一种称为“控制反转”的技术:不允许被测系统(SUT)控制时间,而是改变设计,使测试能够做到这一点。有许多不同的方法,例如a)将计时器对象转换为参数,或b)在SUT中使用可被测试覆盖的辅助方法访问它,或让SUT从工厂获得它(在测试期间替换),或使测试可以使用setter方法覆盖它等

原始答案(关注不同方面):

从您的问题和评论中,我得出结论,对于您的测试,您接受测试的执行实际上需要大约60秒(引用您的话:“我需要测试任务是否确实在60秒后执行。”以及“我如何“睡眠”我的单元测试[…]”)。您希望测试程序是否使用计时器来执行任务,这是一个集成测试场景,而不是单元测试场景

测试描述仍然不是很精确,所以我将做一些假设。假设您想测试“任务”在59秒之前执行,但也不晚于61秒。有几种方法可以实现这一点。一种简单的方法是,要实际使用睡眠58秒,检查任务是否尚未执行(测试用例1),并使用另一个睡眠61秒的测试用例,检查任务是否已执行。但是,正如您已经提到的,由于各种影响,它不是完全健壮的。您可以通过扩大时间间隔使其更加健壮

另一种方法需要更改设计:在程序中,在启动计时器之前立即读取时钟时间,并将此时间戳传递给计划的任务。在预定的任务中,第一件事再次是读取时钟。然后可以将此时间与其他时间戳进行比较。这些结果可用于测试,该测试可读取时间戳或增量。这可能更准确,但仍然受到操作系统造成的调度效果的影响


我想说,因为这个问题是关于python程序的,所以您将不得不忍受一定程度的不准确。即使在使用C语言或汇编语言编程的实时系统中,达到高精度也是一项挑战——但我们这里讨论的是不同级别的精度(微秒或更好)。

更新:您的评论最终澄清了您的目标,也就是说,你不必在考试中等待真正的60岁。关于如何对使用计时器的代码进行单元测试的主题,已经有一些讨论:

其基本思想是,使用一种称为“控制反转”的技术:不允许被测系统(SUT)控制时间,而是改变设计,使测试能够做到这一点。有许多不同的方法,例如a)将计时器对象转换为参数,或b)在SUT中使用可被测试覆盖的辅助方法访问它,或让SUT从工厂获得它(在测试期间替换),或使测试可以使用setter方法覆盖它等

原始答案(关注不同方面):

从您的问题和评论中,我得出结论,对于您的测试,您接受测试的执行实际上需要大约60秒(引用您的话:“我需要测试任务是否确实在60秒后执行。”以及“我如何“睡眠”我的单元测试[…]”)。您希望测试程序是否使用计时器来执行任务,这是一个集成测试场景,而不是单元测试场景

测试描述仍然不是很精确,所以我将做一些假设。假设您想测试“任务”在59秒之前执行,但也不晚于61秒。有几种方法可以实现这一点。一种简单的方法是,要实际使用睡眠58秒,检查任务是否尚未执行(测试用例1),并使用另一个睡眠61秒的测试用例,检查任务是否已执行。但是,正如您已经提到的,由于各种影响,它不是完全健壮的。您可以通过扩大时间间隔使其更加健壮

另一种方法需要更改设计:在程序中,在启动计时器之前立即读取时钟时间,并将此时间戳传递给计划的任务。在预定的任务中,第一件事再次是读取时钟。然后可以将此时间与其他时间戳进行比较。这些结果可用于测试,该测试可读取时间戳或增量。这可能更准确,但仍然受到操作系统造成的调度效果的影响

我想说,因为这个问题是关于python程序的,所以您将不得不忍受一定程度的不准确。即使在使用C语言或汇编语言编程的实时系统中,达到高精度也是一项挑战——但我们这里讨论的是不同级别的精度(微秒或更好)。

如果你看一下C语言,你会发现