Python 单元测试:assertTrue 是真值,assertFalse 是假值

在这篇文章中,我们将介绍单元测试的布尔断言方法 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 中等价于:


  1. bool(expr) is True

这个和 assertTrue 的测试目的完全匹配。

因此该文档中已经指出 assertTrue 返回真值,assertFalse 返回假值。这些断言方法从接受到的值构造出一个布尔值,然后判断它。同样文档中也建议我们根本不应该使用 assertTrue 和 assertFalse

在实践中怎么理解?

我们使用一个非常简单的例子 - 一个名称为 always_true 的函数,它返回 True。我们为它写一些测试用例,然后改变代码,看看测试用例的表现。

作为开始,我们先写两个测试用例。一个是“宽松的”:使用 assertTrue 来测试真值。另外一个是“严格的”:使用文档中建议的 assertIs 函数。


  1. import unittest
  2. from func import always_true
  3. class TestAlwaysTrue(unittest.TestCase):
  4. def test_assertTrue(self):
  5. """
  6. always_true returns a truthy value
  7. """
  8. result = always_true()
  9. self.assertTrue(result)
  10. def test_assertIs(self):
  11. """
  12. always_true returns True
  13. """
  14. result = always_true()
  15. self.assertIs(result, True)

下面是 func.py 中的非常简单的函数代码:


  1. def always_true():
  2. """
  3. I'm always True.
  4. Returns:
  5. bool: True
  6. """
  7. return True

当你运行时,所有测试都通过了:


  1. always_true returns True ... ok
  2. always_true returns a truthy value ... ok
  3. ----------------------------------------------------------------------
  4. Ran 2 tests in 0.004s
  5. OK

开心ing~

现在,某个人将 always_true 函数改变成下面这样:


  1. def always_true():
  2. """
  3. I'm always True.
  4. Returns:
  5. bool: True
  6. """
  7. return 'True'

它现在是用返回字符串 "True" 来替代之前反馈的 True (布尔值)。(当然,那个“某人”并没有更新文档 - 后面我们会增加难度。)

这次结果并不如开心了:


  1. always_true returns True ... FAIL
  2. always_true returns a truthy value ... ok
  3. ======================================================================
  4. FAIL: always_true returns True
  5. ----------------------------------------------------------------------
  6. Traceback (most recent call last):
  7. File "/tmp/assertttt/test.py", line 22, in test_is_true
  8. self.assertIs(result, True)
  9. AssertionError: 'True' is not True
  10. ----------------------------------------------------------------------
  11. Ran 2 tests in 0.004s
  12. FAILED (failures=1)

只有一个测试用例失败了!这意味着 assertTrue 给了我们一个误判false-positive。在它不应该通过测试时,它通过了。很幸运的是我们第二个测试是使用 assertIs 来写的。

因此,跟手册上了解到的信息一样,为了保证 always_true 的功能和更严格测试的结果保持一致,应该使用assertIs 而不是 assertTrue

使用断言的辅助方法

使用 assertIs 来测试返回 True 和 False 来冗长了。因此,如果你有个项目需要经常检查是否是返回了True 或者 False,那们你可以自己编写一些断言的辅助方法。

这好像并没有节省大量的代码,但是我个人觉得提高了代码的可读性。


  1. def assertIsTrue(self, value):
  2. self.assertIs(value, True)
  3. def assertIsFalse(self, value):
  4. self.assertIs(value, False)

总结

一般来说,我的建议是让测试越严格越好。如果你想测试 True 或者 False,听从文档的建议,使用assertIs。除非不得已,否则不要使用 assertTrue 和 assertFalse

如果你面对的是一个可以返回多种类型的函数,例如,有时候返回布尔值,有时候返回整形,那么考虑重构它。这是代码的异味。在 Python 中,抛出一个异常比使用 False 表示错误更好。

