Python 当这些方法应用于真值时,unittest模块中的断言和assertTrue之间有什么区别?
我的工作环境:Python 当这些方法应用于真值时,unittest模块中的断言和assertTrue之间有什么区别?,python,unit-testing,Python,Unit Testing,我的工作环境: OS: Ubuntu 18.04 (64 bits) Python version: 3.8.0 (64 bits) 我有一个关于unittest文档的问题,更准确地说,就是assertTrue和Asserts方法之间的区别。以下是在线文档的内容: assertTrue(expr,msg=None) assertFalse(expr,msg=None) 测试expr是否为真(或假) 请注意,这相当于bool(expr)为True,而not to expr为True True(
OS: Ubuntu 18.04 (64 bits)
Python version: 3.8.0 (64 bits)
我有一个关于unittest文档的问题,更准确地说,就是assertTrue
和Asserts
方法之间的区别。以下是在线文档的内容:
assertTrue(expr,msg=None)
assertFalse(expr,msg=None)
测试expr是否为真(或假)
请注意,这相当于bool(expr)为True,而not to expr为True
True(对于后者,使用断言(expr,True))
我真的不明白其中的区别,也就是说,如果我有一个布尔类型和一个真值,那么为什么我应该使用
asserts
而不是assertTrue
?假设bool(True)为True
也返回True布尔值,我看不到差异和对测试的影响。如果您能做一些澄清,我将不胜感激。要回答这个问题,您必须理解is
和=
比较运算符之间的区别,假设您有两个不同的男孩,但他们都是Peters,他们有相同的名字,因此=
将为您提供真实信息,但是is
会给你假消息,因为他们不是一个人
导入单元测试
类别MyClass:
定义初始值(自身,值):
自我价值=价值
定义(自身、其他):
返回self.value==other.value
类TestStringMethods(unittest.TestCase):
def测试功能(自我):
x=MyClass(5)
y=MyClass(5)
z=x
打印(x是y)#假x不是y,它们是单独的对象
打印(x==y)#真5==5
print(x是z)#True,因为z是对同一对象的引用
打印(z==y)#真5==5
#self.assertIs(x,y)#如果取消对该行的注释,则会出现错误
断言(x,z)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
根据
AssertTrue
m,它有完全不同的用途,例如if[]:
为False
和if[1]
为True
基本上是正确的-在大多数情况下,在测试中,您可能会使用AssertTrue
进行检查,而不是断言(True)
真正需要断言(True)的唯一真正有用的情况是,如果要检查选中的表达式是否实际返回bool
值,例如:
def测试布尔(自):
a=正确
b=1
自评资产真实性(a)
self.assertions(a,True)
自评资产真实性(b)
self.assertionsnot(b,True)
如果您有一个函数可以返回不同类型的值,并且希望确保它返回一个具体的bool
值,那么这可能会很有趣。考虑一个(无意义的)函数:
def fct(参数):
如果参数<0:
返回错误
如果参数>0:
返回真值
返回42
...
def测试功能(自身):
assertTrue(fct(1))#不会确保它返回True
assertTrue(fct(0))#也通过
断言(正确,fct(1))#按预期传递
断言(True,fct(0))应该失败
它还可以帮助确保您测试的函数应该返回一个bool
值(而不仅仅是由于某些bug而计算为True
或False
的值,如None
或数字)
当然,这一切都是有效的,因为(如
None
)、True
和False
都是单例对象,例如,它们总是只有一个。非常感谢您的帮助。非常有趣的例子和清晰的解释。事实上,我没有考虑到被计算为真值和被明确定义并声明为布尔值并不完全是一回事。非常微妙的一点。非常感谢你的帮助,让我明白这一点。非常感谢你的帮助。这实际上是我第一次看到def uu eq uu(self,other)的重新定义。实际上,这是一个基于用户如何定义/重新定义此方法的解释问题,显然,基于引用的相等性检查和仅基于属性值的相等性检查是不同的。因此AssertTrue只检查测试值是否可以计算为True boolean值,但断言检查测试参数(=对象)是否实际上是对Python True对象的引用。我现在理解正确了吗?每个python对象在内存中都有地址,is
检查它的两个引用是否指向相同的内存地址。要查看它,只需从我的示例中打印x,y,z
,您将看到对象的地址(直到您为类定义了\uuu repr\uuu
。AssertTrue
具有完全不同的用例,例如,您可以检查列表
或dict
中是否包含元素,如果是,您将得到True。我在我的类中定义了\uu eq\uu
,因为Python不知道如何使用=
来比较类对象定义。)d由用户指定。