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