assertion python_【Python】断言功能Assertion
转自 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相关推荐
- python中case的用法_如何在Python中使用TestCase实现一个断言功能
如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...
- python断言语句_Python中的断言(Assertions in Python)
Python中的断言(Assertions in Python) 断言是一种完整性检查,您可以在完成程序测试后打开或关闭. 想到断言的最简单方法是将它比作一个raise-if语句(或者更准确,即使是i ...
- python后端开发框架加密_Flask框架实现的前端RSA加密与后端Python解密功能详解
本文实例讲述了Flask框架实现的前端RSA加密与后端Python解密功能.分享给大家供大家参考,具体如下: 前言 在使用 Flask 开发用户登录API的时候,我之前都是明文传输 username ...
- 基于 MongoDB 的 python 日志功能
本文首发于 Gevin的博客 原文链接:基于MongoDB的python日志功能 未经 Gevin 授权,禁止转载 基于MongoDB的python日志功能 why-log-to-mongodb 我几 ...
- python数据库模块_十二、Python高级功能之Mysql数据库模块
Python高级功能之Mysql数据库模块 安装python mysql组件 # yum -y install MySQL-python.x86_64 以下根据实例来说明: >>> ...
- 用C语言扩展Python的功能的实例
用C语言扩展Python的功能的实例 分类: C/C++ 编程技巧 Programes 2008-04-23 09:31 1232人阅读 评论(0)收藏 举报 python扩展语言cmethodsnu ...
- python断言assert实例_Python断言assert的用法代码解析
在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...
- Python 断言和异常
Python 断言和异常 Python断言 断言是一种理智检查,当程序的测试完成,可以将其打开或关闭.断言的最简单方法就是把它比作raise-if语句(或更加准确,raise-if-not声明).一个 ...
- python文件之间的相互调用_用Python创建功能模块——截取字符串模块
用Python创建模块 本篇文章小编给大家分享在Python如何创建属于自己的模块,实现更多的功能! 一.模块 模块是什么?简单来说,当程序的功能很多.代码量很大时,我们可以编写一个实现一定功能的py ...
最新文章
- 子div在父div中置底
- 小程序 页面禁止左右上下滑动
- java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
- 现在抖音这么火,那么你知道如何用CSS实现抖音字体?
- C/C++库函数math用法案例篇二
- 下载 嵌入式qt实战教程pdf_嵌入式QT基础视频教程免费分享!
- 【MySQL】为什么要学习MySQL数据库呢?
- Ubuntu 修改IP地址
- 理论综述与创新---结构洞的新应用
- EVO Evaluation of SLAM 4 --- ORB-SLAM3 编译和利用数据集运行
- 浅谈C中的malloc和free “来自bccn C语言论坛”
- 关于MFC的使用总结之四——添加menu菜单
- 神来之笔,阿里最新Spring Security源码手册牵动了多少人的心,拿走不谢
- Bais(偏差)与Variance(方差)的区别
- 齐岳提供的双核金属铱配合物黏度探针C10((df-ppy)2Ir(bpy)(CH2)10(bpy)Ir(btph)22+)-
- 如何清理网易云无损flac格式留下的注释163key(Don't Modify):.........等牛皮癣?
- 【日常问题】chrome开启无痕模式,屏蔽第三方cookie
- java递归1加到10,递归1-初识递归
- 服务器共享文件夹不刷新,win10文件夹不自动刷新的解决方案
- Prism:Uber 的 Presto 查询网关服务
热门文章
- 为啥加班多太多对身体会造成影响,不干活就不会对身体造成影响么?
- java 开启wifi_通过java代码打开wifi direct
- html和c的区别,tn-s系统与TN-C的区别是什么
- Docker实践(六)部署redis
- ShadeGraph教程之节点详解4:Master Nodes
- Memcached在Windows下的安装
- 微软在 Build 2020 上“展示”新版 Edge for Linux
- 在Raspberry Pi上轻松设置.NET Core并使用VS Code进行远程调试
- linux6.5 yum命令,CentOS6.5使用yum命令方便快捷安装Nginx
- python程序异常实例_Python werkzeug.exceptions方法代码示例