转自 https://www.cnblogs.com/cicaday/p/python-assert.html

Python Assert 为何不尽如人意

Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果判断结果为False则会抛出异常。

>>> assert 1 + 1 == 2

>>> assert isinstance('Hello', str)>>> assert isinstance('Hello', int)

Traceback (most recent call last):

File"", line 1, in AssertionError

其实assert看上去不错,然而用起来并不爽。就比如有人告诉你程序错了,但是不告诉哪里错了。很多时候这样的assert还不如不写,写了我就想骂娘。直接抛一个异常来得更痛快一些。

改进方案 #1

一个稍微改进一丢丢的方案就是把必要的信息也放到assert语句后面,比如这样。

>>> s = "nothin is impossible."

>>> key = "nothing"

>>> assert key in s, "Key: '{}' is not in Target: '{}'".format(key, s)

Traceback (most recent call last):

File"", line 1, in AssertionError: Key:'nothing' is not in Target: 'nothin is impossible.'

看上去还行吧,但是其实写的很蛋疼。假如你是一名测试汪,有成千上万的测试案例需要做断言做验证,相信你面对以上做法,心中一定有千万只那种马奔腾而过。

改进方案 #2

不管你是你是搞测试还是开发的,想必听过不少测试框架。你猜到我要说什么了吧?对,不用测试框架里的断言机制,你是不是洒。

py.test

py.test 是一个轻量级的测试框架,所以它压根就没写自己的断言系统,但是它对Python自带的断言做了强化处理,如果断言失败,那么框架本身会尽可能多地提供断言失败的原因。那么也就意味着,用py.test实现测试,你一行代码都不用改。

importpytestdeftest_case():

expected= "Hello"actual= "hello"

assert expected ==actualif __name__ == '__main__':

pytest.main()"""================================== FAILURES ===================================

__________________________________ test_case __________________________________

def test_case():

expected = "Hello"

actual = "hello"

> assert expected == actual

E assert 'Hello' == 'hello'

E - Hello

E ? ^

E + hello

E ? ^

assertion_in_python.py:7: AssertionError

========================== 1 failed in 0.05 seconds ===========================""""

unittest

Python自带的unittest单元测试框架就有了自己的断言方法self.assertXXX(),而且不推荐使用assert XXX语句。

importunittestclassTestStringMethods(unittest.TestCase):deftest_upper(self):

self.assertEqual('foo'.upper(), 'FoO')if __name__ == '__main__':

unittest.main()"""Failure

Expected :'FOO'

Actual :'FoO'

Traceback (most recent call last):

File "assertion_in_python.py", line 6, in test_upper

self.assertEqual('foo'.upper(), 'FoO')

AssertionError: 'FOO' != 'FoO'"""

ptest

我非常喜欢ptest,感谢Karl大神写了这么一个测试框架。ptest中的断言可读性很好,而且通过IDE的智能提示你能轻松完成各种断言语句。

from ptest.decorator import *

from ptest.assertion import *@TestClass()classTestCases:

@Test()deftest1(self):

actual= 'foo'expected= 'bar'assert_that(expected).is_equal_to(actual)"""Start to run following 1 tests:

------------------------------

...

[demo.assertion_in_python.TestCases.test1@Test] Failed with following message:

...

AssertionError: Unexpectedly that the str is not equal to str ."""

改进方案 #3

不仅仅是你和我对Python中的断言表示不满足,所以大家都争相发明自己的assert包。在这里我强烈推荐assertpy这个包,它异常强大而且好评如潮。

pip install assertpy

看例子:

from assertpy import assert_that

def test_something():

assert_that(1 + 2).is_equal_to(3)

assert_that('foobar')\

.is_length(6)\

.starts_with('foo')\

.ends_with('bar')

assert_that(['a', 'b', 'c'])\

.contains('a')\

.does_not_contain('x')

从它的github 主页 文档上你会发现它支持了几乎你能想到的所有测试场景,包括但不限于以下列表。

Strings

Numbers

Lists

Tuples

Dicts

Sets

Booleans

Dates

Files

Objects

而且它的断言信息简洁明了,不多不少。

Expected to be of length <4>, but was <3>.

Expected to be empty string, but was not.

Expected , but was not.

Expected to contain only digits, but did not.

Expected <123> to contain only alphabetic chars, but did not.

Expected to contain only uppercase chars, but did not.

Expected to contain only lowercase chars, but did not.

Expected to be equal to , but was not.

Expected to be not equal to , but was.

Expected to be case-insensitive equal to , but was not.

在发现assertpy之前我也想写一个类似的包,尽可能通用一些。但是现在,我为毛要重新去造轮子?完全没必要!

总结

断言在软件系统中有非常重要的作用,写的好可以让你的系统更稳定,也可以让你有更多面对(女)对象的时间,而不是在调试代码。

