利用 dogtail 快速進(jìn)行 GUI 自動(dòng)化測試

最近在協(xié)助測試小組做一些 GUI 方面的自動(dòng)化測試,主要使用了 Python 中的 dogtail 框架,以及 Qt 中的 Accessibility 技術(shù)。
這個(gè)東西很有意思,可以讓 GUI 的測試變得很方便,比如:模擬鼠標(biāo)點(diǎn)擊、用戶輸入等。因此在這里分享一下,希望能幫到大家!
1
概念描述
dogtail 是一個(gè)用 Python 編寫的 GUI 自動(dòng)化測試框架,它使用 Accessibility(a11y)技術(shù)與桌面應(yīng)用程序通信。
dogtail 腳本是用 Python 編寫的,并能夠像其他 Python 程序一樣執(zhí)行。
在 dogtail 的發(fā)行包中,自帶了一個(gè) sniff 組件(嗅探器),該組件在 GUI 程序追蹤方面非常有用。
打開終端,執(zhí)行 sniff 命令,會(huì)彈出一個(gè) AT-SPI Browser 界面,里面包含了所有正在運(yùn)行的程序。值得一提的是,這些程序是以 tree 的形式顯示的。因此在 sniff 程序里面,根據(jù)顯示便能夠很容易地查看所要調(diào)試程序的 layout。
既然 dogtail 利用 Accessibility 技術(shù)與桌面程序通信,那么想自動(dòng)化測試 Qt 程序,就必須啟用 Qt Accessibility。
Qt 中的 Accessibility 支持包含了一個(gè)通用接口,該接口對(duì)每種平臺(tái)實(shí)現(xiàn)了一項(xiàng)技術(shù):Windows 上的 MSAA、Mac 上的 Mac OS X accessibility,以及 Linux 上的 Unix/X11 AT-SPI。Qt 的 Accessibility 接口嚴(yán)格遵循 MSAA 標(biāo)準(zhǔn)。那么,什么是 MSAA 呢?
MSAA 全稱為 Microsoft Active Accessibility,其初衷是為了方便殘疾人士使用電腦 - 可用于放大器、屏幕閱讀器,以及觸覺型鼠標(biāo)。比如盲人看不到窗口,但是他可以通過一個(gè) USB 讀屏器連接到電腦上,讀屏器通過 UI 程序暴露出來的這個(gè) Interface,就可以獲取程序信息,通過盲文或者其它形式傳遞給盲人。
MSAA 的主要思想是提供一種以程序方式訪問 UI 元素信息或操作這些 UI 元素的功能。支持這種功能的 UI 元素是可訪問的。在大多數(shù)情況下,這意味著一個(gè) UI 元素支持 IAccessible 接口。你也可以說在 MSAA 的世界里,一個(gè)可訪問的 UI 元素可表示為 IAccessible 接口。
2
環(huán)境安裝
要使用 dogtail,首先要安裝依賴:
$?sudo?apt-get?install?python3-pyatspi?python3-pyqt5
下載 dogtail 源碼(地址:https://gitlab.com/dogtail/dogtail/),并進(jìn)行安裝:
$?sudo?python3?setup.py?install
3
測試腳本
為了實(shí)現(xiàn)自動(dòng)化測試,先用 Qt 編寫一個(gè)簡單的示例程序 - Sample01。
顯示一個(gè) button,并連接它的 clicked() 信號(hào),當(dāng)鼠標(biāo)被點(diǎn)擊之后,文本發(fā)生改變:
#include?
#include?
int?main(int?argc,?char?*argv[])
{
????QApplication?a(argc,?argv);
????QPushButton?button("test");
????//?每點(diǎn)擊一次,文本就會(huì)發(fā)生變化
????QObject::connect(&button,?&QPushButton::clicked,?[&]()?{
????????static?int?index?=?0;
????????index++;
????????button.setText(QString("click?%1").arg(index));
????});
????//?將被輔助技術(shù)識(shí)別
????button.setAccessibleName("button");
????button.setAccessibleDescription("this?is?a?simple?button");
????//?設(shè)置大小并顯示
????button.resize(300,?200);
????button.show();
????return?a.exec();
}
現(xiàn)在編寫 Python 腳本 - autotest.py,模擬鼠標(biāo)點(diǎn)擊程序中的按鈕:
#!/usr/bin/env?python3
#?-*-?coding:?utf-8?-*-
from?dogtail.tree?import?*
import?time
#?獲取應(yīng)用程序(根據(jù)程序名稱查找)
app?=?root.application(appName="Sample01",?description="/home/waleon/workspace/demos/build-Samples-unknown-Debug/Sample01/Sample01")
#?獲取按鈕(根據(jù)?accessibleName?遞歸查找)
button?=?app.child('button')
#?模擬鼠標(biāo)點(diǎn)擊
for?i?in?range(3):
????button.click()
????sleep(1)
4
執(zhí)行自動(dòng)化
運(yùn)行上述的示例程序,然后執(zhí)行 sniff 命令,可以查看 Sample01 的標(biāo)記:
$?sniff

運(yùn)行 Python 腳本,執(zhí)行自動(dòng)化測試:
$?python3?autotest.py

恭喜,這時(shí)候你就能看到鼠標(biāo)被自動(dòng)點(diǎn)擊了。
后面還有更多有意思的功能,比如模擬鍵盤輸入、自動(dòng)生成測試報(bào)告等,敬請(qǐng)期待!
5
更多參考
dogtail 源碼:https://gitlab.com/dogtail/dogtail/
dogtail api:http://fedorapeople.org/~vhumpa/dogtail/epydoc/
dogtail 教程:https://wiki.ubuntu.com/Testing/Automation/DogtailTutorial
輔助功能在 GNOME 中如何工作:https://developer.gnome.org/accessibility-devel-guide/stable/gad-how-it-works.html.zh_CN
·END·
?
點(diǎn)個(gè)在看,么么噠!

