一次 Linux 桌面自動化測試工具的試用經歷分享

Shaw發表於2020-09-28

最近老闆提出桌面應用要上自動化測試,讓我研究研究。研究了一陣,這裡做一下分享。

我們公司是國產化平臺的軟體企業,主要做國產Linux系統平臺的產品。本公司產品主要是Qt做的,跨平臺地圖應用,也包括國產平臺,如銀河麒麟,搜了一下國內外軟體。國外有一家Squish能做,國內有CukeTest能做。但因為是國產化平臺,所以找了國內的這家。申請CukeTest試用版,看官方的說明是支援全平臺的自動化工具。今天分享一下試用心得。

背景介紹

公司環境主要是銀河麒麟、中標麒麟和Ubuntu。我試用電腦上裝了Ubuntu 18.04,環境裡面除了從apt安裝的預設qt4.8跟5.9,另外手動安裝了最新版的qt 5.15用於開發桌面應用。

安裝

申請了Linux完整版試用,拿到了CukeTest 1.5.14.deb安裝包,直接使用dpkg -i命令安裝上去,開啟了介面如下:

安裝介面

示例學習

初見

在歡迎介面右下角提供了幾個示例,但是一個個點開看過去都是Web跟API的示例,而我要的是Qt也就是桌面自動化的示例,似乎這裡還沒有提供。好在官網裡面提供了不少Linux平臺Qt測試的文件跟視訊,照著視訊教程裡面提供的示例程式碼,從github拷了一份到電腦準備跑一跑學習一下。

選擇了提供的Qt table的示例,看描述是針對表格應用的,恰好公司應用裡面也涉及到很多表格的正確性測試。示例專案內容如下:

table示例專案

專案的結構如下:

專案結構

因為沒看到專案檔案之類的可以直接關聯開啟專案的檔案,只有一個package.json檔案,檢查了一下里面是版權資訊跟模版之類的內容。所以直接從CukeTest介面開啟table示例所在的資料夾,開啟後如下所示:

開啟table示例專案

table示例主介面

試著點選一下工具欄上的執行按鈕,CukeTest就最小化進入執行狀態了,彈出一個應用,執行時似乎還有字幕顯示。因為很快就執行完了,總共跑了十幾秒,執行結束以後跳出了一個圖表,應該就是描述剛剛的執行情況了。

執行結果

仔細看了一下跟專案,至少我大概明白了這個軟體的測試方式,也就是它根據這一個個場景與步驟的定義來執行,如果步驟的執行有問題,就會呈現在這個報表上,好讓測試人員檢視。

步驟比對

模型管理器

接著看教程視訊,瞭解到這個軟體還有一個管理控制元件識別的模組,叫作模型管理器,用於把要操作的控制元件加進去以便進行自動化,而儲存這些控制元件資訊的檔案就叫作模型檔案,位於專案中的features/step_definitions/*.tmodel檔案中。雙擊該檔案開啟了模型管理器,如下:

模型管理器

第一次啟動的用模型管理器偵測控制元件時,我從CukeTest的安裝目錄下找到了被測的表格應用,就是Qt自帶的樣例Dock Widget。手動把它開啟了,但是卻出現了控制元件識別不到的問題: 識別應用中的控制元件沒有識別到。高亮模型管理器中已有的控制元件都不生效,會出現了錯誤1003: 無法找到匹配的應用:

識別與高亮失敗

接著看視訊,找到了問題的所在,是由於自動化的機制決定了要通過特殊的方式啟動被測應用,這裡我們通過模型管理器啟動一下這個表格應用,之後才能識別到。因為它會在被測應用中載入一個名為Qt Agent的服務。之後才看到這篇文件中有講解:啟動應用

完美解決了問題!識別跟高亮功能都能正常的運作,如下所示:

識別新的控制元件

並且在模型管理器左下角也出現了被測應用的資訊:

![應用資訊

接著在識別到的控制元件中控制元件操作標籤頁,看到了提供的一些自動化操作,而且工具看起來是針對不同的控制元件都有不一樣的操作方法,文件中也提供了這些操作方法的參考手冊物件操作API。下面是用工具提供的set方法修改單元格資料的結果:

修改單元格資料

好了,現在我覺得我已經部分掌握了自動化桌面軟體的基礎了,讓我開始來試試完整的自動化流程。

編寫自動化

補課

開啟主要的程式碼檔案definition1.js,剛瞭解了一下CucumberJS框架,所以這個程式碼也比較容易看懂,大致就是每個場景的步驟對應一個函式。裡面有好多async/await的關鍵字,之前瞭解Node.js的語法時好像沒看到這部分。為了看懂這些程式碼,我又把Node.js中的非同步呼叫一章看了一下,主要是Promise和async/await的用法,node果然很先進啊,async/await可以完成非同步呼叫,相當於是通過這種方式實現多執行緒的效果,這下漲經驗了。

指令碼介面

再次回去複習了視訊教程,發現裡面提到了,表格控制元件因為是複雜控制元件,CukeTest提供了額外的自動化方法來應對不同的自動化場景,這裡實際上只要再掌握一個getItem操作方法就可以應對了。

getItem操作方法能夠根據傳入的行列資訊獲取目標位置的單元格物件(類似Excel中定位單元格的方式),獲取到這個物件以後再去執行它的操作方法即可。更多內容可以檢視錶格的參考手冊

自己動手豐衣足食

看完視訊,腦子說:噢我會了,手說:你會了個啥?這大概是自己模仿視訊教程寫一個自動化專案的真實感受了。建立專案的第一步就栽了個跟頭,做到後面發現我這專案怎麼沒有.tmodel檔案呢?回頭看了下視訊發現沒改模版,選擇了Basic模版,又趕忙重新建了一個,選擇Qt模版。

注意選擇Qt模版

這回建立的味兒對了:

有tmodel了

接著是我自己寫的一個簡單的自動化流程,或者說自動化劇本,總體上是跟示例專案的結構一致的,自己只新建了一個hooks.js檔案。

我的自動化流程

hooks.js檔案

開始執行

在執行的過程中,因為表格比較長,其中一個步驟要執行很久(因為我在步驟裡面遍歷了整個表),以至於誤觸了超時時間。在hooks.js檔案中設定了超時時間為30秒,所以當執行某個步驟時超過了這個時間,就會觸發timeout的錯誤然後退出。按照文件超時裡的方法,把hooks.js檔案中設定的超時時間調為-1來禁用掉超時(雖然官方不建議這麼做)來完整的執行完自動化。

自動化的結果如下:

被測應用的執行結果

控制檯的輸出

執行結束後獲得了一個執行報告:

被測應用的執行結果

總結

這次的試用體驗總體來說還不錯,尤其是現在Linux平臺的自動化測試工具還沒有流行的軟體,CukeTest算是Linux平臺做桌面自動化測試的一種選擇。而且去了解了一下這個工具的背景,它其實一直都是支援全平臺的,但是桌面自動化這一塊原先是在Windows平臺耕耘了很久,在不久前才正式宣佈支援Linux平臺的Qt桌面自動化,但是從體驗上來說已經具有相當的成熟的機制跟體系了。在我用的國產軟體中算是不錯的水平,可以贊一下。後面如果再有些試用心得再跟大家分享。

相關文章