Python 单元测试:assertTrue 和assertFalse 的真假
导读 | 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_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
开心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_trueself.assertIs(result, True) AssertionError: 'True' is not True---------------------------------------------------------------------- Ran 2 tests in 0.004sFAILED (failures=1)
只有一个测试用例失败了!这意味着 assertTrue 给了我们一个误判(false-positive)。在它不应该通过测试时,它通过了。很幸运的是我们第二个测试是使用 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-unit.html编辑:张庚,审核员:冯琪
Python 单元测试:assertTrue 和assertFalse 的真假相关推荐
- Python 单元测试详解
作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以 ...
- python 单元测试_聊聊 Python 的单元测试框架(一):unittest
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest. ...
- Python单元测试--使用装饰器实现测试跳过和预期故障
Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev ...
- python单元测试框架-Python unittest单元测试框架总结
什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入 ...
- Python单元测试最佳实践
Are you ready? ↓↓↓ 今天的课程为< Python单元测试>,内容共分为三个部分:单元测试的概念.工具与方法.Coverage 统计单元测试覆盖率的工具和Mock 简化单元 ...
- python单元测试工具_Python的单元测试工具——unittest小结
简介 unittest是Python的内建模块,是Python单元测试的事实标准,也叫PyUnit.使用unittest之前,先了解如下几个概念: test case:测试用例,可以通过创建unite ...
- 万字长文深度解析python 单元测试
文章目录 unittest 基本概念 基本用法 命令行操作 组织测试用例 跳过测试&预期错误 subTest unittest小结 doctest 先谈pydoc doctest与unitte ...
- python测试脚本实例-Python单元测试实例详解
本文实例讲述了Python单元测试.分享给大家供大家参考,具体如下: 在Python中进行单元测试需要用到自动单元测试框架PyUnit,Python2.1及其以后的版本都将PyUnit作为一个标准模块 ...
- python简单单元测试示范卷,Python单元测试实例详解
本文实例讲述了python单元测试.分享给大家供大家参考,具体如下: 在python中进行单元测试需要用到自动单元测试框架pyunit,python2.1及其以后的版本都将pyunit作为一个标准模块 ...
最新文章
- C++知识点48——类继承与类的作用域
- Windows 7/8.1 仍可免费升级至 Windows 10
- 通过递归算法完成树的级联勾选的一般思路
- poj 3254 Corn Fields 状态压缩dp
- 22. loacte命令
- 【学习总结】《大话数据结构》- 总
- hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...
- python中的文件I/O
- OpenShift 4 之一些实用命令和技巧
- 计算机课教案学法,计算机应用基础教学方法初探
- makefile模板
- Python ASCII码
- 数据结构c语言版秦锋,数据结构(C语言版)黄国瑜.pdf
- java 制作简历_个人简历java制作.doc
- 5分钟入门ER/Studio
- usb调试软件_想防止软件后台偷偷运行,那就把它们冻结起来
- 3d打印英语文献_3D打印模型在腹腔镜肝胆微创手术术前培训中的应用
- Python 针对Excel操作
- 3500字干货!精准解决3大难题,助力服装行业数字化转型
- 自定义流程比较全的表结构
热门文章
- 微信小程序 调试器的 console提示框 的 无用黄色警告关闭 --- 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引
- Ubuntu20.04安装PEA软件
- 15个常用的JavaScript简写技巧
- OpenFOAM学习网站汇总(更新中)
- 初阶指针的陷阱(形象的解释指针型变量的传址陷进)
- 阅读是为了拓宽知识面,而写作才能沉淀
- 程序验证(八):形式语义
- 基于java的驾校管理系统
- DELL Precision Tower7910重装系统+开机出现GRUB界面如何处理
- 论实习、暑期实习、秋招、春招之间的关系