python时间模拟
time_travel的Python项目详细描述
时间旅行-时间和I/O模拟库
time travel是一个python库,帮助用户编写确定性的 测试时间敏感和I/O密集型代码。
time travel在两个linux上都支持python 2.7、3.4、3.5、3.6和pypy2 和Windows。
安装
$ pip install time_travel
测试时间敏感代码
想象一下测试一个经过一段时间后超时的状态机。 一种测试方法是:
deftest_state_timeout():sm.handle_event(event=...)time.sleep(5)sm.handle_event(event=...)assertsm.state==TIMEOUT
这不好有几个原因:
- 您的测试需要5秒才能运行。那是不允许的。
- time.sleep()承诺进程将睡眠x秒 最多。此测试可能会随机失败,具体取决于 状态机是。
没有什么比海森堡更糟糕的了(好吧,也许是一个slowheisenbuild)。 这里有一个更好的方法来使用time-travel:
deftest_state_timeout():withTimeTravel()astt:sm.handle_event(event=...)tt.clock.time+=5sm.handle_event(event=...)assertsm.state==TIMEOUT
当调用handle_event方法时,它可能会检查时间 使用time或datetime模块之一。这些模块由 time-travel并返回存储在TimeTravel.clock.time中的值。
从现在起,您的时间敏感测试将运行得更快、更准确,并且 构建将是一致的。
测试I/O代码
time-travel还模拟i/o事件接口,如select和poll。
测试使用select的代码很简单-只需插入一个真正的socket对象 并从测试代码向其发送数据。但是超时呢?测试 超时时发生的行为迫使您实际wait!那是香蕉!
下面是如何使用time-travel:
deftest_select_timeout():withTimeTravel()astt:sock=socket.socket()tt.add_future_event(2,sock,tt.event_types.select.WRITE)start=time.time()assertselect.select([sock],[sock],[])==([],[sock],[])# This will be satisfied after "2 seconds"asserttime.time()==start+2# You see? 2 seconds!assertselect.select([sock],[sock],[],100)==([],[],[])# This is the "timeout"asserttime.time()==start+2+100
再次,此代码将立即运行。
哦,是的,sock甚至不必是套接字对象:)
有关详细信息和用法示例,请参见 full documentation。你知道的 你想的。