摘要:為何不盡如人意中的斷言用起來非常簡(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, inAssertionError
其實(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, inAssertionError: 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.testpy.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改進(jìn)方案 #3is not equal to str . """
不僅僅是你和我對(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)潔明了,不多不少。
Expectedto 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
摘要:可以在任何時(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)該...
摘要:中的斷言常用于調(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)。本文基于...
摘要:葡萄城于年在中國(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)...
摘要:九安卓中如何取出日志信息把安卓系統(tǒng)日志信息實(shí)時(shí)導(dǎo)入到本地運(yùn)行使用某個(gè),實(shí)時(shí)獲取該的日志信息里面的返回信息接口自動(dòng)化面試題一按你的理解,軟件接口是什么答就是指程序中具體負(fù)責(zé)在不同模塊之間傳輸或接受數(shù)據(jù)的并做處理的類或者函數(shù)。 ...
摘要:各個(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...
閱讀 1774·2021-10-11 10:57
閱讀 2364·2021-10-08 10:14
閱讀 3404·2019-08-29 17:26
閱讀 3363·2019-08-28 17:54
閱讀 3032·2019-08-26 13:38
閱讀 2913·2019-08-26 12:19
閱讀 3617·2019-08-23 18:05
閱讀 1288·2019-08-23 17:04