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

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.

相关推荐
热点推荐
23.59万元起?小米SUV起售价曝光,明年3月上市,外观神似法拉利

23.59万元起?小米SUV起售价曝光,明年3月上市,外观神似法拉利

泡泡网
2024-11-29 14:59:20
外交部回应外媒提问“董郁玉被判7年有期徒刑”:中国司法机关严格依法办案,违法必究

外交部回应外媒提问“董郁玉被判7年有期徒刑”:中国司法机关严格依法办案,违法必究

界面新闻
2024-11-29 20:48:51
越南女首富交280万亿越南盾可免死!当庭“卖惨喊冤”:只想尽快把财富交国家

越南女首富交280万亿越南盾可免死!当庭“卖惨喊冤”:只想尽快把财富交国家

红星新闻
2024-11-29 16:35:27
罗杰斯:危机将终结全球市场狂欢,只保留了中国和乌兹别克斯坦投资

罗杰斯:危机将终结全球市场狂欢,只保留了中国和乌兹别克斯坦投资

凤凰网财经plus
2024-11-29 15:35:09
王宏志任国家能源局党组书记

王宏志任国家能源局党组书记

新京报
2024-11-29 19:10:45
2025春晚进入倒计时,主题已官宣,赵本山、宋丹丹回归呼声高

2025春晚进入倒计时,主题已官宣,赵本山、宋丹丹回归呼声高

追风小狗
2024-11-29 16:20:24
痛心!浙大一院刘磊医生因伤去世,年仅45岁,好友曝具体原因!

痛心!浙大一院刘磊医生因伤去世,年仅45岁,好友曝具体原因!

古希腊掌管松饼的神
2024-11-29 10:31:53
物业将被“全面取消”?官方定调:今后,这7种情况可拒交物业费

物业将被“全面取消”?官方定调:今后,这7种情况可拒交物业费

巢客HOME
2024-11-29 08:00:03
退休后聚会,酒桌上要远离自带茶叶的人,年过60的人要知道

退休后聚会,酒桌上要远离自带茶叶的人,年过60的人要知道

神牛
2024-11-29 12:47:28
中国造船厂有大动作,第四艘“航母”现真身,名称让台军当场破防

中国造船厂有大动作,第四艘“航母”现真身,名称让台军当场破防

空天力量
2024-11-29 19:17:46
太难了!网传长沙邮政门口大量工人讨要工资,竟然又是外包引发…

太难了!网传长沙邮政门口大量工人讨要工资,竟然又是外包引发…

火山诗话
2024-11-29 15:44:24
突发!俄罗斯遭大规模空袭

突发!俄罗斯遭大规模空袭

每日经济新闻
2024-11-29 11:39:43
气疯!安徽男子47万买3手宾利,到手发现是13手,车商抵赖不知情

气疯!安徽男子47万买3手宾利,到手发现是13手,车商抵赖不知情

小淇言说
2024-11-29 11:37:17
被封杀4年的中国APP,印度政府还在用

被封杀4年的中国APP,印度政府还在用

观察者网
2024-11-29 11:38:07
欧洲人口坍塌2100年1.17亿人口将消失,政府激励措施已是徒劳

欧洲人口坍塌2100年1.17亿人口将消失,政府激励措施已是徒劳

风向观察
2024-11-29 16:50:44
就别吹恐怖组织了,主流文明的代表有100种方法碾压他们

就别吹恐怖组织了,主流文明的代表有100种方法碾压他们

大风文字
2024-11-29 06:49:17
上海不少司机困惑:右转信号灯为何不亮绿灯?有人在路口傻等…官方解释→

上海不少司机困惑:右转信号灯为何不亮绿灯?有人在路口傻等…官方解释→

上观新闻
2024-11-29 17:52:32
最危险的信号:莫斯科物价飙涨,大规模反战游行酝酿中

最危险的信号:莫斯科物价飙涨,大规模反战游行酝酿中

魔幻故事
2024-11-29 09:22:00
网传理想车主群曝出大瓜!有车主丈夫怒斥一群友用5000勾引其妻子

网传理想车主群曝出大瓜!有车主丈夫怒斥一群友用5000勾引其妻子

火山诗话
2024-11-29 09:03:21
柳叶刀子刊:高福院士团队发布中国最大规模“新冠后遗症”调查报告

柳叶刀子刊:高福院士团队发布中国最大规模“新冠后遗症”调查报告

生物世界
2024-11-29 11:59:18
2024-11-29 21:04:49
孙有匪
孙有匪
科技
1595文章数 2008关注度
往期回顾 全部

科技要闻

"AGI不是大杀器,是普通人每天在用的产品"

头条要闻

想要免死越南女首富"卖惨喊冤":只想尽快把财富交国家

头条要闻

想要免死越南女首富"卖惨喊冤":只想尽快把财富交国家

体育要闻

穆雷与德约科维奇能凑成王炸组合吗?

娱乐要闻

叶珂被曝独自去产检,他俩真分了吗

财经要闻

专家建议将农民养老金提升至每月500元

汽车要闻

问界M7今年累计交付量已突破18万辆

态度原创

时尚
亲子
房产
家居
公开课

女人会不会穿衣区别很大!试试这些减龄的打扮,洋气又舒适

亲子要闻

爷爷哄孩子都这样吗?小宝还挺配合,老妈土豆丝两种做法,真好吃

房产要闻

大量甩地!114亿,4790亩!海南土地市场全面爆发!

家居要闻

现代设计感 温馨两居室

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版