How to implement a test library by java? (1) - Use existing libraies

寫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使用:

如果要達到toLowerCase的效果,又不想另外多做library出來,我提供一種做法:

  1. 新增Library: java.lang.String到testsuite中,其參數為NARUTO。
  2. 新增測試用的testcase:


這樣確實可以讓${result}顯示出naruto,但會有什麼問題呢? 你必須要在import library時就給定要轉換的字串,假如要使用多次的話不就ㄘㄨㄚˋ賽了嗎? 而且還有一個條件是: 它必須要有public無參數的建構子。如果要把自己的Util放進來使用,必須要確認一下建構子,而傳入與回傳型態都要是基本型態與其boxing的物件。
在先前的(文章)中,曾教過大家透過awt送mouse和keyboard event給待測程式。先前必須額外寫batch file,好讓robot framework使用Run去呼叫它。現在教你如何將它當test library匯入使用。首先擷取一部分程式碼出來做說明: Download Source Code

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上該如何做?

  1. 將package+class名稱加入Libraty Path
  2. 寫testcases試驗看看
  3. 加入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是同一目錄)

直接使用現有的Library或API做為Keyword的優點,是你不需要另外去實作又能享受到它提供的功能。因為這是直接使用現成的東西,並非替Robot量身打造,也可能因此喪失了RobotFramework的document、debug、物件生命週期等功能與特性。而能不能當keyowrd使用還要看Library/API的設定,如果它是一個singleton又將constructor定為private,會導致RobotFramework無法透過reflection產生instance。
我認為使否要用現成還是自己實作新的,要看個人需求。在之後的文章會教大家如何去寫一個真正的RobotFramework Test Library。

友藏內心的獨白: 用這個方法就能解決很多需求了,還需要另外做?