基於圖片驅動的C/S架構自動化測試技術 - Sikuli

前言
針對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方法,還比較好用。
這裏提一下,圖片的名稱是支持中文的,如果待測的系統是中文的,用中文命名圖片的話,腳本里面調用中文圖片名稱,這樣代碼更容易讀懂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章