Introduction
寫robot一段時間後,發現到它所提供的libraries並無法滿足我的所有需求。像之前曾經為了比較不同資料庫table name,因為大小寫不同但我又不想因此去實作兩份程式碼,很可惜找不到基本的upper與lower case的字串轉換API,只好透過robot寫for loop去做轉換。但使用Java去實作怎麼樣都比我用robot實作快吧?而且Java的String物件不就有提供這樣的功能了嗎?之前有另一個需求是要送keyboard或mouse event到螢幕上以完成某些操作,當時是透過java robot api並包成外部程式去完成這些需求。好加在RobotFramework提供擴充TestingLibraries的功能,讓你依照自己需求去實作TestingLibraries,讓測試可以更為方便,畢竟它無法提供各種的Libraries供你使用。首先我帶給大家的是: 使用既有的Libraries或API來當做Keyword使用:
使用既有的Java Libraries
如果要達到toLowerCase的效果,又不想另外多做library出來,我提供一種做法:
- 新增Library: java.lang.String到testsuite中,其參數為NARUTO。
- 新增測試用的testcase:
這樣確實可以讓${result}顯示出naruto,但會有什麼問題呢? 你必須要在import library時就給定要轉換的字串,假如要使用多次的話不就ㄘㄨㄚˋ賽了嗎? 而且還有一個條件是: 它必須要有public無參數的建構子。如果要把自己的Util放進來使用,必須要確認一下建構子,而傳入與回傳型態都要是基本型態與其boxing的物件。
在先前的(文章)中,曾教過大家透過awt送mouse和keyboard event給待測程式。先前必須額外寫batch file,好讓robot framework使用Run去呼叫它。現在教你如何將它當test library匯入使用。首先擷取一部分程式碼出來做說明:
package org.tonylin.HotKeySender; import java.lang.reflect.*; import java.awt.Robot; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; public class HotKeyUtil { public static void pressKey(String keys[]) throws Exception { Robot robot = new Robot(); Class<?> cl = KeyEvent.class; int [] intKeys = new int [keys.length]; for (int i = 0; i < keys.length; i++) { Field field = cl.getDeclaredField(keys[i]); intKeys[i] = field.getInt(field); robot.keyPress(intKeys[i]); } } public static void releaseKey(String keys[]) throws Exception { Robot robot = new Robot(); Class<?> cl = KeyEvent.class; int [] intKeys = new int [keys.length]; for (int i = keys.length - 1; i >= 0; i--) { Field field = cl.getDeclaredField(keys[i]); intKeys[i] = field.getInt(field); robot.keyRelease(intKeys[i]); } } }
上面的程式碼是透過awt robot做key press和release的動作。假如我想做Alt+Tab的動作,首先要送出Press Alt,接著是Press Tab、Release Tab數次,最後Release Alt。RobotFramework上該如何做?
- 將package+class名稱加入Libraty Path
- 寫testcases試驗看看
- 加入classpath到啟動測試script,任何要在robotframework中import的test libraries都要記得加為-P的argument value。
#!/bin/sh FULLPATH=`dirname "$0"`/`basename "$0"` SHPATH=`readlink -f "$FULLPATH"` BASEPATH=`dirname "$SHPATH"` java -jar "$BASEPATH/robotframework.jar" -P HotKeySender.jar "$@"
完成後,可以執行這個測是案例看看是否有執行Alt+Tab的動作。(在Download的Source code中的runtest.sh所預期的robotframework.jar是同一目錄)
Summary
直接使用現有的Library或API做為Keyword的優點,是你不需要另外去實作又能享受到它提供的功能。因為這是直接使用現成的東西,並非替Robot量身打造,也可能因此喪失了RobotFramework的document、debug、物件生命週期等功能與特性。而能不能當keyowrd使用還要看Library/API的設定,如果它是一個singleton又將constructor定為private,會導致RobotFramework無法透過reflection產生instance。
我認為使否要用現成還是自己實作新的,要看個人需求。在之後的文章會教大家如何去寫一個真正的RobotFramework Test Library。
留言
張貼留言