专栏文章 【Airtest】UI 自动化测试的数据分离实践

fishfish-yu · 2021年09月02日 · 最后由 fishfish-yu 回复于 2021年09月03日 · 2984 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

今天我们来聊一聊数据分离这个话题,如果我们在网上逛一圈,就很容易找到很多关于 Python 数据分离 相关的内容。

测试数据分离 常用于接口自动化测试和 UI 自动化测试中,有很多使用 Airtest 项目进行自动化测试的同学,也在积极思考该如何在 Airtest 项目中实现数据分离。

那么下文我们将以 1 个简单的示例,来看下我们可以如何在 Airtest 项目中实现数据分离:

1. 示例介绍

编写过 Poco 脚本的同学都知道,它的操作都是基于控件的。假设我们把需要操作的控件信息都存在 Excel 表格里面,那么我们的脚本只需要从 Excel 中读取到我们所需要的控件信息,然后对该控件进行操作即可。

如果控件信息发生了变化,我们也只需要定期维护 Excel 表格,而不需要处理我们的自动化脚本。

所以今天的示例大致是完成以下事情:

  • 把控件数据保存到指定的 Excel 表格里
  • 从 Excel 表格中读取控件信息待用
  • 处理表格读到的控件信息并实现控件操作

2. 读取 Excel 单元格里的数据

假设我们在 D:\demo\ 下保存了 1 个名为 NetEase_Cloud_Music.xls 的 Excel 表格,用于存储下述控件信息:

每行的内容代表着 1 个完整的控件信息,准备好表格后,我们就可以开始编写对应的脚本把这些控件信息读取出来了。

1)安装 xlrd 第三方库

Python 操作 Excel 表格,有一个专门的第三方库叫 xlrd 。我们需要在使用的 Python 环境中安装上该第三方库:

pip install xlrd

安装成功后,我们还可以使用 pip list 命令检查下。

这里我们还是使用 AirtestIDE 来编写脚本,在 IDE 的选项 -- 设置中,设置使用安装了 xlrd 库的 Python 环境:

此时在 .air 脚本中,我们就可以直接使用 import xlrd 来调用这个第三方库了。

2)读取表格数据存储到列表中
import xlrd

# 打开指定路径的Excel文件
ex = xlrd.open_workbook(r'D:\demo\NetEase_Cloud_Music.xls')
# 获取指定名称的sheet
sheet = ex.sheet_by_name('elements')

# 定义1个控列表,用于存放控件信息
dat = []  

# 遍历表格的每一行数据,将每行的控件信息构建成1个字典添加到列表中    
for row in range(sheet.nrows):  
    cells = sheet.row_values(row)  
    data={'element':cells[0],'attributes':cells[1],'position':cells[2]}
    dat.append(data) 

我们可以把列表的内容 print 出来看看我们获取的信息是否正确:

3)封装成读取控件信息的函数

为了方便使用,我们可以把这个读取表格数据这部分的内容封装成函数,最终返回我们想要的保存了控件信息的列表即可:

def get_excel():

    ex = xlrd.open_workbook(r'D:\demo\NetEase_Cloud_Music.xls')
    sheet = ex.sheet_by_name('elements')

    dat = []  

    for row in range(sheet.nrows):  
        cells = sheet.row_values(row)  
        data={'element':cells[0],'attributes':cells[1],'position':cells[2]}
        dat.append(data) 

    return dat

3. 处理控件信息并实现控件操作

拿到了我们需要的控件信息之后,我们预期的情况是,通过控件名称,匹配到对应的属性和定位脚本来实现控件操作:

def another_poco(list,element):
    for li in list:
        if li.get('element') == element:
            if li.get('attributes') == 'text':
                return poco(text=li.get('position'))
            elif li.get('attributes') == 'name':
                return poco(li.get('position'))

这里实现了 1 个函数,给它传入对应的列表(读取到的表格数据)和想要操作的控件名称,即可返回 poco 定位脚本,帮助我们实现后续的操作:

dat = get_excel()

start_app("com.netease.cloudmusic")
another_poco(dat,'每日推荐').click()
sleep(1.0)
another_poco(dat,'播放全部').click()
keyevent("BACK")
keyevent("BACK")
another_poco(dat,'每日推荐').wait_for_appearance()
another_poco(dat,'首页搜索').click()
text('张艺兴')
another_poco(dat,'单曲').wait_for_appearance()
another_poco(dat,'单曲').click()

小结

那么以上内容就是我们在 Airtest 项目上实现数据分离的 1 个小实践,希望可以给同学们提供一些简单的思路。

那在实际项目的应用过程中呢,还需要考虑更多的一些问题,比如控件重复的情况、控件数据量庞大的情况、控件数据分表保存的情况等等,这些就有待大家继续深入拓展实现了~


Airtest 官网https://airtest.netease.com/
Airtest 教程官网https://airtest.doc.io.netease.com/
搭建企业私有云服务https://airlab.163.com/b2b

官方答疑 Q 群:654700783

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

共收到 8 条回复 时间 点赞

excel 总感觉不太好;维护起来麻烦,git 提交冲突的话也不提示哪里冲突

对 airtest 很有好感,工作中也一直在用。
希望能看到新的优秀技术或思路,而不是历史倒退啊。

非常赞同 2 楼。

我是接入平台来管理元素的!对于 poco 的可以使用,但图像模式图片怎么识别 airtest 支持远程识别吗?搞的我每次先要下载下来

从来没觉得脚本和数据分离有什么好处,可维护性和可读性都非常糟糕

分离指的是测试脚本与测试数据,而不是测试脚本与控件信息。本文混淆概念了。

可以采用 PO 模式,对页面进行封装,用例调用页面封装的元素和操作,维护起来也比较方便

MarvinWu 回复

这位同学说的历史倒退具体指什么呢?有问题不如提个单给我们开发组看看:https://airtest.netease.com/issue_create

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册