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中国”

相关文章
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
732 1
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
769 158
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
465 61
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
811 18
|
IDE 测试技术 API
python调试与测试
python调试与测试
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
383 10
|
安全 测试技术 API
Python 单元测试详解
单元测试是Python开发中不可或缺的环节,能确保代码按预期运行、发现Bug、提升代码质量并支持安全重构。本文从基础概念讲起,逐步介绍Python单元测试的实践方法,涵盖unittest框架、pytest框架、断言使用、Mock技巧及测试覆盖率分析,助你全面掌握单元测试技能。
687 0
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
365 61
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
558 0

热门文章

最新文章

推荐镜像

更多