断言true vs断言不为None

时间:2019-11-27 10:06:12

标签: python automated-tests

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

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

原始代码是:

self.assertTrue(response)

但是我觉得拥有它可能更容易理解

assert response is not None

我调查了真实性文档中的差异,因此我知道可以返回true的东西不一定是None。但是,在大多数情况下,两者都可以工作。而且许多现有的测试都在断言是正确,而不是没有断言。

有什么理由使一种技术比另一种更好?

1 个答案:

答案 0 :(得分:0)

tldr;

通常会有功能上的差异,尽管在您的特定情况下,两种技术的执行结果都相同。现在,这仅取决于您是否明确或简洁。

完整答案

假设a是Python中的变量,两者之间存在差异

assert a

assert a is not None

在第一种情况下,您正在评估调用返回到对象上的bool() buit-in ,该方法遵循多种策略来获得结果,因为它已经讨论过here

这将根据对象的类实现评估 only 。您是否看过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的空度并不等同于评估responseNone

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