生成器对象上的断言

时间:2013-10-05 09:36:16

标签: python unit-testing generator assertion

是否有内省生成器对象的技术(例如单元测试中的断言)?

更具体地说,我有一个数据处理管道,包含一系列小函数,通常在列表推导或生成器表达式中应用于值,如下所示:

生成一些随机数据:

>>> raw_data = ["${}".format(RND.randint(10, 100)) for c in range(10)]

>>> # a function that does some sort of of transform
>>> fnx = lambda q: float(q.replace('$', ''))

>>> d1 = [fnx(itm) for itm in raw_data]

在下一步中,将对 d1 的项目应用另一个转换函数,依此类推。

在上面的例子中,断言,例如, prices_clean 的长度,或其值的最小值/最大值等,是我的单元测试套件的核心:

>>> assert len(d1) == 10

鉴于我只是要迭代这些中间结果,我实际上并不需要列表,生成器对象会做,并且给出了更低的内存配置文件,这就是我使用的:

>>> d1 = (fnx(itm) for itm in raw_data)

当然,使用列表推导时依赖的断言不适用于生成器对象:

>>> d1
  <generator object <genexpr> at 0x106da9230>

>>> assert len(d1) == 10
  Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    assert len(d1) == 10
  TypeError: object of type 'generator' has no len()

如果我必须在生成器对象上调用 list()仅用于断言,那么我的测试套件运行速度非常慢(不幸的实际结果是debs通常根本不运行它)

我已经查看了生成器对象的属性,我可以有用地反省,但我没有看到我如何以我在这里描述的方式经常使用它们。

2 个答案:

答案 0 :(得分:1)

正如@ thg435评论的那样,在不消耗它的情况下,你不知道发电机的长度。

通常我会做以下其中一项:

如果生成器产生少量元素:

assert len(list(d1)) == 10

assert sum(1 for x in d1) == 10

答案 1 :(得分:1)

Reference for Type checking of a Generator object

import types
self.assertIsInstance(_result_generator, types.GeneratorType)