在写否定的单元测试时,是否应该用一个测试来表示“环境反应”?

2024-10-05 12:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个简单的“最好不变”结构类:

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. 我是否应该通过一些上下文不合适类型(整数、浮点数、列表、元组、dict、Nones、set、frozenset、bytes、string、regex、slices、frames、functions、bound methods等等)的笛卡尔积,并尝试foobar的各种可能组合?如果我应该的话,如何在那一组中选择类型?你知道吗

我所说的“环境响应”是指运行时对代码所做的隐式工作。当给定的参数不足/无关时,不是我的代码直接抛出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()
...

Tags: lambda代码testselfnonetrue类型参数
1条回答
网友
1楼 · 发布于 2024-10-05 12:19:07

一般来说,我会说不。Python的格言之一是“我们在这里都是负责任的用户”。你知道吗

你唯一应该测试超规格使用情况的时候是,你是否能为用户提供一个强有力的理由,让他们期待这个功能能够工作。在这种情况下,你也应该考虑实施这种行为——毕竟这是意料之中的。你知道吗

相关问题 更多 >

    热门问题