在编写负面单元测试时,是否应该测试“环境响应”?

时间:2015-04-11 14:53:28

标签: python unit-testing tdd methodology

想象一下,我有一个简单的“不可变的最佳”结构类:

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

然而,这些测试仅考虑了快乐案例。但是当它归结为测试不成功时,我被困住了:

  1. 我应该测试该构造函数是否会抛出无关的参数?抛出位置论点?抛出缺少的关键字参数?
  2. 我应该测试该实例是否无法分配其他属性吗?
  3. 我应该测试woof()不接受参数吗?
  4. 我是否应该通过一些大型上下文不合适的类型(整数,浮点数,列表,元组,字符串,Nones,集合,frozensets,字节,字符串,正则表达式,切片,框架,函数,绑定方法等)的笛卡尔积。 on)并尝试foobar的每种可能组合?如果我应该,如何选择类型到那个集合?
  5. “环境响应”是指隐式工作运行时对代码的影响。当给出不足/无关的参数时,不是我的代码直接抛出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()
    ...
    

1 个答案:

答案 0 :(得分:0)

一般来说,我说不。 Python的一个主题是"我们在这里负责所有用户"。

您应该测试不合规格用途的唯一时间是,如果您能够为用户提供强大的理由,希望该功能能够正常运行。在这种情况下,你也应该考虑实施这种行为 - 毕竟是预期的。