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

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.

相关推荐
热点推荐
今天是4月27日下午,突然发生一重要消息,又要来大动作吗?

今天是4月27日下午,突然发生一重要消息,又要来大动作吗?

股市皆大事
2024-04-27 10:30:32
港股,彻底疯狂!

港股,彻底疯狂!

资本百科
2024-04-27 00:13:03
广东卫健系统三任前一把手被查,一局长被点名“吃高档菜肴”

广东卫健系统三任前一把手被查,一局长被点名“吃高档菜肴”

澎湃新闻
2024-04-27 13:32:27
【观点】詹杜库时代落幕?詹皇杜兰特陷0-3绝境 去陪库里备战奥运

【观点】詹杜库时代落幕?詹皇杜兰特陷0-3绝境 去陪库里备战奥运

醉卧浮生
2024-04-27 13:24:29
不会演别尬演!范伟一段“劳改犯出狱戏”,让观众看清演技有多假

不会演别尬演!范伟一段“劳改犯出狱戏”,让观众看清演技有多假

喵喵娱乐团
2024-04-26 16:09:28
快船惨败独行侠揪出3大毒瘤,哈登被你们坑惨,泰伦卢怒摔战术板

快船惨败独行侠揪出3大毒瘤,哈登被你们坑惨,泰伦卢怒摔战术板

记树与海
2024-04-27 11:23:36
独自Carry!哈登季后赛场均出战41.7分钟 创个人近10年新高

独自Carry!哈登季后赛场均出战41.7分钟 创个人近10年新高

直播吧
2024-04-27 12:26:15
上海市公安局“女虎”落马:经常进出私人会所,疯狂贪腐2401万元,最终怎样?

上海市公安局“女虎”落马:经常进出私人会所,疯狂贪腐2401万元,最终怎样?

天闻地知
2024-04-27 14:28:10
基本工资11000,推测全年收入22万!上海普陀区基层法院科员工资被曝光!

基本工资11000,推测全年收入22万!上海普陀区基层法院科员工资被曝光!

老郭在学习
2024-04-26 21:19:12
业绩增长10倍,股价跌去70%,葛卫东抄底1800万股被套,科技龙头

业绩增长10倍,股价跌去70%,葛卫东抄底1800万股被套,科技龙头

资本百科
2024-04-27 06:30:09
重庆一19岁女生称被舞蹈老师压断腿致十级伤残 涉事培训学校:在走司法程序,绝不回避责任

重庆一19岁女生称被舞蹈老师压断腿致十级伤残 涉事培训学校:在走司法程序,绝不回避责任

红星新闻
2024-04-27 15:33:11
用小腿肌肉顶一罐可乐,格拉利什花式官宣自己成为百事代言人

用小腿肌肉顶一罐可乐,格拉利什花式官宣自己成为百事代言人

懂球帝
2024-04-26 20:40:15
万达集团创始人王健林宣布退出公司并将全部股权转让给中国儒意

万达集团创始人王健林宣布退出公司并将全部股权转让给中国儒意

鹏飞深文
2024-04-22 12:19:28
跌麻了!日元兑美元一度跌破158,连刷34年来新低

跌麻了!日元兑美元一度跌破158,连刷34年来新低

智通财经
2024-04-27 08:46:19
麦当劳退款原因写“顾客是傻x”续:已与顾客达成谅解

麦当劳退款原因写“顾客是傻x”续:已与顾客达成谅解

央广网
2024-04-27 11:50:07
遭穆迪下调评级 万科强硬回应:坚决反对

遭穆迪下调评级 万科强硬回应:坚决反对

财联社
2024-04-27 14:15:11
病毒学家:在中国19个省区2019年前大量采样后,没发现有新冠病毒

病毒学家:在中国19个省区2019年前大量采样后,没发现有新冠病毒

互联网大聪明
2024-04-27 14:09:14
外媒爆料:美军竟然在偷偷使用北斗导航 原来中国已大幅超越GPS

外媒爆料:美军竟然在偷偷使用北斗导航 原来中国已大幅超越GPS

军评陈光文
2024-04-27 09:49:56
爱信、ZF时代彻底落幕:时代淘汰变速箱的时候,招呼都没打一声!

爱信、ZF时代彻底落幕:时代淘汰变速箱的时候,招呼都没打一声!

汽车扒壹扒
2024-04-26 22:34:05
同病相怜!杜兰特詹姆斯0-3,联盟收视率危机:晋级需要奇迹

同病相怜!杜兰特詹姆斯0-3,联盟收视率危机:晋级需要奇迹

天涯沦落人
2024-04-27 13:31:10
2024-04-27 17:02:44
孙有匪
孙有匪
科技
1595文章数 2009关注度
往期回顾 全部

科技要闻

特斯拉这款车型刚上市几天,就上调价格

头条要闻

19岁女生称被舞蹈老师压断腿致十级伤残 涉事机构回应

头条要闻

19岁女生称被舞蹈老师压断腿致十级伤残 涉事机构回应

体育要闻

时代要落幕了?詹姆斯杜兰特陷0-3绝境

娱乐要闻

金靖回应不官宣恋情结婚的原因

财经要闻

北京房价回到2016年

汽车要闻

5月上市/智能化丰富 海狮 07EV正式到店

态度原创

本地
健康
旅游
手机
教育

本地新闻

蛋友碰碰会空降西安!5.1山海境等你!

这2种水果可降低高血压死亡风险

旅游要闻

散装河北,冀北、冀东、冀中、冀南如何划分?

手机要闻

苹果用户反馈设备突然退出 Apple ID 账号,被要求重置密码

教育要闻

教育观察:高比例体制内就业,这所大学录取分连涨8年!

无障碍浏览 进入关怀版