断言真与断言不是无

Cra*_*ett 8 python automated-tests

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

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

原代码是:

self.assertTrue(response)
Run Code Online (Sandbox Code Playgroud)

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

assert response is not None
Run Code Online (Sandbox Code Playgroud)

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

为什么一种技术会比另一种更好?

Tim*_*Tim 14

tldr;

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

完整答案

假设这a是Python中的一个变量,以下区别:

assert a
Run Code Online (Sandbox Code Playgroud)

assert a is not None
Run Code Online (Sandbox Code Playgroud)

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

根据对象的类实现进行评估。你有没有看一下你的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
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,我猜您的response对象是由request库提供的。如果是这样,那么是的,在您的特定情况下,这两种技术在功能上是等效的,但您应该注意到对None.