斷言語句和 if 分支有點類似,它用於對一個 bool 表達式進行斷言,如果該 bool 表達式為 True,該程序可以繼續向下執行;否則程序會引發 AssertionError 錯誤。
斷言格式 : assert+空格+要判斷語句+雙引號“報錯語句”
一、斷言的常見用途
那么我們什么時候應該使用斷言呢?如果沒有特別的目的,斷言應該用於如下情況:
- 防御性的編程
- 運行時對程序邏輯的檢測
- 合約性檢查(比如前置條件,后置條件)
- 程序中的常量
- 檢查文檔
二、assert基礎語法1
s_age = input("請輸入您的年齡:") age = int(s_age) assert 20 < age < 80 print("您輸入的年齡在20和80之間")
上面程序中粗體字代碼斷言 age 必須位於 20 到 80 之間。運行上面程序,如果輸入的 age 處於執行范圍之內,則可看到如下運行過程:
運行結果:
請輸入您的年齡:23 您輸入的年齡在20和80之間
如果輸入的 age 不處於 20 到 80 之間,將可以看到如下運行過程:
運行結果: 請輸入您的年齡:1 Traceback (most recent call last): File "C:\Users\mengma\Desktop\1.py", line 3, in <module> assert 20 < age < 80 AssertionError
三、assert基礎語法2
s_age = input("請輸入您的年齡:")
age = int(s_age)
assert 20 < age < 80, "斷言錯誤提示:年齡不在范圍之內!"
print("您輸入的年齡在20和80之間")
上面程序中粗體字代碼斷言 age 必須位於 20 到 80 之間。運行上面程序,如果輸入的 age 處於執行范圍之內,則可看到如下運行過程: 運行結果: 請輸入您的年齡:23 您輸入的年齡在20和80之間
如果輸入的 age 不處於 20 到 80 之間,將可以看到如下運行過程:
運行結果:
請輸入您的年齡:1
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/json/flaskAI/day9020190712/test1.py", line 10, in <module>
assert 20 < age < 80, "斷言錯誤提示:年齡不在范圍之內!"
AssertionError: 斷言錯誤提示:年齡不在范圍之內!
四、斷言的自動化測試腳本
python自動化測試中尋找元素並進行操作,如果在元素好找的情況下,相信大家都可以較熟練地編寫用例腳本了,但光進行操作可能還不夠,有時候也需要對預期結果進行判斷。
常用斷言:
assertEqual
assertNotEqual
assertTrue
assertFalse
assertIsNone
assertIsNotNone
五、assertEqual 和 assertNotEqual
assertEqual:如兩個值相等,則pass
assertNotEqual:如兩個值不相等,則pass
使用方法:
assertEqual(first,second,msg)其中first與second進行比較,如果相等則通過;msg為失敗時打印的信息,選填;斷言assertNotEqual反着用就可以了。
六、assertTrue和assertFalse
assertTrue:判斷bool值為True,則pass
assertFalse:判斷bool值為False,則Pass
使用方法:
assertTrue(expr,msg)其中express輸入相應表達式,如果表達式為真,則pass;msg選填;斷言assertFalse如果表達式為假,則pass
七、assertIsNone和assertIsNotNone
assertIsNone:不存在,則pass
assertIsNotNone:存在,則pass
使用方法:
assertIsNone(obj,msg)檢查某個元素是否存在
八、斷言測試補充
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIs(a, b) a is b 2.7 assertIsNot(a, b) a is not b 2.7 assertIsNone(x) x is None 2.7 assertIsNotNone(x) x is not None 2.7 assertIn(a, b) a in b 2.7 assertNotIn(a, b) a not in b 2.7 assertIsInstance(a, b) isinstance(a, b) 2.7 assertNotIsInstance(a, b) not isinstance(a, b) 2.7
assertAlmostEqual(a, b) round(a-b, 7) == 0 assertNotAlmostEqual(a, b) round(a-b, 7) != 0 assertGreater(a, b) a > b 2.7 assertGreaterEqual(a, b) a >= b 2.7 assertLess(a, b) a < b 2.7 assertLessEqual(a, b) a <= b 2.7 assertRegexpMatches(s, re) regex.search(s) 2.7 assertNotRegexpMatches(s, re) not regex.search(s) 2.7 assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7 assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7 assertDictEqual(a, b) dicts 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7assertDictEqual(a, b) dicts 2.7
九、防御性編程中添加斷言實例
在代碼開始添加注釋是個好的開端,但是人們都不太喜歡讀和更新這些注釋,這些注釋會很快變得過時。但對於斷言,我們可以同時對這塊代碼編寫文檔,如果這些斷言被違反了,會直接引起一個簡單而又直接的失敗。
target = 5 x = 1 y = 2 z = 3 def run_x_code(): print(1) def run_y_code(): print(2) def run_z_code(): print(3) assert target in (x, y, z) if target == x: run_x_code() elif target == y: run_y_code() else: assert target == z run_z_code()
打印結果: # target = 5 時 Traceback (most recent call last): File "C:/Users/Administrator/Desktop/json/flaskAI/day9020190712/test1.py", line 31, in <module> assert target in (x, y, z) AssertionError