前言
背景
探索在liunx 环境中的GUI自动化测试框架,以便用户在我们的平台上实现对自己项目的自动化测试。
实现目标
1、GUI自动化的所有组件必须是开源。
2、实现对GUI程序的自动启动关闭和操作。
3、模拟用户鼠标键盘操作。
4、能够对执行情况进行断言。
5、可以输出执行日志。
6、测试完成可以输出报告。
7、测试用例和数据分离。
8、模块化设计。
9、支持截屏和图片比对。
10、支持截图文字提取。
11、支持按屏幕坐标操作。
12、被测程序为linux程序。
技术栈
技术 | 版本和说明 | 对应目标 |
---|---|---|
Python | 建议3.7以上版本。 | 开源技术 |
Dogtail | 0.9.10 | 驱动GUI |
unittest | 跟随python版本 | 自动化测试框架 |
Logging | 跟随python版本 | 实现日志功能 |
Smtplib,email | 跟随python版本 | 实现邮件发送 |
Os | 跟随python版本 | 操作系统的相关命令执行 |
subprocess | 跟随python版本 | 操作系统命令执行的相关断言 |
pytesseract | 跟随python版本 | 支持截图的文字提取 |
imagehash | 跟随python版本 | 支持截图文件的比对 |
BeautifulReport | 测试用例执行报告 | 支持生成html的执行报告 |
A11y | Accessibility 可访问性技术 |
环境搭建(本文以ubuntu系统为例)
安装虚拟机环境(有操作系统环境的可跳过)
1)下载VMware player (免费使用,一次只能启动一个虚拟机。)
官方下载地址。https://www.vmware.com/
2)下载liunx镜像文件。可以到网上找,有很多,这次我下载了2个系统一个redhat 7,一个ubuntu2。在redhat7上我探索了基于python2的框架,在ubuntu上使用的python3框架。
3)安装虚拟机,打开VMware player 加载操作系统镜像文件进行安装,安装流程比较简单,注意要安装GUI界面系统,不要最小安装或服务器安装哈。
检查更新和安装yum 或 apt
1)以ubuntu为例。打开apt的源文件,sudo gedit /etc/apt/sources.list
2)修改源文件的源到阿里源。
3)sudo apt-get update 跟新源。如下图所示更新完成。
检查更新和安装python和pip
1)检查python版本,输入命令 python3. 如果低于3.7需要升级。
2)安装更高版本的python,我这里选择安装3.9。
a.安装前的必要软件
sudo apt install software-properties-common
b.将Deadsnakes PPA添加到系统的来源列表中
sudo add-apt-repository ppa:deadsnakes/ppa
c.安装python3.7
sudo apt install python3.7
d.去掉老版本的软链接
sudo rm /usr/bin/python3
e.添加新版本的软链接
sudo ln -s /usr/bin/python3.7 /usr/bin/python3
3)安装对应版本的pip
a.安装PIP3
sudo apt install python3-pip
b.安装setup工具
pip3 install -U setuptools
安装dogtail
a.安装支撑包
sudo apt-get install python3-pyatspi python3-pyqt5
b.安装dogtail包
sudu pip3 install dogtail
c.检查dogtail的安装是否正常
登录操作系统,输入sniff命令。
如果能打开AT-SPI 说明安装正常。
安装BeautifulReport
输入命令 sudo pip3 install BeautifulReport。
安装 imagehash
输入命令 sudo pip3 install imagehash
安装cnocr
输入命令sudo pip3 install cnocr -i https://pypi.tuna.tsinghua.edu.cn/simple–ignore-installed
PS:注意安装包较多,且较大,尽量使用国内源,否则下载速度慢,且可能中途断掉,更多本地源请查看 问题记录章节。
框架功能
AT-SPI
(1)查看桌面所有应用
(2)选择GUI的时候在桌面突出显示控件
Actions 下面的 highlight item 可以高亮显示你选中的控件,帮助你定位。
Dogtail
(1)启动应用
Dogtail可以直接通过进程启动应用。
首先导入 dogtail.utils 。通过run(‘应用名称’)启动应用。
可以先手动启动应用,在AT-SPI中查看应用名称。
(2)获取应用
导入dogtail.tree,通过root.application(appName=“应用名称”)获得被测应用句柄。
(3)获取应用中的控件
导入dogtail.tree,通过 节点对象.child(‘控件名称’, ‘角色名称’)获取对应控件。注意部分控件可能只有角色名称,控件名称为空,这里是可以传空字符的。
同一个角色名称的控件可能有多个,这种情况需要先找到最近的父控件,以父控件作为节点对象再找child。
Child返回的是节点树中获取的第一个控件。
(4)点击控件
导入dogtail.tree,通过 节点对象.click() 点击对象。注意dogtail.rawinput 下也有click 两个不一样,后者是通过坐标点击,前者是通过控件对象点击。
(5)在文本类型的控件中输入文字
导入dogtail.tree,通过 节点对象.typeText(‘文本内容’) 输入文字。输入的文字将会在AT-SPI 控件的 text标签显示,这里可以做文本检查。
(6)键盘操作,敲击键盘和组合键盘
使用键盘操作需要导入 rawinput 模块,支持单个按键和组合按键。
单个按键:
rawinput.pressKey(keyName)
keyName = {
‘enter’: ‘Return’,
‘esc’: ‘Escape’,
‘alt’: ‘Alt_L’,
‘control’: ‘Control_L’,
‘ctrl’: ‘Control_L’,
‘shift’: ‘Shift_L’,
‘del’: ‘Delete’,
‘ins’: ‘Insert’,
‘pageup’: ‘Page_Up’,
‘pagedown’: ‘Page_Down’,
’ ': ‘space’,
‘\t’: ‘Tab’,
‘\n’: ‘Return’
}
组合按键:
rawinput.keyCombo(comboString)
comboString组合按键,比如:
‘p’
‘PageUp’
‘q’
(7)检查控件文本
通过 节点对象.text 可以访问文本信息,并进行断言。
(8)屏幕截图
首先导入 dogtail.utils, 直接输入方法 screenshot(‘截图名称’)就可以截图。默认支持PNG,文件名自动带入时间戳。截图文件会放在tmp目录下。
(9)利用坐标点的屏幕操作
导入rawinput
click(x, y, button=1, check=True) #单击 坐标X,Y
doubleClick(x, y, button=1, check=True)#双击 坐标X,Y
press(x, y, button=1, check=True)#按下 坐标X,Y
release(x, y, button=1, check=True)#松开 坐标X,Y
PS:这里并不推荐使用坐标操作。
操作系统操作
引用包os,subprocess 可以执行操作系统命令,用于检查执行结果,比如:
#获取/home/guliangce 目录下的文件,并检查。
subprocess.Popen([“ls”, “/home/guliangce/”],stdout=subprocess.PIPE)
图片文字抽取
(1)在图片中抽取文字用作检查。
导入 from cnocr import CnOcr
加载图片资源 res = ocr.ocr(“20230410151552.png”)
Res 是列表,列表的每个值就是获取的文字片段,文字片段是用字典来描述的。
通过这种功能可以做屏幕输入或输出文字的断言。
图片对比
(1)检查两个图片是否一致。
需要导入
from PIL import Image,ImageFile
import imagehash
通过 Image.open(‘图片路径’)加载图片。
使用 imagehash.average_hash 向量化图片,对两个图片的hash进行比较,得出差异值,
通过这种方式可以对屏幕预期结果进行断言。(比如电路图是否一致?)
案例
项目目录结构
logs:用于存放日志的目录。
testreport:用于存放测试报告的目录。
auto_log.py: 打印日志的模块。
automain.py:自动化的主程序。
imagecomparison.py: 截图对比模块。
mail.py: 发送邮件的模块。
testdemo1.py: 一个测试用例的案例。
textfromimage.py: 获取截图中的文件。
demoimage1.png,demoimage2.png:用于做截图对比的两个案例。
测试用例介绍
(1)主程序 automain.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
这是gui自动化的主程序
"""
#加载unittest模块
import unittest
#加载dogtail
from dogtail.utils import *
#加载日志模块
import logging
from auto_log import *
#加载报告模块
from BeautifulReport import BeautifulReport as bf
#加载邮件模块
from mail import *
#定义全局变量
#日志保存目录
LOG_DIR = '/home/guliangce/auto_gui/logs/'
#测试名称(日志用)
TEST_NAME = 'liunx_auto_gui_test'
#报告名称
REPORT_NAME = '/home/guliangce/auto_gui/testreport/'
#报告发送地址
MAIL_ADD = 'guliangce@163.com'
if __name__ == '__main__':
write_log(LOG_DIR,TEST_NAME)
log = logging.getLogger()
#确定A11y是否可用
if not isA11yEnabled():
log