網(wǎng)站首頁 編程語言 正文
引言
阿刁是一個(gè)自動(dòng)化測(cè)試用例,從一出生他就被賦予終生使命,去測(cè)試一個(gè)叫登錄的過程是否合理。他一直就被關(guān)在一個(gè)小黑屋里面,從來也沒有出去過,小黑屋里還被關(guān)著其他的同胞,他們身上都捆著兩個(gè)小袋子。
小黑屋里很難受,他們都想跑出去,可怎么也跑不出去。Python 是他們的總司令,有一次,python 告訴他們,你們就不要想著跑出去了,你們已經(jīng)夠幸運(yùn)了,只有 8 個(gè)人用這個(gè)屋子,別的屋子都擠著 30 多個(gè)人呢!
“這里還有其他的屋子?” 一個(gè)用例頓時(shí)感到很欣喜。
“有,這樣的屋子這里有 200 多個(gè)。每個(gè)屋子都有門牌號(hào),你們這個(gè)門牌是 test_login,你們這個(gè)小鎮(zhèn)住的人都很危險(xiǎn),所以通常不允許出去逛。這是你們的小鎮(zhèn)地圖。‘’
“我們哪里危險(xiǎn)了。。。” 阿刁很不滿。
Python 微微一笑:“你別不服,看到你們身后的袋子了嗎?這里面裝了炸彈,里面有兩種火藥配方,一個(gè)叫 ‘’ 用戶名”,一個(gè)叫 “密碼”,你們每個(gè)人的配方都不一樣,因此威力也不一樣。你們的工作就是去測(cè)試 login 這個(gè)堡壘的堅(jiān)固程度,這樣堡壘真正投入使用的時(shí)候,就不怕外面的攻擊了。”
“可我們每天都被關(guān)在屋子里,哪知道怎么去攻擊城堡。”
“這個(gè)是個(gè)好問題。你們每個(gè)人的名字下面我都掛了個(gè)錦囊,里面有指令,按照指令做就行了。”
阿刁低頭一看,還真有指令,他大聲的念了出來:第一條指令是叫 verify 過來幫忙,第二條指令是把炸彈裝到 verify 身上,第三條指令是查看 verify 豎起的旗幟,看是否和自己身上的胎記一樣,如果一樣,就可以下班了;如果不一樣,那就報(bào)告 Python。
“咦,我的指令也是一樣的。我的胎記上有一行字,密碼為空。你們的呢?”
“我的也是。”
"我的是用戶不能為空。"
“我的跟你一樣啊”
阿刁低頭去看自己的胎記 “登錄成功”。這給了他希望,不過他對(duì)自己的工作還有些疑惑,他得乘總司令還在的時(shí)候問問他:“老大,你的指令寫得非常明確,可我并不認(rèn)識(shí)什么 verify,萬一他不過來怎么辦?”,其他人一聽到這個(gè)頓時(shí)都焦慮起來,是啊,萬一 verify 不來,這炸彈炸到自己了怎么辦?
verify 炸彈
Python 指揮官給了阿刁一個(gè)贊賞的眼神,開始講:“大家不要慌,你們看到墻上的按鈕了嗎 “
所有人都紛紛望向墻面,上面有很多按鈕,其中一個(gè)印著:
from castles.login import verify
” 雖然你們通常不允許出去,但是別人是可以進(jìn)出的,你們看地圖,verify 是 logi
列表是一種經(jīng)常使用的數(shù)據(jù)類型。在函數(shù)的定義中,常常會(huì)使用列表作為參數(shù)。
測(cè)試接口的數(shù)據(jù)
比如,要測(cè)試一個(gè)接口的數(shù)據(jù),接口返回的數(shù)據(jù)格式如下:
{ "code": "20000", "data": ["孫悟空","李白","甄姬"], "msg": "success", "status": 0 }
要測(cè)試的內(nèi)容是:返回的 data 數(shù)據(jù)是否跟需求符合。在測(cè)試之前,需要對(duì)數(shù)據(jù)進(jìn)一步處理,比如要增加 "王昭君" 這個(gè)元素進(jìn)去,需要寫一個(gè)函數(shù):
def add_element(data=["孫悟空","李白","甄姬"]): data.append('王昭君') return data print(add_element()) print(add_element()) print(add_element())
在函數(shù)定義的時(shí)候經(jīng)常會(huì)給參數(shù)設(shè)置默認(rèn)值,在這個(gè)例子中,將 data 參數(shù)設(shè)置了默認(rèn)值,函數(shù)定義以后,后面會(huì)被頻繁的調(diào)用,期望值應(yīng)該是打印如下:
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
實(shí)際結(jié)果為:
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君","王昭君"]
原因
當(dāng)定義函數(shù)時(shí),會(huì)保存函數(shù)中默認(rèn)參數(shù) data 的值,也就是?["孫悟空","李白","甄姬"]
,在每次調(diào)用的時(shí)候如果傳遞了新的實(shí)參,則使用傳遞的參數(shù);沒有傳遞,使用定義函數(shù)時(shí)保存的默認(rèn)參數(shù)。
上面兩次調(diào)用中,都沒有傳遞新的實(shí)參,程序會(huì)調(diào)用定義函數(shù)時(shí)保存的默認(rèn)參數(shù),因?yàn)?append() , 在第一次調(diào)用以后,默認(rèn)參數(shù)已經(jīng)由?["孫悟空","李白","甄姬"]
?改變?yōu)?["孫悟空","李白","甄姬","王昭君"]
,再次執(zhí)行 append() 之后,就變成了?["孫悟空","李白","甄姬","王昭君","王昭君"]
;同理,第三次又改變了。
可以使用 id() 函數(shù)來定位問題:
def add_element(data=["孫悟空","李白","甄姬"]): # id 來表示是不是同一個(gè)對(duì)象 print(id(data)) data.append('王昭君') return data print(add_element()) print(add_element()) print(add_element())
打印出來的?id(data)
?為同一個(gè)對(duì)象,也就是默認(rèn)參數(shù)。如果我們改變 第二個(gè)?print(add_element())
為?print(add_element(["孫悟空","李白","甄姬"]))
,那么第 2 個(gè)?id(data)
?就會(huì)發(fā)生變化,因?yàn)樗辉谑悄J(rèn)值,而是新傳進(jìn)來的實(shí)參,實(shí)際結(jié)果也將變成:
2543416926792
['孫悟空', '李白', '甄姬', '王昭君']
2543418907848
["孫悟空","李白","甄姬", '王昭君']
2543416926792
['孫悟空', '李白', '甄姬', '王昭君', '王昭君']
改進(jìn)方案
- 如果參數(shù)中有列表,盡量不要用它做默認(rèn)參數(shù)
- 如果使用了列表作為默認(rèn)參數(shù),函數(shù)調(diào)用時(shí)傳入實(shí)參,而不是省略
- 可以在函數(shù)體中另外定義一個(gè)變量接收默認(rèn)參數(shù)
def add_element(data=["孫悟空","李白","甄姬"]): if data == ["孫悟空","李白","甄姬"]: data = ["孫悟空","李白","甄姬"] data.append('王昭君') return data
原文鏈接:https://testerhome.com/column_channels/33885
相關(guān)推薦
- 2022-08-14 Python數(shù)據(jù)處理之pd.Series()函數(shù)的基本使用_python
- 2022-08-04 django中使用memcached示例詳解_python
- 2023-07-26 vite項(xiàng)目中處理各種靜態(tài)資源的引入方式介紹
- 2023-05-23 pytorch中backward()方法如何自動(dòng)求梯度_python
- 2022-03-18 C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解_C 語言
- 2022-10-13 詳解python-opencv?常用函數(shù)_python
- 2022-05-10 VSCode中 “Error:Can‘t find Python executable “pytho
- 2022-10-10 pandas中df.rename()的具體使用_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支