成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python中不盡如人意的斷言Assertion

The question / 2572人閱讀

摘要:為何不盡如人意中的斷言用起來非常簡(jiǎn)單,你可以在后面跟上任意判斷條件,如果斷言失敗則會(huì)拋出異常。中的斷言可讀性很好,而且智能提示也很方便你通過輕松完成各種斷言語句。而且它的斷言信息簡(jiǎn)潔明了,不多不少。

Python Assert 為何不盡如人意

Python中的斷言用起來非常簡(jiǎn)單,你可以在assert后面跟上任意判斷條件,如果斷言失敗則會(huì)拋出異常。

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

Traceback (most recent call last):
  File "", line 1, in 
AssertionError

其實(shí)assert看上去不錯(cuò),然而用起來并不爽。就比如有人告訴你程序錯(cuò)了,但是不告訴哪里錯(cuò)了。很多時(shí)候這樣的assert還不如不寫,寫了我就想罵娘。直接拋一個(gè)異常來得更痛快一些。

改進(jìn)方案 #1

一個(gè)稍微改進(jìn)一丟丟的方案就是把必要的信息也放到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."

看上去還行吧,但是其實(shí)寫的很蛋疼。假如你是一名測(cè)試汪,有成千上萬的測(cè)試案例需要做斷言做驗(yàn)證,相信你面對(duì)以上做法,心中一定有千萬只那種馬奔騰而過。

改進(jìn)方案 #2

不管你是你是搞測(cè)試還是開發(fā)的,想必聽過不少測(cè)試框架。你猜到我要說什么了吧?對(duì),不用測(cè)試框架里的斷言機(jī)制,你是不是灑。

py.test

