assert true vs assert不是Non

2024-06-17 23:19:23 发布

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

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

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

原始代码是:

self.assertTrue(response)

但我觉得这样更有可读性:

^{pr2}$

我研究了关于真理的文献中的不同之处,所以我意识到有些事情是真的,但并不一定没有。然而,在大多数情况下,两者都会奏效。很多现有的测试都是断言true,而不是断言not none。在

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


Tags: 对象方法代码selfhttpresponse断言事情
1条回答
网友
1楼 · 发布于 2024-06-17 23:19:23

tldr

虽然在您的特定情况下,这两种技术的执行结果将是相同的,但一般来说,这两种技术在功能上是不同的。现在这只取决于你是否愿意明确或简洁。在

完整答案

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

assert a

以及

^{pr2}$

在第一种情况下,您正在计算对对象上的bool()内置调用的返回,它遵循多种策略来获得结果,正如已经讨论的here。在

根据对象的类实现,它只对求值。你看过你的response对象的类了吗?它将告诉您bool(response)的行为。在

在第二种情况下,您正在评估a不是None。这完全不同。例如,空的list将计算为False,但不是{}:

>>> 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计算的性能增益很小。在

相关问题 更多 >