我正在与一位同事进行一些自动化测试,我们想知道我们的方法是否存在差异。
我们有一个返回HTTP响应对象的方法。有时,它可能返回None,但通常返回一个对象。
原始代码是:
self.assertTrue(response)
但是我觉得拥有它可能更容易理解
assert response is not None
我调查了真实性文档中的差异,因此我知道可以返回true的东西不一定是None。但是,在大多数情况下,两者都可以工作。而且许多现有的测试都在断言是正确,而不是没有断言。
有什么理由使一种技术比另一种更好?
答案 0 :(得分:0)
通常会有功能上的差异,尽管在您的特定情况下,两种技术的执行结果都相同。现在,这仅取决于您是否明确或简洁。
假设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
的空度并不等同于评估response
为None
。
就您而言,我想您的response
对象是由request
库提供的。如果是这样,那么是的,在您的特定情况下,这两种技术在功能上是等效的,尽管您应该注意到,针对None
进行的性能提升很小。