py.test 是一個(gè)輕量級(jí)的測(cè)試框架,所以它壓根就沒寫自己的斷言系統(tǒng),但是它對(duì)Python自帶的斷言做了強(qiáng)化處理,如果斷言失敗,那么框架本身會(huì)盡可能多地提供斷言失敗的原因。那么也就意味著,用py.test實(shí)現(xiàn)測(cè)試,你一行代碼都不用改。

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單元測(cè)試框架就有了自己的斷言方法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大神寫了這么一個(gè)測(cè)試框架。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  is not equal to str .
"""
改進(jìn)方案 #3

不僅僅是你和我對(duì)Python中的斷言表示不滿足,所以大家都爭(zhēng)相發(fā)明自己的assert包。在這里我強(qiáng)烈推薦assertpy 這個(gè)包,它異常強(qiáng)大而且好評(píng)如潮。

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 主頁 文檔上你會(huì)發(fā)現(xiàn)它支持了幾乎你能想到的所有測(cè)試場(chǎng)景,包括但不限于以下列表。

Strings

Numbers

Lists

Tuples

Dicts

Sets

Booleans

Dates

Files

Objects

而且它的斷言信息簡(jiǎn)潔明了,不多不少。

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.

在發(fā)現(xiàn)assertpy之前我也想寫一個(gè)類似的包,盡可能通用一些。但是現(xiàn)在,我為毛要重新去造輪子?完全沒必要!

總結(jié)

斷言在軟件系統(tǒng)中有非常重要的作用,寫的好可以讓你的系統(tǒng)更穩(wěn)定,也可以讓你有更多真正面對(duì)對(duì)象的時(shí)間,而不是在調(diào)試代碼。

Python中默認(rèn)的斷言語句其實(shí)還有一個(gè)作用,如果你寫了一個(gè)類型相關(guān)的斷言,IDE會(huì)把這個(gè)對(duì)象當(dāng)成這種類型,這時(shí)候智能提示就有如神助。

要不要把內(nèi)置的斷言語句換成可讀性更好功能更強(qiáng)大的第三方斷言,完全取決于實(shí)際情況。比如你真的需要驗(yàn)證某個(gè)東西并且很關(guān)心驗(yàn)證結(jié)果,那么必須不能用簡(jiǎn)單的assert;如果你只是擔(dān)心某個(gè)點(diǎn)可能有坑或者讓IDE認(rèn)識(shí)某個(gè)對(duì)象,用內(nèi)置的assert既簡(jiǎn)單又方便。

所以說,項(xiàng)目經(jīng)驗(yàn)還是蠻重要的。

關(guān)于作者:Python技術(shù)愛好者,目前從事測(cè)試開發(fā)相關(guān)工作,轉(zhuǎn)載請(qǐng)注明原文出處。

歡迎關(guān)注我的博客 https://betacat.online,你可以到我的公眾號(hào)中去當(dāng)吃瓜群眾。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38212.html

相關(guān)文章

  • 【modernPHP專題(11)】斷言ASSERT

    摘要:可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測(cè)試時(shí)啟用斷言,而在部署時(shí)禁用斷言。會(huì)檢查指定的并在結(jié)果為時(shí)采取適當(dāng)?shù)男袆?dòng)視而定。中的斷言向后兼用并增強(qiáng)之前的的方法。它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。 簡(jiǎn)述 編寫代碼時(shí),我們總是會(huì)做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè),可以將斷言看作是異常處理的一種高級(jí)形式。程序員斷言在程序中的某個(gè)特定點(diǎn)該...

    WalkerXu 評(píng)論0 收藏0
  • 你所不知 PHP 斷言(assert)

    摘要:中的斷言常用于調(diào)試,檢查一個(gè)表達(dá)式或語句是否為。用的最多的場(chǎng)景就是單元測(cè)試,一般的單元測(cè)試框架都采用了斷言。運(yùn)行結(jié)果中的斷言在中,采用函數(shù)對(duì)表達(dá)式進(jìn)行斷言。單元測(cè)試測(cè)試不通過測(cè)試不通過是不是跟我們用寫單元測(cè)試很像 PHP 中的斷言常用于調(diào)試,檢查一個(gè)表達(dá)式或語句是否為 FALSE。本文帶你重新認(rèn)識(shí) PHP assert() 函數(shù)的神(Qi)通(Yin)廣(Ji)大(Qiao)。本文基于...

    Pines_Cheng 評(píng)論0 收藏0
  • SoapUI實(shí)踐:自動(dòng)化測(cè)試、壓力測(cè)試、持續(xù)集成

    摘要:葡萄城于年在中國(guó)設(shè)立研發(fā)中心,在全球化產(chǎn)品的研發(fā)過程中,不斷適應(yīng)中國(guó)市場(chǎng)的本地需求,并為軟件企業(yè)和各行業(yè)的信息化提供優(yōu)秀的軟件工具和咨詢服務(wù)。 ? 因?yàn)轫?xiàng)目的原因,前段時(shí)間研究并使用了 SoapUI 測(cè)試工具進(jìn)行自測(cè)開發(fā)的 api。下面將研究的成果展示給大家,希望對(duì)需要的人有所幫助。 SoapUI 是什么? SoapUI 是一個(gè)開源測(cè)試工具,通過 soap/http 來檢查、調(diào)用、實(shí)現(xiàn)...

    陳偉 評(píng)論0 收藏0
  • 奮戰(zhàn)金九銀十?刷完這一套面試題就夠了!自動(dòng)化軟件測(cè)試工程師跳槽漲薪秘籍!

    摘要:九安卓中如何取出日志信息把安卓系統(tǒng)日志信息實(shí)時(shí)導(dǎo)入到本地運(yùn)行使用某個(gè),實(shí)時(shí)獲取該的日志信息里面的返回信息接口自動(dòng)化面試題一按你的理解,軟件接口是什么答就是指程序中具體負(fù)責(zé)在不同模塊之間傳輸或接受數(shù)據(jù)的并做處理的類或者函數(shù)。 ...

    Freelander 評(píng)論0 收藏0
  • JS進(jìn)階篇--JS之console.log詳解以及兄弟姐們鄰居方法擴(kuò)展

    摘要:各個(gè)消息作為字串的對(duì)象。借助控制臺(tái)以及方法我們可以很方便地監(jiān)控運(yùn)行性能。 console.log() 基本用法 console.log,前端常用它來調(diào)試分析代碼,你可以在任何的js代碼中調(diào)用console.log(),然后你就可以在瀏覽器控制臺(tái)看到你剛才打印的常量,變量,數(shù)組,對(duì)象,表達(dá)式等的值。 首先看最基本的用法: console.log(123); // 123 consol...

    archieyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<