【发布时间】:2015-04-11 14:53:27
【问题描述】:
想象一下我有一个简单的“最好的不可变”结构类:
class Foobar(object):
__slots__ = ('_foo', '_bar')
def __init__(self, *, foo, bar):
self._foo = foo
self._bar = bar
foo = property(lambda self: self._foo)
bar = property(lambda self: self._bar)
def woof(self):
return self._foo + self._bar
我可以想到这些明显的测试来测试这个类:
Foobar(foo=-20, bar=62).foo == -20Foobar(foo=-20, bar=62).bar == 62Foobar(foo=-20, bar=62).woof() == 42-
Foobar(foo=-20, bar=62).foo = 314应该抛出AttributeError -
Foobar(foo=-20, bar=62).bar = 314应该抛出AttributeError
但是,这些测试仅适用于满意的情况。但是当涉及到测试不成功时,我被困住了:
- 我应该测试构造函数抛出无关的参数吗?抛出位置参数?抛出缺少关键字参数?
- 我是否应该测试不能为该实例分配其他属性?
- 我应该测试
woof()不接受参数吗? - 我是否应该通过一些不适合上下文的类型(整数、浮点数、列表、元组、字典、无、集合、冻结集、字节、字符串、正则表达式、切片、帧、函数、绑定方法等)的笛卡尔积进行暴力破解on) 并尝试
foo和bar的每种可能组合?如果需要,如何将类型选择到该集合中?
“环境响应”是指运行时对代码所做的隐式工作。当给出的参数不足/无关的参数时,不是我的代码直接抛出 TypeError,而是基于我的代码的运行时检查。
通过类型列表的笛卡尔积进行暴力破解,我的意思是尝试以下操作:
Foobar(foo=0, bar=0 ).woof()
Foobar(foo=0, bar=None ).woof()
Foobar(foo=0, bar=lambda: 0).woof()
Foobar(foo=0, bar=() ).woof()
Foobar(foo=0, bar=(10, ) ).woof()
Foobar(foo=0, bar="" ).woof()
Foobar(foo=0, bar="test" ).woof()
Foobar(foo=0, bar=True ).woof()
...
Foobar(foo=None, bar=0 ).woof()
Foobar(foo=None, bar=None ).woof()
Foobar(foo=None, bar=lambda: 0).woof()
Foobar(foo=None, bar=() ).woof()
Foobar(foo=None, bar=(10, ) ).woof()
Foobar(foo=None, bar="" ).woof()
Foobar(foo=None, bar="test" ).woof()
Foobar(foo=None, bar=True ).woof()
...
Foobar(foo=lambda: 0, bar=0 ).woof()
Foobar(foo=lambda: 0, bar=None ).woof()
Foobar(foo=lambda: 0, bar=lambda: 0).woof()
Foobar(foo=lambda: 0, bar=() ).woof()
Foobar(foo=lambda: 0, bar=(10, ) ).woof()
Foobar(foo=lambda: 0, bar="" ).woof()
Foobar(foo=lambda: 0, bar="test" ).woof()
Foobar(foo=lambda: 0, bar=True ).woof()
...
【问题讨论】:
标签: python unit-testing tdd methodology