Python 之真假“美猴王”
导读 | 单元测试的重要性就不多说了,可恶的是Python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nose, mox, mock, fixtures, discover,再加上setuptools, distutils等等这些。在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别。 |
下面是目前单元测试模块文档中关于 assertTrue 和 assertFalse 的说明,代码:
assertTrue(expr, msg=None) assertFalse(expr, msg=None)
测试该表达式是真值(或假值)。 注:这等价于 bool(expr) is True 而不等价于 expr is True (后一种情况请使用 assertIs(expr, True))。 Mozilla 开发者网络中定义 真值 如下: [info]在一个布尔值的上下文环境中能变成“真”的值[/info] 在 Python 中等价于:
bool(expr) is True
这个和 assertTrue 的测试目的完全匹配。
因此该文档中已经指出 assertTrue 返回真值,assertFalse 返回假值。这些断言方法从接受到的值构造出一个布尔值,然后判断它。同样文档中也建议我们根本不应该使用 assertTrue 和 assertFalse。
我们使用一个非常简单的例子 - 一个名称为 always_true 的函数,它返回 True。我们为它写一些测试用例,然后改变代码,看看测试用例的表现。
作为开始,我们先写两个测试用例。一个是“宽松的”:使用 assertTrue 来测试真值。另外一个是“严格的”:使用文档中建议的 assertIs 函数。
import unittest from func import always_trueclass 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.004sOK
现在,某个人将 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 来写的。
因此,跟手册上了解到的信息一样,为了保证 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 语句应该封装在测试的函数中。
本文转载自:http://www.linuxprobe.com/python-asserttrue-assertfalse.html
免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/
Python 之真假“美猴王”相关推荐
- python中0和1可以表示真假吗_教你用 python 辨别真假是非
教你用 python 辨别"真假是非" 01-Python中的数据类型-05-流程控制 总体 要讲的大纲内容 如下 数字类型- int float complex 字符串类型 Te ...
- python爬虫真假网址,python爬取福利网站图片完整代码,懂得人都懂
网址需要自己替换懂的人都懂512*2,主要学习简单的爬虫,别乱用,否则后果自负! [Python] 纯文本查看 复制代码 import requests,bs4,re,os,threadingclas ...
- python对真假的判断方式
一.如下是以下值就认为是假 1.None-->None值 2.False-->False值 3.0-->数值零不管它是int,float还是complex类型 4.'',(),[]- ...
- 面部识别:猴脸识别如何分辨真假 “美猴王”?
导读 最近研究课题基本锁定在动物脸部及行为识别,看到一个比较有意思的课题方向,如果有兴趣可以搞一搞,在知网的论文搜索引擎上也属于独树一炽.话不多说,看图行事,下图是论文情况. 你一定听过人脸识别,但是 ...
- python中0和1可以表示真假吗_python 对象真假值的实例(哪些视为False)
对于python语言的True和False我们并不陌生了,在学习的过程中常会遇到这样的返回值,那么True真和False假的具体含义是什么? 本文就为大家来说说python中真假的含义. 真和假的概念 ...
- python判断语句_python条件判断语句if elif else使用
假设网站现在有100个充值用户,现在要给充值1000元以上的大客户返现,那么就需要在程序里进行判断.这就用到了条件判断语句. 一.if语句 1.if语句长相: if条件表达式: 满足条件时要做的事情1 ...
- python 对象真假值的实例(哪些视为False)
对于python语言的True和False我们并不陌生了,在学习的过程中常会遇到这样的返回值,那么True真和False假的具体含义是什么? 本文就为大家来说说python中真假的含义. 真和假的概念 ...
- Python详细介绍及使用(基础篇)
Python详细介绍及使用(基础篇) 第一章 Python基础 Python的由来:1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器.Python来自Guido所 ...
- python什么为假_python对于真和假的定义
python对于真和假的定义 1.简要说明 在python中一切都是对象.我们知道,要进行逻辑运算,就要知道真和假.高中的数学就知道了,真 and 真=真,真 and 假 =假.以及真 or 假 = ...
最新文章
- 企业网络推广专员浅析企业网络推广中网站关键词排名优化有何技巧?
- Oracle的sys_connect_by_path函数
- 回顾 | 进击吧! Blazor !第四期 组件开发
- 【渝粤题库】广东开放大学 Linux操作系统 形成性考核
- python学习笔记(十二)python操作redis
- html与css基础教程:CSS构造块
- Android模拟器adb命令介绍
- java double 存储_Java语言中:float、double在内存中存储方式
- 他山之石:加载图片的一个小问题
- 短信机bug,发短信发的直吐血…………
- wma转mp3怎么弄_mp3格式转换器如何把wma转mp3格式(教程)
- 【华为校招】【校招】【Java】叠积木
- 用c语言把图像转成jpg格式,图像格式转换之BMP格式转换为JPG格式(示例代码)
- oracle分门别类的统计列数据
- python3爬取网易云歌单数据清洗_利用Python网络爬虫抓取网易云歌词
- Fightting for your youth
- ┎结构之美┒之Trie树
- 转义字符表大全(转)
- 2020年 ICLR 国际会议最终接受论文(poster-paper)列表(三)
- 微量齿轮泵mzr-7245和mzr-4622在全自动密度测定中的应用