导读 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 的真假相关推荐

  1. Python 单元测试详解

    作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以 ...

  2. python 单元测试_聊聊 Python 的单元测试框架(一):unittest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest. ...

  3. Python单元测试--使用装饰器实现测试跳过和预期故障

    Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev ...

  4. python单元测试框架-Python unittest单元测试框架总结

    什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入 ...

  5. Python单元测试最佳实践

    Are you ready? ↓↓↓ 今天的课程为< Python单元测试>,内容共分为三个部分:单元测试的概念.工具与方法.Coverage 统计单元测试覆盖率的工具和Mock 简化单元 ...

  6. python单元测试工具_Python的单元测试工具——unittest小结

    简介 unittest是Python的内建模块,是Python单元测试的事实标准,也叫PyUnit.使用unittest之前,先了解如下几个概念: test case:测试用例,可以通过创建unite ...

  7. 万字长文深度解析python 单元测试

    文章目录 unittest 基本概念 基本用法 命令行操作 组织测试用例 跳过测试&预期错误 subTest unittest小结 doctest 先谈pydoc doctest与unitte ...

  8. python测试脚本实例-Python单元测试实例详解

    本文实例讲述了Python单元测试.分享给大家供大家参考,具体如下: 在Python中进行单元测试需要用到自动单元测试框架PyUnit,Python2.1及其以后的版本都将PyUnit作为一个标准模块 ...

  9. python简单单元测试示范卷,Python单元测试实例详解

    本文实例讲述了python单元测试.分享给大家供大家参考,具体如下: 在python中进行单元测试需要用到自动单元测试框架pyunit,python2.1及其以后的版本都将pyunit作为一个标准模块 ...

最新文章

  1. C++知识点48——类继承与类的作用域
  2. Windows 7/8.1 仍可免费升级至 Windows 10
  3. 通过递归算法完成树的级联勾选的一般思路
  4. poj 3254 Corn Fields 状态压缩dp
  5. 22. loacte命令
  6. 【学习总结】《大话数据结构》- 总
  7. hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...
  8. python中的文件I/O
  9. OpenShift 4 之一些实用命令和技巧
  10. 计算机课教案学法,计算机应用基础教学方法初探
  11. makefile模板
  12. Python ASCII码
  13. 数据结构c语言版秦锋,数据结构(C语言版)黄国瑜.pdf
  14. java 制作简历_个人简历java制作.doc
  15. 5分钟入门ER/Studio
  16. usb调试软件_想防止软件后台偷偷运行,那就把它们冻结起来
  17. 3d打印英语文献_3D打印模型在腹腔镜肝胆微创手术术前培训中的应用
  18. Python 针对Excel操作
  19. 3500字干货!精准解决3大难题,助力服装行业数字化转型
  20. 自定义流程比较全的表结构

热门文章

  1. 微信小程序 调试器的 console提示框 的 无用黄色警告关闭 --- 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引
  2. Ubuntu20.04安装PEA软件
  3. 15个常用的JavaScript简写技巧
  4. OpenFOAM学习网站汇总(更新中)
  5. 初阶指针的陷阱(形象的解释指针型变量的传址陷进)
  6. 阅读是为了拓宽知识面,而写作才能沉淀
  7. 程序验证(八):形式语义
  8. 基于java的驾校管理系统
  9. DELL Precision Tower7910重装系统+开机出现GRUB界面如何处理
  10. 论实习、暑期实习、秋招、春招之间的关系