假设我有一个简单的“最好不变”结构类:
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 == -20
Foobar(foo=-20, bar=62).bar == 62
Foobar(foo=-20, bar=62).woof() == 42
Foobar(foo=-20, bar=62).foo = 314
应该抛出AttributeError
Foobar(foo=-20, bar=62).bar = 314
应该抛出AttributeError
然而,这些测试只能解释快乐的情况。但当谈到测试不成功时,我被困住了:
woof()
不接受参数吗?你知道吗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的格言之一是“我们在这里都是负责任的用户”。你知道吗
你唯一应该测试超规格使用情况的时候是,你是否能为用户提供一个强有力的理由,让他们期待这个功能能够工作。在这种情况下,你也应该考虑实施这种行为——毕竟这是意料之中的。你知道吗
相关问题 更多 >
编程相关推荐