网易首页 > 网易号 > 正文 申请入驻

Python 单元测试:assertTrue 和assertFalse 的真假

0
分享至

Lightbot在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别。

定义

下面是目前单元测试模块文档中关于assertTrue 和 assertFalse 的说明,代码进行了高亮:

assertTrue(expr, msg=None)
assertFalse(expr, msg=None)

测试该表达式是真值(或假值)。
注:这等价于"bool(expr) is True"而不等价于"expr is True"(后一种情况请使用 assertIs(expr, True))。
Mozilla 开发者网络中定义 真值 如下:
在一个布尔值的上下文环境中能变成“真”的值
在 Python 中等价于:

bool(expr) is True

这个和 assertTrue 的测试目的完全匹配。

因此该文档中已经指出 assertTrue 返回真值,assertFalse 返回假值。这些断言方法从接受到的值构造出一个布尔值,然后判断它。同样文档中也建议我们根本不应该使用 assertTrue 和 assertFalse。

在实践中怎么理解?

我们使用一个非常简单的例子 - 一个名称为 always_true的函数,它返回 True。我们为它写一些测试用例,然后改变代码,看看测试用例的表现。

作为开始,我们先写两个测试用例。一个是“宽松的”:使用 assertTrue来测试真值。另外一个是“严格的”:使用文档中建议的 assertIs 函数。

import unittest
from func import always_true
class TestAlwaysTrue(unittest.TestCase):
def test_assertTrue(self):
"""
always_true returns a truthy value
"""
result = always_true()
self.assertTrue(result)
def test_assertIs(self):
"""
always_true returns True
"""
result = always_true()
self.assertIs(result, True)

下面是func.py中的非常简单的函数代码:

def always_true():
"""
I'm always True.
Returns:
bool: True
"""
return True

当你运行时,所有测试都通过了:

always_true returns True ... ok
always_true returns a truthy value ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.004s
OK

开心ing~

现在,某个人将 "always_true" 函数改变成下面这样:

def always_true():
"""
I'm always True.
Returns:
bool: True
"""
return 'True'

它现在是用返回字符串"True" 来替代之前反馈的 True (布尔值)。(当然,那个“某人”并没有更新文档 - 后面我们会增加难度。)

这次结果并不如开心了:

always_true returns True ... FAIL
always_true returns a truthy value ... ok
======================================================================
FAIL: always_true returns True
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/assertttt/test.py", line 22, in test_is_true
self.assertIs(result, True)
AssertionError: 'True' is not True
----------------------------------------------------------------------
Ran 2 tests in 0.004s
FAILED (failures=1)

只有一个测试用例失败了!这意味着 assertTrue 给了我们一个误判。在它不应该通过测试时,它通过了。很幸运的是我们第二个测试是使用 assertIs 来写的。

false-positive

因此,跟手册上了解到的信息一样,为了保证 always_true 的功能和更严格测试的结果保持一致,应该使用 assertIs 而不是 assertTrue。

使用断言的辅助方法

使用 assertIs 来测试返回 True 和 False 来冗长了。因此,如果你有个项目需要经常检查是否是返回了 True 或者 False,那们你可以自己编写一些断言的辅助方法。

这好像并没有节省大量的代码,但是我个人觉得提高了代码的可读性。

def assertIsTrue(self, value):
self.assertIs(value, True)
def assertIsFalse(self, value):
self.assertIs(value, False)

总结

一般来说,我的建议是让测试越严格越好。如果你想测试 True 或者 False,听从文档的建议,使用 assertIs。除非不得已,否则不要使用 assertTrue 和 assertFalse。

如果你面对的是一个可以返回多种类型的函数,例如,有时候返回布尔值,有时候返回整形,那么考虑重构它。这是代码的异味。在 Python 中,抛出一个异常比使用 False 表示错误更好。

此外,如果你确实想使用断言来判断函数的返回值是否是真,可能还存在第二个代码异味 - 代码是正确封装了吗?如果 assertTrue 和 assertFalse 是根据正确的 if 语句来执行,那么值得检查下你是否把所有你想要的东西都封装在合适的位置。也许这些 if语句应该封装在测试的函数中。

测试开心!

  • 原文来自:https://linux.cn/article-7914-1.html?pr
  • 本文地址:https://www.linuxprobe.com/python-unit.html编辑:张庚,审核员:冯琪

本文原创地址:https://www.linuxprobe.com/python-unit.html编辑:public,审核员:暂无

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
终于有经济学家批评体制内退休金太高、加剧代际矛盾,评论区炸锅

终于有经济学家批评体制内退休金太高、加剧代际矛盾,评论区炸锅

慧翔百科
2026-06-23 08:47:02
这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

宇宙时空
2026-05-26 18:20:10
善恶终有报!“港独分子”陈方安生,弟弟自杀女儿去世,晚景凄凉

善恶终有报!“港独分子”陈方安生,弟弟自杀女儿去世,晚景凄凉

爱意随风起呀
2026-07-19 18:42:06
局势失控?美狂轰7小时不留情,伊暗流涌动,内贾德一招暗度陈仓

局势失控?美狂轰7小时不留情,伊暗流涌动,内贾德一招暗度陈仓

健身狂人
2026-07-19 15:03:34
最高院:提供 “口交” “肛交”等进入式性服务,是否属卖淫行为?

