返回顶部
首页 > 资讯 > 后端开发 > Python >Python中断言Assertion的一些改进方案
  • 892
分享到

Python中断言Assertion的一些改进方案

断言方案Python 2022-06-04 18:06:15 892人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

Python Assert 为何不尽如人意? python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常。 >>> assert 1

Python Assert 为何不尽如人意?

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


>>> assert 1 + 1 == 2
>>> assert isinstance('Hello', str)
>>> assert isinstance('Hello', int)

Traceback (most recent call last):
 File "<input>", line 1, in <module>
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 "<input>", line 1, in <module>
AssertionError: Key: 'nothing' is not in Target: 'nothin is impossible.'

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

改进方案 #2

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

py.test

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


import pytest

def test_case():
  expected = "Hello"
  actual = "hello"
  assert expected == actual

if __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语句。


import unittest

class TestStringMethods(unittest.TestCase):

  def test_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()
class TestCases:
  @Test()
  def test1(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 <bar> is not equal to str <foo>.
"""

改进方案 #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')

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

Strings

Numbers

Lists

Tuples

Dicts

Sets

Booleans

Dates

Files

Objects

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


Expected <foo> to be of length <4>, but was <3>.
Expected <foo> to be empty string, but was not.
Expected <False>, but was not.
Expected <foo> to contain only digits, but did not.
Expected <123> to contain only alphabetic chars, but did not.
Expected <foo> to contain only uppercase chars, but did not.
Expected <FOO> to contain only lowercase chars, but did not.
Expected <foo> to be equal to <bar>, but was not.
Expected <foo> to be not equal to <foo>, but was.
Expected <foo> to be case-insensitive equal to <BAR>, but was not.

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

总结

断言在软件系统中有非常重要的作用,写的好可以让你的系统更稳定。Python中默认的断言语句其实还有一个作用,如果你写了一个类型相关的断言,IDE会把这个对象当成这种类型,这时候智能提示就有如神助。

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

所以说,项目经验还是蛮重要的。以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

--结束END--

本文标题: Python中断言Assertion的一些改进方案

本文链接: https://lsjlt.com/news/14079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中断言Assertion的一些改进方案
    Python Assert 为何不尽如人意? Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常。 >>> assert 1...
    99+
    2022-06-04
    断言 方案 Python
  • Python中unittest的断言方法详解
    目录断言方法:方法有: 下面是做的例子,后边是运行结果:总结断言方法:         是unitte...
    99+
    2024-04-02
  • python中断言方法的示例分析
    这篇文章主要为大家展示了“python中断言方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中断言方法的示例分析”这篇文章吧。pytho...
    99+
    2024-04-02
  • Python中有哪些判断集合的方法
    Python中有哪些判断集合的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众...
    99+
    2023-06-14
  • Python中优雅使用assert断言的方法实例
    目录什么是 assert 断言 断言和异常的使用场景 使用断言的几个原则建议不使用断言的情况:总结什么是 assert 断言 Assert statements are a co...
    99+
    2024-04-02
  • win7一直卡在还原更改的解决方案中
    现在有很多朋友使用win7系统,所以在win7系统的过程中会遇到一些问题,比如配置update失败,恢复和更改。不要关闭计算机,也就是说,win7一直被卡在恢复和更改中。如果win7被卡在恢复和更改中怎么办?许多朋友仍然不知道。让我们来看看...
    99+
    2023-07-10
  • Win7判断进程中哪些是系统进程以免误伤的方法
      Win7系统中,系统还有程序都是以进程的方式在系统中运行着,通常情况下我们都会在任务管理器中查看进程,以及对进程的一些操作,如结束,可是很多人并不知道哪些进程该关,哪些不该关。因为进程又分有系统关键进程和应用程序进程...
    99+
    2023-06-16
    Win7 进程 系统进程 判断 系统 方法
  • python中有哪些进行比较的方法
    python中有哪些进行比较的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、说明比较操作符in和not in检查一个值是否在一个序列中出现。操作符is和is not比较...
    99+
    2023-06-15
  • VSCode中设置Python语言自动格式化的方案
    目录 安装Python扩展 安装PEP8 安装Flake8 修改配置 开启Flake8 效果 格式化代码 批量处理历史代码 保存时自动格式化 定制策略 安装Python扩展 在VSCode的扩展(Externsions)中使用下面命令...
    99+
    2023-09-02
    vscode ide 编辑器 python
  • 一文详解Python中多进程和进程池的使用方法
    目录一、多进程二、进程池三、使用案例总结Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多进程和进程池是其强大的功能之一,可以让我们更加高...
    99+
    2023-05-16
    Python多进程 进程池使用 Python多进程 Python进程池
  • Python中多进程编程的常见问题及解决方案
    Python中多进程编程的常见问题及解决方案摘要:随着计算机硬件的发展,多核处理器已成为计算机的常态。因此,充分利用多核处理器的能力是提高程序性能的关键。在Python中,多进程编程是一种利用多核处理器的有效方法。然而,多进程编程也会面临一...
    99+
    2023-10-22
    结束和通信等问题。
  • python列表中常见的一些排序方法
    目录1、冒泡排序法方法一:直接使用for循环方法二:使用while语句2、选择排序法方法一:remove和append同时使用方法二:pop和append同时使用3、list.sor...
    99+
    2024-04-02
  • Python API 中自然语言处理对象的常见问题及解决方案有哪些?
    自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,它涉及到计算机对自然语言的理解和生成。Python 是一个流行的编程语言,也是自然语言处理领域的首选语言之一。Python 中有许...
    99+
    2023-09-09
    api 自然语言处理 对象
  • Unix系统中的二维码:Python缓存方案有哪些?
    二维码是一种二维图形码,可以将信息编码成黑白的图案,便于快速识别和传输。在Unix系统中,使用Python语言进行二维码编码和解码是一种常见的做法。但是,由于二维码图案的复杂性,生成二维码需要大量的计算和存储资源。为了提高二维码的生成效率...
    99+
    2023-07-29
    缓存 unix 二维码
  • 浅谈Python中用datetime包进行对时间的一些操作
    1. 计算给出两个时间之间的时间差 import datetime as dt # current time cur_time = dt.datetime.today() # one day pre_t...
    99+
    2022-06-04
    浅谈 中用 操作
  • python中令人蛋疼的地方及一些技巧
    此文所有代码基于python2.7.10语法 令人蛋疼的地方: 跳出多重循坏. 如果有一个多重循环(2个以上),要跳出多重循环在python里很蛋疼.没有goto语句,没有像java那样能给每个循环分配一个label,只能把每...
    99+
    2023-01-31
    技巧 地方 python
  • Python中为我们提供解决方案的方法特性有哪些
    Python中为我们提供解决方案的方法特性有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实际上,在日常的工作中,我们很多需求,无论是常见...
    99+
    2024-04-02
  • C语言中const保证变量不被修改的方法有哪些
    小编给大家分享一下C语言中const保证变量不被修改的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在C语言中,const是如何保证变量不被修改的?我们...
    99+
    2023-06-14
  • Python爬虫中使用代理IP的常见方案有哪些
    这篇文章将为大家详细讲解有关Python爬虫中使用代理IP的常见方案有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、建立本地IP池,无间隔获取IP由于直接从代理IP服务提供商的API接口获取IP具...
    99+
    2023-06-15
  • 分布式系统中的负载均衡,Go语言有哪些实现方案?
    随着分布式系统的普及,负载均衡技术也变得越来越重要。负载均衡的目的是将请求分配到多个服务器上,以提高系统的可用性、可靠性和性能。而Go语言的高并发和轻量级特性,使得它成为了分布式系统中负载均衡的首选语言之一。本文将介绍Go语言中的负载均衡...
    99+
    2023-09-04
    分布式 http leetcode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作