摘要:為何不盡如人意中的斷言用起來非常簡單,你可以在后面跟上任意判斷條件,如果斷言失敗則會拋出異常。中的斷言可讀性很好,而且智能提示也很方便你通過輕松完成各種斷言語句。而且它的斷言信息簡潔明了,不多不少。
Python Assert 為何不盡如人意
Python中的斷言用起來非常簡單,你可以在assert后面跟上任意判斷條件,如果斷言失敗則會拋出異常。
>>> assert 1 + 1 == 2 >>> assert isinstance("Hello", str) >>> assert isinstance("Hello", int) Traceback (most recent call last): File "", line 1, inAssertionError
其實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, inAssertionError: Key: "nothing" is not in Target: "nothin is impossible."
看上去還行吧,但是其實寫的很蛋疼。假如你是一名測試汪,有成千上萬的測試案例需要做斷言做驗證,相信你面對以上做法,心中一定有千萬只那種馬奔騰而過。
改進方案 #2不管你是你是搞測試還是開發的,想必聽過不少測試框架。你猜到我要說什么了吧?對,不用測試框架里的斷言機制,你是不是灑。
py.testpy.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改進方案 #3is not equal to str . """
不僅僅是你和我對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
而且它的斷言信息簡潔明了,不多不少。
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.
在發現assertpy之前我也想寫一個類似的包,盡可能通用一些。但是現在,我為毛要重新去造輪子?完全沒必要!
總結斷言在軟件系統中有非常重要的作用,寫的好可以讓你的系統更穩定,也可以讓你有更多真正面對對象的時間,而不是在調試代碼。
Python中默認的斷言語句其實還有一個作用,如果你寫了一個類型相關的斷言,IDE會把這個對象當成這種類型,這時候智能提示就有如神助。
要不要把內置的斷言語句換成可讀性更好功能更強大的第三方斷言,完全取決于實際情況。比如你真的需要驗證某個東西并且很關心驗證結果,那么必須不能用簡單的assert;如果你只是擔心某個點可能有坑或者讓IDE認識某個對象,用內置的assert既簡單又方便。
所以說,項目經驗還是蠻重要的。
關于作者:Python技術愛好者,目前從事測試開發相關工作,轉載請注明原文出處。
歡迎關注我的博客 https://betacat.online,你可以到我的公眾號中去當吃瓜群眾。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38212.html
摘要:可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。會檢查指定的并在結果為時采取適當的行動視而定。中的斷言向后兼用并增強之前的的方法。它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。 簡述 編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。程序員斷言在程序中的某個特定點該...
摘要:中的斷言常用于調試,檢查一個表達式或語句是否為。用的最多的場景就是單元測試,一般的單元測試框架都采用了斷言。運行結果中的斷言在中,采用函數對表達式進行斷言。單元測試測試不通過測試不通過是不是跟我們用寫單元測試很像 PHP 中的斷言常用于調試,檢查一個表達式或語句是否為 FALSE。本文帶你重新認識 PHP assert() 函數的神(Qi)通(Yin)廣(Ji)大(Qiao)。本文基于...
摘要:葡萄城于年在中國設立研發中心,在全球化產品的研發過程中,不斷適應中國市場的本地需求,并為軟件企業和各行業的信息化提供優秀的軟件工具和咨詢服務。 ? 因為項目的原因,前段時間研究并使用了 SoapUI 測試工具進行自測開發的 api。下面將研究的成果展示給大家,希望對需要的人有所幫助。 SoapUI 是什么? SoapUI 是一個開源測試工具,通過 soap/http 來檢查、調用、實現...
摘要:九安卓中如何取出日志信息把安卓系統日志信息實時導入到本地運行使用某個,實時獲取該的日志信息里面的返回信息接口自動化面試題一按你的理解,軟件接口是什么答就是指程序中具體負責在不同模塊之間傳輸或接受數據的并做處理的類或者函數。 ...
摘要:各個消息作為字串的對象。借助控制臺以及方法我們可以很方便地監控運行性能。 console.log() 基本用法 console.log,前端常用它來調試分析代碼,你可以在任何的js代碼中調用console.log(),然后你就可以在瀏覽器控制臺看到你剛才打印的常量,變量,數組,對象,表達式等的值。 首先看最基本的用法: console.log(123); // 123 consol...
閱讀 1772·2021-10-11 10:57
閱讀 2356·2021-10-08 10:14
閱讀 3399·2019-08-29 17:26
閱讀 3356·2019-08-28 17:54
閱讀 3029·2019-08-26 13:38
閱讀 2903·2019-08-26 12:19
閱讀 3613·2019-08-23 18:05
閱讀 1282·2019-08-23 17:04