【问题标题】:assert true vs assert is not None断言真与断言不是无
【发布时间】:2019-11-27 10:06:12
【问题描述】:

我正在与一位同事进行一些自动化测试,我们想知道我们的方法是否存在任何差异。

我们有一个返回 HTTP 响应对象的方法。有时,它可能会返回 None,但通常是一个对象。

原代码为:

self.assertTrue(response)

但我觉得它可能更具可读性:

assert response is not None

我研究了关于真实性的文档中的差异,所以我知道返回 true 的东西不一定是 None。但是,在大多数情况下,两者都可以工作。许多现有的测试都在断言 true 而不是断言 not none。

有什么理由可以说明一种技术比另一种更有效吗?

【问题讨论】:

  • 我个人认为is not None 更精确,因此应该首选。我不会使用self.assertTrue,因为这只是误导。如果您想要更“懒惰”的断言,请改用assert response。但这只是我个人的看法。
  • 这能回答你的问题吗? if A vs if A is not None:
  • @Tim:这有点相关,但如果 A 为真与 A 不是无的话。我知道差别不大,或者可能有
  • 我不明白“尽管如果 A 为真与 A 不是无”在你的最后评论中。实际上很大的不同,这取决于response来自什么类:)
  • 我的回答能回答你的问题吗@CraigBrett?

标签: python automated-tests


【解决方案1】:

tldr;

通常存在功能差异,但在您的特定情况下,两种技术的执行结果将相同。现在只取决于您是否愿意明确或简洁。

完整答案

假设a在Python中是一个变量,之间有区别:

assert a

assert a is not None

在第一种情况下,您正在评估 对对象的bool() 内置 调用的返回,它遵循多种策略来获得结果,正如已经讨论过的@ 987654321@.

根据对象的类实现进行评估。你看过response 对象的类吗?它会告诉你bool(response) 的行为方式。

在第二种情况下,您将 a 评估为不是 None。这是完全不同的。例如,一个空的list 将评估为False,但不是None

>>> a = []
>>> a is not None
True
>>> assert a is not None
>>> assert a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

如果您的响应对象是从list 派生的子类,那么它的行为方式可能相同,因此评估response 的空性并不等同于将response 评估为None

在您的情况下,我猜您的 response 对象是由 request 库提供的。如果是这样,那么是的,在您的特定情况下,这两种技术在功能上是等效的,尽管您应该注意到针对 None 进行评估时的微小性能提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多