Python 在编写否定单元测试时,是否应该对“环境响应”进行一次测试?

Python 在编写否定单元测试时,是否应该对“环境响应”进行一次测试?,python,unit-testing,tdd,methodology,Python,Unit Testing,Tdd,Methodology,假设我在它的最佳结构类中有simple immutable: 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: se

假设我在它的最佳结构类中有simple immutable:

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
我可以想到这些明显的测试来测试这个类:

Foobarfoo=-20,bar=62.foo==-20 Foobarfoo=-20,bar=62。bar==62 Foobarfoo=-20,bar=62.woof==42 Foobarfoo=-20,bar=62.foo=314应该抛出AttributeError Foobarfoo=-20,bar=62。bar=314应抛出AttributeError 然而,这些测试只能解释令人满意的情况。但当涉及到测试不成功时,我被卡住了:

我应该测试构造函数抛出的无关参数吗?抛出位置参数?抛出缺少的关键字参数? 我是否应该测试不能为实例分配其他属性? 我应该测试woof不接受论点吗? 我是否应该强行遍历一些上下文不合适类型的大型列表的笛卡尔积整数、浮点数、列表、元组、dict、Nones、set、frozenset、字节、字符串、正则表达式、切片、帧、函数、绑定方法等,并尝试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的格言之一是我们在这里都是负责任的用户


您应该测试超出规格的使用情况的唯一时间是,如果您能够为用户提供一个充分的理由,让他们期望该功能正常工作。在这种情况下,你也应该考虑实施这一行为——这是意料之中的事。

好的,这可能意味着错误类型的进食类,因为这完全是同意成年人失败的结果,所以4是不存在的。但是1和2呢?根据测试驱动的方法,每一行代码在编写之前都必须经过测试。所以,为了有权向构造函数写入参数列表,以及有权限制_u插槽_;,之前必须测试一些东西——但具体是什么呢?