Robot Framework--06 用戶關鍵字User Keyword


轉自:http://blog.csdn.net/tulituqi/article/details/7906130

 

在我們做自動化案例的時候,用的最多的主要是用戶關鍵字。說到關鍵字,大體上可以分為測試庫關鍵字(或叫系統關鍵字)和用戶關鍵字,前者一般都是通過加載Library得到的,而用戶關鍵字一般都是通過加載Resouce得到的。

以之前的這個case為例:

圖中的Import Variables和log都是測試庫關鍵字,而搜索測試這個就是用戶關鍵字,只要RIDE的版本高一些,就能看出他們的顏色是有區別的。

 

接下來,我們新建一個案例,並針對用戶關鍵字的用法進行介紹。

1、先新建一個用戶關鍵字,不用帶arguments。

在Setting下面的這些呢,Documentation就不多說了。主要看下面4個設置,其實前面的文章里也簡單介紹過,這里再說一下。

Arguments: 設置傳入參數

Teardown: 設置完成時的動作,比如寫上Close All Browsers,表示在這個用戶關鍵字執行完成之后會執行什么關鍵字。

Timeout: 設置超時時間,如寫上1min,表示1分鍾超時,如果這個關鍵字執行超過1分鍾則認為失敗。

Return Value: 設置返回值

 

一直以來我都覺得用戶關鍵字就像一個函數一樣,有傳入參數Arguments,有返回值Return Value,而且還可以用Teardown作為函數完成后的清理動作。

所以我們也要像函數一樣來使用User Keyword。

 

2、傳入參數Arguments

前面在做案例分層的時候其實已經用到了一些參數設置了,可以看看前面2篇文章。這里提一下多參數及可選參數的設置。

 

    0)變量類型

順帶提一下變量的類型,RF里的變量分兩種,一種是Scalar,可以理解為單值變量,一種是List Variable,list型變量,或者可以理解為數組變量。Scalar型變量用$符號開頭,List型變量用@符號開頭。這里只是簡單介紹,后面會專門寫一篇兩種變量關系的。

 

    1)必填參數

給我們的關鍵字先添加4個參數,參數之間使用 |  進行分隔。(如果想在默認值里使用 | 作為一個值而不是分隔符,那么就要使用 \| 來表示|的值。

 

如果是這樣添加參數呢,表示這些參數都是必填的,我們建一個case3,並調用關鍵字測試看一下,這里的關鍵字測試后面的4個格子都是紅色,提示參數必填。

 

    2)選填參數

假設我們想把其中第2個參數設成選填參數,選填參數就是給參數加上默認值,默認值使用 =  加上值,如果想默認為空,只寫等號就行了。

(默認值的意思不需要細講了哈,就是如果你在調用這個關鍵字的時候,如果不給這個選填參數傳值,那么就使用默認值作為參數的值)

如果我們直接這樣加的話,點擊OK就會報錯。意思是說必填參數不允許在選填參數后面。

也就是說如果某一個參數設置成了選填參數,那么他后面的參數都必須是選填參數,不能是必填參數。

在我們這里就是第2個參數如果要可選,要么把3、4參數也都設置上默認值,要么就把第2個參數調整到最后去。我先調整成下面這樣,就不會報錯了。

 

    3)List變量參數

List變量也是可以作為參數,但是List變量只能放在最后一位。如果放在前面,就會報錯。

我把arg4改成了@{arg4}這樣的List變量,保存時就會提示List變量只能作為最后一個參數。

為啥只能是最后一個呢?從英文的角度看是the last argument,沒有s。。。。得意

如果一定要試試最后2個都放list變量呢,也是會報錯的。

 

這是為什么呢?首先,List變量本來來說,他是一個可變的,即List的成員數量不確定。而List作為參數的話,有幾個成員就是相當於幾個單值參數,他實際上是提供了一種參數個數可變的方式。那么既然可變,如果放在前面的話(見第一個例子的圖),他就沒法確定傳入的參數到底哪些是給arg4的,哪個是給arg2的了;同理,如果放2個List也是不行的(見第二個例子的圖),因為也是無法區分傳入的參數到底哪些是給arg4,哪些是給arg2。

而且2個可變和1個可變沒什么差別滴,所以最終限定是只能有1個List參數,並且必須放在最后

 

注意一下:變量名和等號間不能有空格,如果有空格系統會報參數語法錯誤

 

最后看一下List參數的實例,其他幾種實例應該沒什么復雜的,大家自己練習一下即可。

為了看的方便,我把參數數量減少點,只放2個參數,${arg1} | @{arg2},然后用了個Fail,目的是想把值打印在運行界面上。

 

然后我們在case3里給他傳幾個值。

我特意把關鍵字的說明也截圖下來,大家可以看到agr2前面有個*,表示他可以接受任意個參數,Python里其實也是這樣處理多參數的。

運行一下案例,看一下打印出來的內容。

 

繼續介紹User Keyword里面的Teardown和Return Value的內容

 

3、Teardown測試完成回收清理

如果有用過Junit的朋友應該記得Junit的案例一般都是有一個Setup、一個Test、一個Teardown的,同樣我們的TestCase也是有這2個的,大家可以自己看一下case的Setting。

