Robot Framework--06 用户关键字User Keyword
轉(zhuǎn)自:http://blog.csdn.net/tulituqi/article/details/7906130
?
在我們做自動(dòng)化案例的時(shí)候,用的最多的主要是用戶關(guān)鍵字。說到關(guān)鍵字,大體上可以分為測(cè)試庫關(guān)鍵字(或叫系統(tǒng)關(guān)鍵字)和用戶關(guān)鍵字,前者一般都是通過加載Library得到的,而用戶關(guān)鍵字一般都是通過加載Resouce得到的。
以之前的這個(gè)case為例:
圖中的Import Variables和log都是測(cè)試庫關(guān)鍵字,而搜索測(cè)試這個(gè)就是用戶關(guān)鍵字,只要RIDE的版本高一些,就能看出他們的顏色是有區(qū)別的。
?
接下來,我們新建一個(gè)案例,并針對(duì)用戶關(guān)鍵字的用法進(jìn)行介紹。
1、先新建一個(gè)用戶關(guān)鍵字,不用帶arguments。
在Setting下面的這些呢,Documentation就不多說了。主要看下面4個(gè)設(shè)置,其實(shí)前面的文章里也簡(jiǎn)單介紹過,這里再說一下。
Arguments: 設(shè)置傳入?yún)?shù)
Teardown: 設(shè)置完成時(shí)的動(dòng)作,比如寫上Close All Browsers,表示在這個(gè)用戶關(guān)鍵字執(zhí)行完成之后會(huì)執(zhí)行什么關(guān)鍵字。
Timeout: 設(shè)置超時(shí)時(shí)間,如寫上1min,表示1分鐘超時(shí),如果這個(gè)關(guān)鍵字執(zhí)行超過1分鐘則認(rèn)為失敗。
Return Value: 設(shè)置返回值
?
一直以來我都覺得用戶關(guān)鍵字就像一個(gè)函數(shù)一樣,有傳入?yún)?shù)Arguments,有返回值Return Value,而且還可以用Teardown作為函數(shù)完成后的清理動(dòng)作。
所以我們也要像函數(shù)一樣來使用User Keyword。
?
2、傳入?yún)?shù)Arguments
前面在做案例分層的時(shí)候其實(shí)已經(jīng)用到了一些參數(shù)設(shè)置了,可以看看前面2篇文章。這里提一下多參數(shù)及可選參數(shù)的設(shè)置。
?
??? 0)變量類型
順帶提一下變量的類型,RF里的變量分兩種,一種是Scalar,可以理解為單值變量,一種是List Variable,list型變量,或者可以理解為數(shù)組變量。Scalar型變量用$符號(hào)開頭,List型變量用@符號(hào)開頭。這里只是簡(jiǎn)單介紹,后面會(huì)專門寫一篇兩種變量關(guān)系的。
?
??? 1)必填參數(shù)
給我們的關(guān)鍵字先添加4個(gè)參數(shù),參數(shù)之間使用 |? 進(jìn)行分隔。(如果想在默認(rèn)值里使用 | 作為一個(gè)值而不是分隔符,那么就要使用 \| 來表示|的值。
?
如果是這樣添加參數(shù)呢,表示這些參數(shù)都是必填的,我們建一個(gè)case3,并調(diào)用關(guān)鍵字測(cè)試看一下,這里的關(guān)鍵字測(cè)試后面的4個(gè)格子都是紅色,提示參數(shù)必填。
?
??? 2)選填參數(shù)
假設(shè)我們想把其中第2個(gè)參數(shù)設(shè)成選填參數(shù),選填參數(shù)就是給參數(shù)加上默認(rèn)值,默認(rèn)值使用 =? 加上值,如果想默認(rèn)為空,只寫等號(hào)就行了。
(默認(rèn)值的意思不需要細(xì)講了哈,就是如果你在調(diào)用這個(gè)關(guān)鍵字的時(shí)候,如果不給這個(gè)選填參數(shù)傳值,那么就使用默認(rèn)值作為參數(shù)的值)
如果我們直接這樣加的話,點(diǎn)擊OK就會(huì)報(bào)錯(cuò)。意思是說必填參數(shù)不允許在選填參數(shù)后面。
也就是說如果某一個(gè)參數(shù)設(shè)置成了選填參數(shù),那么他后面的參數(shù)都必須是選填參數(shù),不能是必填參數(shù)。
在我們這里就是第2個(gè)參數(shù)如果要可選,要么把3、4參數(shù)也都設(shè)置上默認(rèn)值,要么就把第2個(gè)參數(shù)調(diào)整到最后去。我先調(diào)整成下面這樣,就不會(huì)報(bào)錯(cuò)了。
?
??? 3)List變量參數(shù)
List變量也是可以作為參數(shù),但是List變量只能放在最后一位。如果放在前面,就會(huì)報(bào)錯(cuò)。
我把a(bǔ)rg4改成了@{arg4}這樣的List變量,保存時(shí)就會(huì)提示List變量只能作為最后一個(gè)參數(shù)。
為啥只能是最后一個(gè)呢?從英文的角度看是the last argument,沒有s。。。。
如果一定要試試最后2個(gè)都放list變量呢,也是會(huì)報(bào)錯(cuò)的。
?
這是為什么呢?首先,List變量本來來說,他是一個(gè)可變的,即List的成員數(shù)量不確定。而List作為參數(shù)的話,有幾個(gè)成員就是相當(dāng)于幾個(gè)單值參數(shù),他實(shí)際上是提供了一種參數(shù)個(gè)數(shù)可變的方式。那么既然可變,如果放在前面的話(見第一個(gè)例子的圖),他就沒法確定傳入的參數(shù)到底哪些是給arg4的,哪個(gè)是給arg2的了;同理,如果放2個(gè)List也是不行的(見第二個(gè)例子的圖),因?yàn)橐彩菬o法區(qū)分傳入的參數(shù)到底哪些是給arg4,哪些是給arg2。
而且2個(gè)可變和1個(gè)可變沒什么差別滴,所以最終限定是只能有1個(gè)List參數(shù),并且必須放在最后。
?
注意一下:變量名和等號(hào)間不能有空格,如果有空格系統(tǒng)會(huì)報(bào)參數(shù)語法錯(cuò)誤。
?
最后看一下List參數(shù)的實(shí)例,其他幾種實(shí)例應(yīng)該沒什么復(fù)雜的,大家自己練習(xí)一下即可。
為了看的方便,我把參數(shù)數(shù)量減少點(diǎn),只放2個(gè)參數(shù),${arg1} | @{arg2},然后用了個(gè)Fail,目的是想把值打印在運(yùn)行界面上。
?
然后我們?cè)赾ase3里給他傳幾個(gè)值。
我特意把關(guān)鍵字的說明也截圖下來,大家可以看到agr2前面有個(gè)*,表示他可以接受任意個(gè)參數(shù),Python里其實(shí)也是這樣處理多參數(shù)的。
運(yùn)行一下案例,看一下打印出來的內(nèi)容。
?
繼續(xù)介紹User Keyword里面的Teardown和Return Value的內(nèi)容
?
3、Teardown測(cè)試完成回收清理
如果有用過Junit的朋友應(yīng)該記得Junit的案例一般都是有一個(gè)Setup、一個(gè)Test、一個(gè)Teardown的,同樣我們的TestCase也是有這2個(gè)的,大家可以自己看一下case的Setting。
那么這個(gè)User Keyword的Teardown,作用都是差不多的,如果是Case的Teardown,那么是案例結(jié)束的時(shí)候做回收清理;而User Keyword的Teardown就是用在調(diào)用User Keyword完成之后才會(huì)做的數(shù)據(jù)回收清理。
當(dāng)然,用于什么可以根據(jù)你自己的需求自己調(diào)整,并不一定是數(shù)據(jù)回收清理,是系統(tǒng)關(guān)鍵字或者用戶關(guān)鍵字都可以。總之可以理解為關(guān)鍵字完成后還要調(diào)一個(gè)關(guān)鍵字。參數(shù)要用 | 分隔。
我這里改造一下上一篇寫的關(guān)鍵字測(cè)試,以便于演示Teardown的作用。
改完的效果是先把a(bǔ)rg1的值賦給temp,然后把a(bǔ)rg2的列表第三項(xiàng)值賦給arg1(這里算個(gè)小bug,如果傳的參數(shù)少于3個(gè)就會(huì)報(bào)錯(cuò)了,這里只是演示,請(qǐng)忽略),然后log打印出arg1和arg2的值。
在Teardown這里我使用了Set Suite Variable方法,把temp的值覆蓋arg1,并把a(bǔ)rg1設(shè)為Suite級(jí)別的變量,然后我再case3里調(diào)用完關(guān)鍵字測(cè)試后又用log打印出arg1的值。(也可以用Set Global Variable,如果不用這2個(gè)的話,在case3里是找不到arg1這個(gè)變量的)
?
接著我們執(zhí)行一下案例,看看報(bào)告。
如上面所說,首先把a(bǔ)rg1的值111賦給了temp,然后又把a(bǔ)rg2的第3個(gè)值444賦給了arg1,最后再把temp的值賦給arg1。
我這個(gè)就算是一種清理吧,讓參數(shù)的值在關(guān)鍵字內(nèi)部發(fā)生變化,在Teardown的時(shí)候把他的值恢復(fù)回來。
?
Teardown這里只能寫一行語句,如果你要執(zhí)行多行語句的話,那最好是再專門寫一個(gè)關(guān)鍵字,然后在Teardown這里調(diào)用這個(gè)新增的關(guān)鍵字。
?
4、Return Value返回值
這個(gè)應(yīng)該不用怎么解釋了,只是說說用法,因?yàn)槲覀儌魅雲(yún)?shù)的時(shí)候可以用單值變量,也可以用List變量,那么在Return Value的時(shí)候也是可以用單值變量和List變量的。
下面分別用一個(gè)例子來說明吧。
?
??? 1)單個(gè)單值變量返回
我把a(bǔ)rg1放到Return Value里了,因?yàn)槲彝ο肟纯词窍萊eturn還是先Teardown,不過我覺得應(yīng)該還是先Return,順便驗(yàn)證一下。
在case3里,我們用一個(gè)變量arg5獲取這個(gè)返回值,然后打印出來。其他的代碼都不動(dòng)。
運(yùn)行之后,我們看一下日志打印的效果。
看來還是我猜錯(cuò)了,是在Teardown之后才Return的,大家可以看到我標(biāo)記的地方,是先執(zhí)行了給arg1賦值111,然后又把這個(gè)arg1返回給了arg5,所以arg5的值也是111。我本來還以為應(yīng)該是444的,所以這里大家也要注意一下。
?
這種單個(gè)單值變量返回的是一種比較普遍的,后面幾種稍微少見一些,但是也比較有用處。
?
??? 2)多個(gè)單值變量返回
在設(shè)置返回值的時(shí)候可能大家已經(jīng)看到了,這里是支持多個(gè)變量返回的,也是用 | 分隔的。
????? 2.1)這里我們繼續(xù)改造,再增加一個(gè)變量的值返回。
?
同樣的,我們?cè)赾ase3那里也要做一下相應(yīng)的修改,當(dāng)然不修改也可以,這里就會(huì)比較自由了。我們先看看不改的。圖和上面的case3一樣,我們直接看執(zhí)行的結(jié)果。
雖然我們用的是${arg5},但是因?yàn)榉祷亓?個(gè)值,他自動(dòng)的轉(zhuǎn)換成了list(這也是下一篇我們會(huì)講的變量互換)。
?
????? 2.2)那么可能有人覺得這里返回的是list,我們最好用list變量來接收,那么我們把第一個(gè)${arg5}改成@{arg5},再運(yùn)行一下,看看結(jié)果
差別基本不大,只是在與${arg5}和@{arg5}的顯示不同。
?
????? 2.3)那么還有一個(gè)方式,因?yàn)槲覀冎烙?個(gè)返回值,所以可以用2個(gè)變量來獲取值。
接著運(yùn)行一下,看看日志
這樣可以直接使用對(duì)應(yīng)的變量了。
?
上面的3種方式前兩種差不多一樣,第三種是最好能知道返回值的個(gè)數(shù),這樣可以一一對(duì)應(yīng),如果不一樣怎么辦呢?
A:返回值個(gè)數(shù)大于取值變量個(gè)數(shù)。
實(shí)際上在2.1里已經(jīng)有了一個(gè)類似的,${arg5}會(huì)自動(dòng)轉(zhuǎn)為list。這是只有一個(gè)取值的變量,那么我們?cè)囋嚩鄠€(gè)的。
在case3里還是用2個(gè)變量取值,運(yùn)行一下看看結(jié)果。
他會(huì)先把第一個(gè)值給了arg5,然后把后面的值給了arg6,于是arg6變成了list變量。
所以可以得出結(jié)論,對(duì)于多個(gè)取值變量的個(gè)數(shù)少于返回值的個(gè)數(shù),他會(huì)先把前面的值一一對(duì)應(yīng)的給前面的取值變量賦值,這些變量仍然是單值變量,而最后一個(gè)變量會(huì)轉(zhuǎn)成list變量接收剩下的值。
?
B:返回值個(gè)數(shù)小于取值變量個(gè)數(shù)。
我們把return value改成只有一個(gè)${arg1},然后運(yùn)行一下,看看結(jié)果。
這種就會(huì)報(bào)錯(cuò)了,因?yàn)橹粋骰貋硪粋€(gè)值,而這里期待的是多個(gè)值,list-like的像list的變量。
?
因此,知道返回值的個(gè)數(shù)比較重要,如果不確定返回值的個(gè)數(shù),如同接下來的那種情況,最好使用list變量或單個(gè)變量來取值,避免出現(xiàn)返回值個(gè)數(shù)少于取值變量個(gè)數(shù)的情況。
?
??? 3)list變量返回
因?yàn)閘ist變量本身就是不確定有多少個(gè)成員,所以對(duì)于這種返回值,最好使用list變量或單個(gè)變量來取值(即2.1和2.2的用法)。那么返回值里返回1個(gè)list還是多個(gè)list都無所謂了,因?yàn)樗€會(huì)組裝成一個(gè)大的list。
稍微改造一個(gè)復(fù)雜的:
返回值里我們放了一個(gè)list變量加上一個(gè)單值變量再加上一個(gè)list變量,而在case3里的取值就用1個(gè)變量就可以了。
最后運(yùn)行一下,查看結(jié)果。
***微信掃一掃,關(guān)注“python測(cè)試開發(fā)圈”,了解更多測(cè)試教程!***
轉(zhuǎn)載于:https://www.cnblogs.com/guanfuchang/p/4051741.html
總結(jié)
以上是生活随笔為你收集整理的Robot Framework--06 用户关键字User Keyword的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java---数字排序
- 下一篇: A|B?
