跳到主要內容

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

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出來,我提供一種做法:

  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匯入使用。首先擷取一部分程式碼出來做說明: 
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是同一目錄)

Summary

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

留言

這個網誌中的熱門文章

PostgreSQL - Unattended installation on windows

Introduction 要將別人軟體包裝到自己軟體中,不可或缺的東西就是Unattended installation。以Unattended installation來說,我們可以選擇透過Installer的silent mode安裝,也可以透過把目標軟體做成portable的版本。本篇文章分享這兩種方法,教導大家如何將PostgreSQL透過Unattended installation方式安裝到目標系統成為service。 Note. 本篇以PostgreSQL 10.7為例。 Install with installer Tips 安裝程式或反安裝程式的參數,除了可以直接上官網搜尋Installation User Guide以外,也可以直接使用help參數查詢: postgresql- 10.7 - 2 -windows-x64.exe --help Windows安裝程式主要有EnterpriseDB與BigSQL兩種。BigSQL版本安裝元件是透過網路下載且支援參數不如EnterpriseDB版本多,以我們需求來說,我們傾向於使用EnterpriseDB版本。接下來分享給大家安裝與反安裝方法。 Installation @ echo off set INSTALL_DIR =C:\postgres10 set INSTALLER =postgresql- 10.7 - 2 -windows-x64.exe   rem options for installation set SSMDB_SERVICE =postgresql- 10 set MODE =--unattendedmodeui none --mode unattended   set DB_PASSWD =--superpassword postgres set DB_PORT =--serverport 5432   set SERVICE_NAME =--servicename % SSMDB_SERVICE %   set PREFIX =--prefix "%INSTALL_DIR%" set DATA_DIR =--datadir "%INSTALL_DIR%\data"   set OPTIONS =

How to install RIDE on Windows?

Introduction 多年沒在Windows上開發RobotFramework,趁著這次整理一下RIDE安裝方法。 目前RIDE最新版本與Python對應版本如下: (3.6 < python <= 3.11) Install current released version (2.0.8.1) with: pip install -U robotframework-ride 安裝Python 直接到Python官網找尋最新的3.11版本,我使用3.11.9: link 。安裝就是一直下一步而已。 安裝wxPython 每次安裝RIDE最困難的都是wxPython。看了一下 官網 描述,我就姑且相信一下: 接著進入下 載頁面 就有安裝教學。基本上就是到Python目錄下的Scripts直接執行以下command: pip install -U wxPython 安裝RIDE 接著就如RIDE官網所說,執行以下command: pip install -U robotframework-ride 啟動RIDE 直接在相同目錄下執行ride就可以啟動了,你也可以直接在桌面建ride連結,加快下次啟動時間。 沒想到這次這麼順利就安裝完成了。因為我是使用java去啟動robot framework,就不特別講要怎麼使用pip安裝robot framework了。

Hello World!

即將要搬家,因此舊網頁內容將慢慢轉移至Blogger。 如果要存取舊網頁,可以使用以下連結: https://wiki.tonylin.idv.tw/dokuwiki/doku.php