前言
針對C/S架構的項目做自動化測試,我們可能最先考慮的是引入惠普的QTP工具,軟件上的每一個空間都可以識別成唯一的元素定位,對這些元素按照測試用例進行操作,實現開發自動化測試腳本的目的。而對於非傳統的C/S架構的軟件系統,比如C/S中嵌入了B/S,這時QTP就可能沒有辦法識別B/S大空間內部的元素,只能把整個B/S的空間作爲一個元素識別出來,這樣我們就沒辦法來操作B/S內部的元素,當然,QTP也是支持座標的,但是做過的人可能都知道,這種方式其實並不穩定,而檢查點也會變得比較牽強,這個時候就引入了一個Java的第三方jar包:Sikuli。
原理
Sikuli的原理很簡單,把屏幕上的片段截圖作爲元素,以這些圖片作爲操作對象來完成C/S的自動化測試,同樣以圖片爲元素作爲驗證點。
優點
優點的話可能就是突破了上面說的QTP有些空間的內部元素無法識別的一個瓶頸,當然,這種方式同樣可以應用在Web的自動化測試中。
缺點
就我在項目中的使用過程,發現的缺點有三個:
1、需要大量的截圖(這裏其實可以從開發那邊拿到一些控件的圖片,會更精準一點)
2、當前屏幕上有兩個相同的截圖吻合,Sikuli無法判斷究竟是操作哪個元素
3、Sikuli驅動鍵盤和鼠標去操作圖片元素,在屏幕上可以看到鼠標移動的軌跡,在執行自動化的時候鼠標和鍵盤不可以動,這也就使得調試就會有點麻煩了。慶幸的是,Sikuli的API很簡單,在調試上也不會造成太多的麻煩。
引入Sikuli的jar包
如果自動化框架是用Maven來管理第三方jar包的話,在pom.xml文件中加入下面的代碼即可:
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixapi</artifactId>
<version>1.1.0</version>
</dependency>
如果是手工導入的話,可以在官網去下載 http://www.sikuli.org/
包的全名爲sikulixapi-1.1.0.jar
private Screen s = new Screen();
private String root;
private String path;
// 獲取圖片路徑
public PCFramework(String module) {
root = Thread.currentThread().getContextClassLoader().getResource(".").getPath();
path = root.replace("target/test-classes/", "src/test/resources/data/imgs/" + module + "/");
GeneralMethods.log(">==================================================<");
try {
ITestResult it = Reporter.getCurrentTestResult();
GeneralMethods.log("Now Starting: " + it.getTestClass().getName());
} catch (Exception e) {
}
}
Screen是sikuli開放主要API功能的類,定義一個screen的對象即可調用所有的操作,包括點擊,雙擊,右鍵點擊,移動到指定位置,輸入文本等操作。
構造函數的功能主要是爲了指定截圖的路徑,傳入module參數以區別截圖下面的不同文件夾,按功能把截圖放到指定的路徑下面。
// 點擊圖片
public void click(String imgName) {
try {
GeneralMethods.log("Click on 【" + imgName + "】");
wait(imgName);
s.click(fullPath(imgName));
} catch (Exception e) {
throw new RuntimeException("Cannot find the img file: " + imgName);
}
}
// 雙擊圖片
public void doubleClick(String imgName) {
try {
GeneralMethods.log("Double click on 【" + imgName + "】");
wait(imgName);
s.doubleClick(fullPath(imgName));
} catch (Exception e) {
throw new RuntimeException("Cannot find the img file: " + imgName);
}
}
// 右鍵點擊
public void rightClick(String imgName) {
try {
GeneralMethods.log("Right click on 【" + imgName + "】");
wait(imgName);
s.rightClick(fullPath(imgName));
} catch (Exception e) {
throw new RuntimeException("Cannot find the img file: " + imgName);
}
}
以上是一些基本的點擊操作,其它的可以按這個套路來,可以看到封裝了一個wait的方法,其實跟webdriver等待頁面元素加載完成再操作元素的原理是一樣的,可以按自己的需求來封裝,每個方法調用一次wait,在wait方法中加入截屏的方法,腳本運行失敗後可以通過截屏來判斷是哪一步出現了問題。其實sikuli自帶有一個截屏的方法,不過看起來不是很好用,就另外封裝了一個,用的是Robot類下面的createScreenCapture方法,還比較好用。
這裏提一下,圖片的名稱是支持中文的,如果待測的系統是中文的,用中文命名圖片的話,腳本里面調用中文圖片名稱,這樣代碼更容易讀懂。