最高院:提供 “口交” “肛交”等进入式性服务,是否属卖淫行为?

周军律师聊案子
2026-04-21 09:50:16
西班牙专家一针见血地指出:中日摩擦反复爆发,根源并非日本看不清实力差距,而是二战后那四笔血债,八十多年了还没算清楚

西班牙专家一针见血地指出:中日摩擦反复爆发,根源并非日本看不清实力差距,而是二战后那四笔血债,八十多年了还没算清楚

人生录
2026-07-16 03:47:24
牛犇泪别儿子王侃:你走得太早了,我愿用自己的生命换你的生命

牛犇泪别儿子王侃:你走得太早了,我愿用自己的生命换你的生命

孤城落日
2026-07-19 18:24:29
1比3大连英博!山东泰山深夜官宣,高层作出决定,王大雷主动担责

1比3大连英博!山东泰山深夜官宣,高层作出决定,王大雷主动担责

王大发不懂球
2026-07-19 20:52:48
折返救人被困废墟,彭水失联00后网格员龚宝冬父母,守在现场崩溃

折返救人被困废墟,彭水失联00后网格员龚宝冬父母,守在现场崩溃

阿莱美食汇
2026-07-20 00:21:35
张雪峰曾说过,真正有远见的父母,不会把小学六年浪费在钢琴、机器人、舞蹈等兴趣班

张雪峰曾说过,真正有远见的父母,不会把小学六年浪费在钢琴、机器人、舞蹈等兴趣班

户外阿毽
2026-07-15 06:02:59
被骗得太惨!邹市明彻底破产,幕后黑手竟是她,母亲早就看穿一切

被骗得太惨!邹市明彻底破产,幕后黑手竟是她,母亲早就看穿一切

探索新高度
2026-07-18 04:22:27
生活中的这些暗示你懂多少?网友:警察一句话,让我免受牢狱之灾

生活中的这些暗示你懂多少?网友:警察一句话,让我免受牢狱之灾

夜深爱杂谈
2026-07-18 21:01:07
中国向全世界披露:美国4400颗卫星,包围中国空间站,这是要做啥

中国向全世界披露:美国4400颗卫星,包围中国空间站,这是要做啥

铭记历史呀
2026-07-20 02:10:00
身高182的篮球网红,凭啥让两米大汉服气,看完就懂

身高182的篮球网红,凭啥让两米大汉服气,看完就懂

林子说事
2026-07-19 13:05:45
穆里尼奥彻底看走眼!皇马新援史诗崩盘,世界杯沦为大笑话

穆里尼奥彻底看走眼!皇马新援史诗崩盘,世界杯沦为大笑话

奶盖熊本熊
2026-07-19 07:47:38
16岁女儿报警称遭父亲性侵,父亲一审被判无期,二审时女儿称系诬告:因管教太严心生怨恨报假警

16岁女儿报警称遭父亲性侵,父亲一审被判无期,二审时女儿称系诬告:因管教太严心生怨恨报假警

都市快报橙柿互动
2026-07-19 00:19:52
菲律宾政坛大地震,弹劾副总统的法庭,不料成了清算前朝旧账现场

菲律宾政坛大地震,弹劾副总统的法庭,不料成了清算前朝旧账现场

福建睿平
2026-07-20 06:14:55
韩红的“拜把子社会学”,为什么在2026年行不通了?

韩红的“拜把子社会学”,为什么在2026年行不通了?

谭天论道
2026-07-18 21:02:05
“老鼠进去都要走丢!”宝妈晒女儿做饭,厨房场景意外走红:太夸张了!

“老鼠进去都要走丢!”宝妈晒女儿做饭,厨房场景意外走红:太夸张了!

林林先生
2026-07-18 11:20:03
姆巴佩8年换5任女友,世界杯期间必换绝色新欢个个都是绝色佳人

姆巴佩8年换5任女友,世界杯期间必换绝色新欢个个都是绝色佳人

借你一生
2026-07-18 04:17:24
2026-07-20 08:19:00
孙有匪 incentive-icons
孙有匪
科技
1595文章数 2007关注度
往期回顾 全部

科技要闻

Kimi K3单项登顶 整体落后前沿模型2-3个月

头条要闻

阿根廷队多次犯规未被裁判出牌 队长上半场仅15次触球

头条要闻

阿根廷队多次犯规未被裁判出牌 队长上半场仅15次触球

体育要闻

西班牙捧起大力神杯 美国总统特朗普颁奖

娱乐要闻

王侃因病逝世 两年前与父亲牛犇同台

财经要闻

任泽平VIP会员自称爆仓巨亏千万

汽车要闻

被追尾还能自动加速逃生?华为乾崑智驾ADS 5.0 OTA时间表发布,只有这台车不用等!

态度原创

旅游
亲子
房产
本地
公开课

旅游要闻

厌烦城市闷热喧嚣,施甸椅子山原生态村落,低成本实现田园慢生活

亲子要闻

马筱梅5个月的儿子会说话了,小汪宝夸自己很帅,浓眉大眼继承妈妈美貌

房产要闻

突然出手!千亩城更+一线江景,世嘉亮出超级四代宅!

本地新闻

十年了,为什么鬼怪CP还能让人美美嗑上?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版