Pytest中断言与条件语句同行书写时不生效的问题咨询
两种测试写法运行结果差异的原因
两种写法运行结果不一致的核心原因是Python语法解析规则下,条件表达式(三元运算符)的逻辑绑定顺序不符合预期,同时存在is与==运算符的行为差异,二者实际执行逻辑完全不同。
第一种写法的执行逻辑
单独计算is_admin的值后再做相等判断,逻辑完全符合预期:
is_admin = True if app_database.role == 'admin' else False assert app_request['is_admin'] == is_admin
- 先根据
app_database.role的取值计算得到布尔类型的is_admin - 再判断
app_request['is_admin']与is_admin的值是否相等,相等则断言通过
第二种写法的执行逻辑
你原本预期第二种写法是先计算三元表达式的值,再和app_request['is_admin']做判断,但Python实际会将整行解析为「根据条件决定断言的表达式」:
assert app_request['is_admin'] is True if app_database.role == 'admin' else False
实际等价于:
if app_database.role == 'admin': assert app_request['is_admin'] is True else: assert False
当app_database.role不等于admin时,会直接执行assert False,无论app_request['is_admin']的取值是什么,断言都会直接失败,这就是测试不通过的核心原因。
此外还有一个潜在差异点:is是判断两个对象的内存地址是否为同一个,==是判断两个对象的值是否相等。虽然Python对布尔值True、False做了单例缓存,大部分场景下二者结果一致,但如果app_request['is_admin']是其他类型的真值(比如1、非空字符串等),== True会返回真,is True则会返回假,也可能导致断言失败。
正确的单行写法
如果要合并为一行断言,需要用括号明确三元表达式的绑定范围,同时建议使用==做值判断:
assert app_request['is_admin'] == (True if app_database.role == 'admin' else False)
也可以简化为更简洁的写法,不需要额外使用三元表达式:
assert app_request['is_admin'] == (app_database.role == 'admin')
内容的提问来源于stack exchange,提问作者mocha
相关产品推荐
相关产品推荐

