首页 > 编程语言 >Python 单元测试:assertTrue 和assertFalse 的真假

Python 单元测试:assertTrue 和assertFalse 的真假

时间:2023-05-13 18:24:16浏览次数:54  
标签:assertTrue Python True self 单元测试 always assertIs true

导读 Lightbot在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别。

Python 单元测试:assertTrue 和assertFalse 的真假Python 单元测试:assertTrue 和assertFalse 的真假

定义

下面是目前单元测试模块文档中关于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 给了我们一个误判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语句应该封装在测试的函数中。

测试开心!

本文地址:https://www.linuxprobe.com/python-unit.html

标签:assertTrue,Python,True,self,单元测试,always,assertIs,true
From: https://www.cnblogs.com/linuxprobe19/p/17362707.html

相关文章

  • python {} format
    用来按照你的需求格式化输出各种字符,比如"{:#06x}".format(i)。首先,我们需要知道,都是"{}".format()格式,大括号中的内容就是指定格式化的样式,以:开头。常见的有:标志意义:<左对齐:>右对齐:^居中:=把标志放到左边,后面可以跟数字,表示中间空多少位置:+在数......
  • Python学习之五_字符串处理生成查询SQL
    Python学习之五_字符串处理生成查询SQL前言昨天想给同事讲解一下获取查询部分表核心列信息的SQL方法也写好了一个简单文档.但是感觉不是很优雅.最近两三天晚上一直在学习Python.想将昨天的文档处理成一个工具的方式.将查询SQL展示出来.然后再由同事手工检查确认.增加时......
  • Python-with
    在Python中,使用with语句可以自动调用一个对象的上下文管理器(ContextManager),来简化异常处理和资源管理等工作。实现with语句的关键是定义上下文管理器对象,它应该包括enter()和exit()方法。enter()方法会在进入with代码块时被调用,而exit()方法则会在with代码块执......
  • Python源码怎么运行?
    要运行Python源码,您需要安装Python解释器。Python解释器是一种软件,它可以读取Python源代码并将其转换为计算机可以理解和执行的指令。在Windows操作系统上运行Python源代码的步骤:在您的计算机上下载并安装Python解释器。您可以从Python官方网站(https://www.python.org/downloads/)下......
  • Python源码怎么运行?
    要运行Python源码,您需要安装Python解释器。Python解释器是一种软件,它可以读取Python源代码并将其转换为计算机可以理解和执行的指令。在Windows操作系统上运行Python源代码的步骤:在您的计算机上下载并安装Python解释器。您可以从Python官方网站(https://www.python.org/downloads/)下......
  • Ubuntu系统下python模块graphviz运行报错:graphviz.backend.execute.ExecutableNotFoun
    代码中需要运行python模块graphviz,安装:pipinstallgraphviz 运行后报错:graphviz.backend.execute.ExecutableNotFound:failedtoexecutePosixPath('dot'),makesuretheGraphvizexecutablesareonyoursystems'PATH  报错的全部信息:Traceback(mostrecentc......
  • python中os.path模块常见使用 和 os创建文件夹
    1、下面列举一些常用的os.path模块函数:os.path模块是Python中用于处理文件路径的模块之一,它提供了一系列函数用于对文件路径进行操作,例如连接、拆分、标准化、比较等。os.path.join(path1[,path2[,...]]):将多个路径组合成一个完整路径。该函数根据操作系统的不同,自动使......
  • 分享Python采集66个css3代码,总有一款适合您
    Python采集的66个css3代码下载链接:https://pan.baidu.com/s/1EKA4WZ1tVGiEKH4qfwPc_A?pwd=mads提取码:madscss3+svg炫酷水滴Loading特效css剪裁GIF背景图片动画特效纯CSS制作辛普森一家卡通人物动画特效CSS3图片遮罩层变形动画特效CSS3鼠标悬停图片遮罩层变形动画特效CSS3超酷钟摆......
  • 分享Python采集88个css3代码,总有一款适合您
    分享Python采集88个css3代码,总有一款适合您Python采集的88个css3代码下载链接:https://pan.baidu.com/s/18mg5LvBRGD24F2gcUdSvxQ?pwd=yir2提取码:yir2炫酷css3垂直时间轴特效CSS3超酷图片glitch闪烁效果CSS3炫酷鼠标hover菜单动画特效css3炫酷进度条动画纯CSS3的单选框、复选框、开......
  • Python学习之四_部分battery的学习
    Python学习之四_部分battery的学习CentOS升级pip的方法yuminstallpython3之后,一般centos的版本都很低,有时候很多module是无法安装的.一般可以通过他进行升级:pip3install-Upip注意如果无法升级,可以先这样处理mkdir-p/root/.config/pip/cat>/root/.c......