此外,如果你确实想使用断言来判断函数的返回值是否是真,可能还存在第二个代码异味 - 代码是正确封装了吗?如果 assertTrue 和 assertFalse 是根据正确的 if 语句来执行,那么值得检查下你是否把所有你想要的东西都封装在合适的位置。也许这些 if 语句应该封装在测试的函数中。

测试开心!原文发布时间为:2017-10-31

本文来自合作伙伴“Linux中国”

时间: 2024-11-05 14:50:17

Python 单元测试:assertTrue 是真值,assertFalse 是假值的相关文章

Python单元测试:assertTrue是真值,assertFalse是假值

在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别. 定义 下面是目前单元测试模块文档中关于 assertTrue 和 assertFalse 的说明,代码进行了高亮: assertTrue(expr, msg=None) assertFalse(expr, msg=None) 测试该表达式是真值(或假值). 注:这等价于 bool(expr) is True 而不等价于 expr is True (后一种情

unittest-【python】亲们,看下这段Python单元测试代码该怎么调用啊?

问题描述 [python]亲们,看下这段Python单元测试代码该怎么调用啊? 代码如下: #coding=utf-8 import unittest def createsuite(self): testunit=unittest.TestSuite() test_dir="C:Users***Desktopmyprogram" discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py&q

The Hacker's Guide To Python 单元测试

基本方式 python中提供了非常简单的单元测试方式,利用nose包中的nosetests命令可以实现简单的批量测试. 安装nose包 sudo pip install nose 编辑测试文件 # test_true.py def test_true(): assert True def test_false(): assert False 执行测试 # 命令, nosetests命令会加载所有以test_开头的文件,并执行所有以test_开头的函数 nosetests -v # 输出 test

Python单元测试框架之pytest -- 断言

对于测试来讲,不管是功能测试,自动化测试,还是单元测试.一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果.测试的成功与否就是拿实际的结果与预期的结果进行比较.这个比的过程实际就是断言(assert). 在unittest单元测试框架中提供了丰富的断言方法,例如assertEqual().assertIn().assertTrue().assertIs()等,而pytest单元测试框架中并没提供特殊的断言方法,而是直接使用python的assert进行断言. 下面我们就来介

Python单元测试经验总结

python写单元大多数都会用到unittest和mock,测试代码覆盖率都会用到coverage,最后再用nose把所有的东西都串起来,这样每次出版本,都能把整个项目的单元测试都运行一遍. Unittest unittest就不详细介绍了,注意几点: 测试类继承unittest.TestCase 测试类.测试方法名字最好以test开头,很多工具能根据名字来自动运行,很方便 测试类里面的setUp/tearDown会在每个case执行之前/之后执行,setUpClass/tearDownClas

Python单元测试框架之pytest---如何执行测试用例

介绍                                                                      pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简单的单元到复杂的功能测试 l 模块化parametrizeable装置(在2.3,持续改进) l 参数化测试函数(用例) l 标记测试功能与属性 l Skip和xfail:处理不成功的测试用例(在2.4改进) l 通过xdist插件分发测试到多个CPU l 不断地重

Python单元测试框架之pytest -- 生成测试报告

继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #coding=utf-8 class TestClass: def test_one(self): x = "this" assert "h" in x def test_two(self): x = "hello" assert x == "h

Python单元测试框架unittest简明使用实例_python

测试步骤1. 导入unittest模块 import unittest 2. 编写测试的类继承unittest.TestCase class Tester(unittest.TestCase) 3. 编写测试的方法必须以test开头 def test_add(self) def test_sub(self) 4.使用TestCase class提供的方法测试功能点 5.调用unittest.main()方法运行所有以test开头的方法 复制代码 代码如下: if __name__ == '__m

Python单元测试框架unittest使用方法讲解_python

概述 1.测试脚手架(test fixture) 测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown(). 2.测试案例(test case) 最小的测试单元. 3.测试套件(test suite) 测试案例的集合. 4.测试运行器(test runner) 测试执行的组件. 命令行接口 可以用命令行运行测试模块,测试类以及测试方法. 复制代码 代码如下: python -m unittest test_module1 test_module2 python -m