Python中默认的断言语句其实还有一个作用,如果你写了一个类型相关的断言,IDE会把这个对象当成这种类型,这时候智能提示就有如神助。

要不要把内置的断言语句换成可读性更好功能更强大的第三方断言,完全取决于实际情况。比如你真的需要验证某个东西并且很关心验证结果,那么必须不能用简单的assert;如果你只是担心某个点可能有坑或者让IDE认识某个对象,用内置的assert既简单又方便。

所以说,项目经验还是蛮重要的。

assertion python_【Python】断言功能Assertion相关推荐

  1. python中case的用法_如何在Python中使用TestCase实现一个断言功能

    如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...

  2. python断言语句_Python中的断言(Assertions in Python)

    Python中的断言(Assertions in Python) 断言是一种完整性检查,您可以在完成程序测试后打开或关闭. 想到断言的最简单方法是将它比作一个raise-if语句(或者更准确,即使是i ...

  3. python后端开发框架加密_Flask框架实现的前端RSA加密与后端Python解密功能详解

    本文实例讲述了Flask框架实现的前端RSA加密与后端Python解密功能.分享给大家供大家参考,具体如下: 前言 在使用 Flask 开发用户登录API的时候,我之前都是明文传输 username ...

  4. 基于 MongoDB 的 python 日志功能

    本文首发于 Gevin的博客 原文链接:基于MongoDB的python日志功能 未经 Gevin 授权,禁止转载 基于MongoDB的python日志功能 why-log-to-mongodb 我几 ...

  5. python数据库模块_十二、Python高级功能之Mysql数据库模块

    Python高级功能之Mysql数据库模块 安装python mysql组件 # yum -y install MySQL-python.x86_64 以下根据实例来说明: >>> ...

  6. 用C语言扩展Python的功能的实例

    用C语言扩展Python的功能的实例 分类: C/C++ 编程技巧 Programes 2008-04-23 09:31 1232人阅读 评论(0)收藏 举报 python扩展语言cmethodsnu ...

  7. python断言assert实例_Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...

  8. Python 断言和异常

    Python 断言和异常 Python断言 断言是一种理智检查,当程序的测试完成,可以将其打开或关闭.断言的最简单方法就是把它比作raise-if语句(或更加准确,raise-if-not声明).一个 ...

  9. python文件之间的相互调用_用Python创建功能模块——截取字符串模块

    用Python创建模块 本篇文章小编给大家分享在Python如何创建属于自己的模块,实现更多的功能! 一.模块 模块是什么?简单来说,当程序的功能很多.代码量很大时,我们可以编写一个实现一定功能的py ...

最新文章

  1. 子div在父div中置底
  2. 小程序 页面禁止左右上下滑动
  3. java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
  4. 现在抖音这么火,那么你知道如何用CSS实现抖音字体?
  5. C/C++库函数math用法案例篇二
  6. 下载 嵌入式qt实战教程pdf_嵌入式QT基础视频教程免费分享!
  7. 【MySQL】为什么要学习MySQL数据库呢?
  8. Ubuntu 修改IP地址
  9. 理论综述与创新---结构洞的新应用
  10. EVO Evaluation of SLAM 4 --- ORB-SLAM3 编译和利用数据集运行
  11. 浅谈C中的malloc和free “来自bccn C语言论坛”
  12. 关于MFC的使用总结之四——添加menu菜单
  13. 神来之笔,阿里最新Spring Security源码手册牵动了多少人的心,拿走不谢
  14. Bais(偏差)与Variance(方差)的区别
  15. 齐岳提供的双核金属铱配合物黏度探针C10((df-ppy)2Ir(bpy)(CH2)10(bpy)Ir(btph)22+)-
  16. 如何清理网易云无损flac格式留下的注释163key(Don't Modify):.........等牛皮癣?
  17. 【日常问题】chrome开启无痕模式,屏蔽第三方cookie
  18. java递归1加到10,递归1-初识递归
  19. 服务器共享文件夹不刷新,win10文件夹不自动刷新的解决方案
  20. Prism:Uber 的 Presto 查询网关服务

热门文章

  1. 为啥加班多太多对身体会造成影响,不干活就不会对身体造成影响么?
  2. java 开启wifi_通过java代码打开wifi direct
  3. html和c的区别,tn-s系统与TN-C的区别是什么
  4. Docker实践(六)部署redis
  5. ShadeGraph教程之节点详解4:Master Nodes
  6. Memcached在Windows下的安装
  7. 微软在 Build 2020 上“展示”新版 Edge for Linux
  8. 在Raspberry Pi上轻松设置.NET Core并使用VS Code进行远程调试
  9. linux6.5 yum命令,CentOS6.5使用yum命令方便快捷安装Nginx
  10. python程序异常实例_Python werkzeug.exceptions方法代码示例