那么這個User Keyword的Teardown,作用都是差不多的,如果是Case的Teardown,那么是案例結束的時候做回收清理;而User Keyword的Teardown就是用在調用User Keyword完成之后才會做的數據回收清理。

當然,用於什么可以根據你自己的需求自己調整,並不一定是數據回收清理,是系統關鍵字或者用戶關鍵字都可以。總之可以理解為關鍵字完成后還要調一個關鍵字。參數要用 | 分隔。

我這里改造一下上一篇寫的關鍵字測試,以便於演示Teardown的作用。

改完的效果是先把arg1的值賦給temp,然后把arg2的列表第三項值賦給arg1(這里算個小bug,如果傳的參數少於3個就會報錯了,這里只是演示,請忽略),然后log打印出arg1和arg2的值。

在Teardown這里我使用了Set Suite Variable方法,把temp的值覆蓋arg1,並把arg1設為Suite級別的變量,然后我再case3里調用完關鍵字測試后又用log打印出arg1的值。(也可以用Set Global Variable,如果不用這2個的話,在case3里是找不到arg1這個變量的)

 

接着我們執行一下案例,看看報告。

如上面所說,首先把arg1的值111賦給了temp,然后又把arg2的第3個值444賦給了arg1,最后再把temp的值賦給arg1。

我這個就算是一種清理吧,讓參數的值在關鍵字內部發生變化,在Teardown的時候把他的值恢復回來。

 

Teardown這里只能寫一行語句,如果你要執行多行語句的話,那最好是再專門寫一個關鍵字,然后在Teardown這里調用這個新增的關鍵字。

 

4、Return Value返回值

這個應該不用怎么解釋了,只是說說用法,因為我們傳入參數的時候可以用單值變量,也可以用List變量,那么在Return Value的時候也是可以用單值變量和List變量的。

下面分別用一個例子來說明吧。

 

    1)單個單值變量返回

我把arg1放到Return Value里了,因為我挺想看看是先Return還是先Teardown,不過我覺得應該還是先Return,順便驗證一下。

在case3里,我們用一個變量arg5獲取這個返回值,然后打印出來。其他的代碼都不動。

運行之后,我們看一下日志打印的效果。

看來還是我猜錯了,是在Teardown之后才Return的,大家可以看到我標記的地方,是先執行了給arg1賦值111,然后又把這個arg1返回給了arg5,所以arg5的值也是111。我本來還以為應該是444的,所以這里大家也要注意一下。

 

這種單個單值變量返回的是一種比較普遍的,后面幾種稍微少見一些,但是也比較有用處。

 

    2)多個單值變量返回

在設置返回值的時候可能大家已經看到了,這里是支持多個變量返回的,也是用 | 分隔的。

      2.1)這里我們繼續改造,再增加一個變量的值返回。

 

同樣的,我們在case3那里也要做一下相應的修改,當然不修改也可以,這里就會比較自由了。我們先看看不改的。圖和上面的case3一樣,我們直接看執行的結果。

雖然我們用的是${arg5},但是因為返回了2個值,他自動的轉換成了list(這也是下一篇我們會講的變量互換)。

 

      2.2)那么可能有人覺得這里返回的是list,我們最好用list變量來接收,那么我們把第一個${arg5}改成@{arg5},再運行一下,看看結果

差別基本不大,只是在與${arg5}和@{arg5}的顯示不同。

 

      2.3)那么還有一個方式,因為我們知道有2個返回值,所以可以用2個變量來獲取值。

接着運行一下,看看日志

這樣可以直接使用對應的變量了。

 

上面的3種方式前兩種差不多一樣,第三種是最好能知道返回值的個數,這樣可以一一對應,如果不一樣怎么辦呢?

A:返回值個數大於取值變量個數。

實際上在2.1里已經有了一個類似的,${arg5}會自動轉為list。這是只有一個取值的變量,那么我們試試多個的。

在case3里還是用2個變量取值,運行一下看看結果。

他會先把第一個值給了arg5,然后把后面的值給了arg6,於是arg6變成了list變量。

所以可以得出結論,對於多個取值變量的個數少於返回值的個數,他會先把前面的值一一對應的給前面的取值變量賦值,這些變量仍然是單值變量,而最后一個變量會轉成list變量接收剩下的值。

 

B:返回值個數小於取值變量個數。

我們把return value改成只有一個${arg1},然后運行一下,看看結果。

這種就會報錯了,因為只傳回來一個值,而這里期待的是多個值,list-like的像list的變量。

 

因此,知道返回值的個數比較重要,如果不確定返回值的個數,如同接下來的那種情況,最好使用list變量或單個變量來取值,避免出現返回值個數少於取值變量個數的情況。

 

    3)list變量返回

因為list變量本身就是不確定有多少個成員,所以對於這種返回值,最好使用list變量或單個變量來取值(即2.1和2.2的用法)。那么返回值里返回1個list還是多個list都無所謂了,因為他還會組裝成一個大的list。

稍微改造一個復雜的:

返回值里我們放了一個list變量加上一個單值變量再加上一個list變量,而在case3里的取值就用1個變量就可以了。

最后運行一下,查看結果。


***微信掃一掃,關注“python測試開發圈”,了解更多測試教程!***


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM