让你的Python测试穿越时空
项目描述
FreezeGun:让你的Python测试穿越时空
====================================================
.. image:: https://secure.travis-ci.org/spulec/freezegun.png?branch=master
:target: https://travis-ci.org/spulec/freezegun
.. image:: https://coveralls.io/repos/spulec/freezegun/badge.png?branch=master
:target: https://coveralls.io/r/spulec/freezegun
FreezeGun是一个库,允许你的Python测试通过模拟datetime模块穿越时空。
使用方法
-----
一旦装饰器或上下文管理器被调用,对datetime.datetime.now()、datetime.datetime.utcnow()、datetime.date.today()、time.time()、time.localtime()、time.gmtime()和time.strftime()的所有调用都将返回冻结的时间。
装饰器
~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
import datetime
import unittest
@freeze_time("2012-01-14")
def test()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
# Or a unittest TestCase - freezes for every test, from the start of setUpClass to the end of tearDownClass
@freeze_time("1955-11-12")
class MyTests(unittest.TestCase)
def test_the_class(self)
assert datetime.datetime.now() == datetime.datetime(1955, 11, 12)
# Or any other class - freezes around each callable (may not work in every case)
@freeze_time("2012-01-14")
class Tester(object)
def test_the_class(self)
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
上下文管理器
~~~~~~~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
def test()
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
with freeze_time("2012-01-14")
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
原始使用
~~~~~~~
.. code-block:: python
from freezegun import freeze_time
freezer = freeze_time("2012-01-14 12:00:01")
freezer.start()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14, 12, 0, 1)
freezer.stop()
时区
~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
@freeze_time("2012-01-14 03:21:34", tz_offset=-4)
def test()
assert datetime.datetime.utcnow() == datetime.datetime(2012, 1, 14, 3, 21, 34)
assert datetime.datetime.now() == datetime.datetime(2012, 1, 13, 23, 21, 34)
# datetime.date.today() uses local time
assert datetime.date.today() == datetime.date(2012, 1, 13)
良好的输入
~~~~~~~~~~~
FreezeGun在幕后使用dateutil,因此你可以有看起来很漂亮的日期时间。
.. code-block:: python
@freeze_time("Jan 14th, 2012")
定义 test_nice_datetime()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
`tick` 参数
~~~~~~~~~~~
FreezeGun 有一个额外的 `tick` 参数,它将在给定的值上重新启动时间,但时间将继续流逝。这是默认参数的替代方案,默认参数将使时间停止。
...
@freeze_time("Jan 14th, 2020", tick=True)
.. code-block:: python
断言 datetime.datetime.now() > datetime.datetime(2020, 1, 14)
定义 test_nice_datetime()
手动计时
Freezegun 允许手动前进时间
~~~~~~~~~~~~
...
.. code-block:: python
def test_manual_increment()
initial_datetime = datetime.datetime(year=1, month=7, day=12,
hour=15, minute=6, second=3)
with freeze_time(initial_datetime) as frozen_datetime
assert frozen_datetime() == initial_datetime
frozen_datetime.tick()
initial_datetime += datetime.timedelta(seconds=1)
assert frozen_datetime() == initial_datetime
frozen_datetime.tick(delta=datetime.timedelta(seconds=10))
initial_datetime += datetime.timedelta(seconds=10)
assert frozen_datetime() == initial_datetime
将时间移动到指定的时间
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FreezeGun 允许将时间移动到特定日期
.. code-block:: python
def test_move_to()
initial_datetime = datetime.datetime(year=1, month=7, day=12,
hour=15, minute=6, second=3)
other_datetime = datetime.datetime(year=2, month=8, day=13,
hour=14, minute=5, second=0)
with freeze_time(initial_datetime) as frozen_datetime
assert frozen_datetime() == initial_datetime
frozen_datetime.move_to(other_datetime)
assert frozen_datetime() == other_datetime
frozen_datetime.move_to(initial_datetime)
assert frozen_datetime() == initial_datetime
`move_to` 参数可以是任何有效的 `freeze_time` 日期(字符串、日期、datetime)。
默认参数
~~~~~~~~~~~~~~~~~
请注意,Freezegun 不会修改默认参数。以下代码将打印当前日期。有关为什么,请参阅 `here <http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments>`_。
...
.. code-block:: python
from freezegun import freeze_time
import datetime as dt
def test(default=dt.date.today())
print(default)
with freeze_time('2000-1-1')
test()
安装
------------
要安装 FreezeGun,只需
.. code-block:: bash
$ pip install freezegun
在 Debian (Testing 和 Unstable) 系统上
.. code-block:: bash
$ sudo apt-get install python-freezegun
====================================================
.. image:: https://secure.travis-ci.org/spulec/freezegun.png?branch=master
:target: https://travis-ci.org/spulec/freezegun
.. image:: https://coveralls.io/repos/spulec/freezegun/badge.png?branch=master
:target: https://coveralls.io/r/spulec/freezegun
FreezeGun是一个库,允许你的Python测试通过模拟datetime模块穿越时空。
使用方法
-----
一旦装饰器或上下文管理器被调用,对datetime.datetime.now()、datetime.datetime.utcnow()、datetime.date.today()、time.time()、time.localtime()、time.gmtime()和time.strftime()的所有调用都将返回冻结的时间。
装饰器
~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
import datetime
import unittest
@freeze_time("2012-01-14")
def test()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
# Or a unittest TestCase - freezes for every test, from the start of setUpClass to the end of tearDownClass
@freeze_time("1955-11-12")
class MyTests(unittest.TestCase)
def test_the_class(self)
assert datetime.datetime.now() == datetime.datetime(1955, 11, 12)
# Or any other class - freezes around each callable (may not work in every case)
@freeze_time("2012-01-14")
class Tester(object)
def test_the_class(self)
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
上下文管理器
~~~~~~~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
def test()
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
with freeze_time("2012-01-14")
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
原始使用
~~~~~~~
.. code-block:: python
from freezegun import freeze_time
freezer = freeze_time("2012-01-14 12:00:01")
freezer.start()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14, 12, 0, 1)
freezer.stop()
时区
~~~~~~~~~
.. code-block:: python
from freezegun import freeze_time
@freeze_time("2012-01-14 03:21:34", tz_offset=-4)
def test()
assert datetime.datetime.utcnow() == datetime.datetime(2012, 1, 14, 3, 21, 34)
assert datetime.datetime.now() == datetime.datetime(2012, 1, 13, 23, 21, 34)
# datetime.date.today() uses local time
assert datetime.date.today() == datetime.date(2012, 1, 13)
良好的输入
~~~~~~~~~~~
FreezeGun在幕后使用dateutil,因此你可以有看起来很漂亮的日期时间。
.. code-block:: python
@freeze_time("Jan 14th, 2012")
定义 test_nice_datetime()
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
`tick` 参数
~~~~~~~~~~~
FreezeGun 有一个额外的 `tick` 参数,它将在给定的值上重新启动时间,但时间将继续流逝。这是默认参数的替代方案,默认参数将使时间停止。
...
@freeze_time("Jan 14th, 2020", tick=True)
.. code-block:: python
断言 datetime.datetime.now() > datetime.datetime(2020, 1, 14)
定义 test_nice_datetime()
手动计时
Freezegun 允许手动前进时间
~~~~~~~~~~~~
...
.. code-block:: python
def test_manual_increment()
initial_datetime = datetime.datetime(year=1, month=7, day=12,
hour=15, minute=6, second=3)
with freeze_time(initial_datetime) as frozen_datetime
assert frozen_datetime() == initial_datetime
frozen_datetime.tick()
initial_datetime += datetime.timedelta(seconds=1)
assert frozen_datetime() == initial_datetime
frozen_datetime.tick(delta=datetime.timedelta(seconds=10))
initial_datetime += datetime.timedelta(seconds=10)
assert frozen_datetime() == initial_datetime
将时间移动到指定的时间
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FreezeGun 允许将时间移动到特定日期
.. code-block:: python
def test_move_to()
initial_datetime = datetime.datetime(year=1, month=7, day=12,
hour=15, minute=6, second=3)
other_datetime = datetime.datetime(year=2, month=8, day=13,
hour=14, minute=5, second=0)
with freeze_time(initial_datetime) as frozen_datetime
assert frozen_datetime() == initial_datetime
frozen_datetime.move_to(other_datetime)
assert frozen_datetime() == other_datetime
frozen_datetime.move_to(initial_datetime)
assert frozen_datetime() == initial_datetime
`move_to` 参数可以是任何有效的 `freeze_time` 日期(字符串、日期、datetime)。
默认参数
~~~~~~~~~~~~~~~~~
请注意,Freezegun 不会修改默认参数。以下代码将打印当前日期。有关为什么,请参阅 `here <http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments>`_。
...
.. code-block:: python
from freezegun import freeze_time
import datetime as dt
def test(default=dt.date.today())
print(default)
with freeze_time('2000-1-1')
test()
安装
------------
要安装 FreezeGun,只需
.. code-block:: bash
$ pip install freezegun
在 Debian (Testing 和 Unstable) 系统上
.. code-block:: bash
$ sudo apt-get install python-freezegun