从零开始:Airtest实现微信小程序自动化测试全流程(4)
今天离五一放假还有9天!!!虽然说还有9天,但是我已经迫不及待了嘻嘻。对了那天说完玉米的事我就买到水果玉米了,但是我昨天又买到糯玉米了!必须说出来嘛,那不管了,我今天再说一次^_^
言归正传言归正传,我是一个完全的自动化测试新手,正在一步一步地学习Airtest框架。接下来的文章我将记录我的入门过程,希望与大家分享我的探索经历。如果各位在阅读中发现任何问题或建议,请随时指出,我们共同进步。学习路上难免会遇到挑战,但每一次尝试都是成长的机会。
在进入测试之前我针对要测试的微信小程序写了一个思维导图,把主功能测试部分按点整理了出来,所以今天这篇文章我就第一个主功能——供应商查询(supplier)的第二部分——供应商筛选来进行脚本编写。
一、设计思路
1.进入供应商页面;
2.重置筛选条件;
3.根据测试用例选择:
3.1 仅按港口筛选;
3.2 仅按业务种类筛选;
3.3 按组合筛选(港口+业务种类)。
4.判断筛选结果:
4.1 是否有数据;
4.2 是否正确显示“无数据”。
(报告输出pass/fail/error,并截图记录)
二、代码编写
首先将后续需要识别的目标保存在字典中,易于维护与扩展。然后分模块(分函数)拆解流程:页面操作、筛选操作、测试用例执行、总调度。
(1)模块一:港口字典与业务种类字典(port_list、category_list)
这一部分我使用Python字典来保存对应港口和业务种类的名称与图像,方便后期直接调用,避免了重复写Template。因为港口名称过多,所以我采用抽样检测的形式,只截取了港口列表中前,偏前,中,偏后,最后五个港口名称。


(2)模块二(函数一):进入页面(enter_supplier_page)
滑动页面,点击小程序入口,点击供应商菜单。属于测试用例的前置条件。

(3)模块三(函数二):重置筛选(reset_filter)
由于每次测试用例执行前需要恢复初始状态,所以直接将重置封装成函数,方便后期直接调用。对于返回按钮与首页按钮我使用了一个if-else判断,这是因为在测试过程中进入的页面可能没有首页按钮,先判断一下,如果有直接按,如果没有先按返回按钮再按首页按钮,这样可以彻底重置恢复初始状态。

(4)模块四(函数三):选择港口(select_port)
1.点击“全部”按钮进入港口列表;
2.定义一个变量target接收传参来的港口名称;
3.定义循环次数:
3.1 pos存储判断是否存在目标港口的target;
3.2 如果存在(pos为1),直接点击港口查看对应供应商列表;
3.3 如果不存在(pos为0),循环执行滑动(swipe)直到找到对应目标港口的target。
4. 异常处理:如果没有找到目标港口,就自定义测试失败输出“未找到港口”。

(5)模块五(函数四):选择业务种类(select_category)
1.定义一个变量target接收传参来的业务种类名称;
2.w,h获取当前位置。
3.根据横向滑动的区域在屏幕中的位置来设定常量y_center。
(可以在【设置】中将【实时坐标显示打开】,这样鼠标下就会显示当前位置的坐标)
4.循环执行三次向右滑动,使业务种类菜单栏回到最顶部。
5.定义循环次数:
5.1 pos存储判断是否存在目标业务种类的target;
5.2 如果存在(pos为1),直接点击种类查看对应供应商列表;
5.3 如果不存在(pos为0),循环执行滑动(swipe)直到找到对应目标种类的target。
6. 异常处理:如果没有找到目标业务种类,就自定义测试失败输出“未找到分类”。
(这个函数中我没有使用图像识别滑动,而是使用了动态左右滑动的方式,这是因为在左右滑动的区域图像识别没有一个特定的点可以在循环中一直被识别并执行滑动操作,所以我直接捕获位置,根据坐标进行固定滑动)

(6)模块六(函数五):执行筛选(apply_filter)
统一调用筛选逻辑,分别执行只选港口、只选业务种类和组合筛选。将这一部分单独封装为函数是因为测试用例有很多条,如果写一条用例执行一个筛选函数,测试函数部分的代码将大大增加并且不易判断错误地方,这样写更有易于维护。
1.重置初始化;
2.如果传参来的只有港口port,则调用港口筛选函数;
3.如果传参来的只有业务种类category,则调用业务种类筛选函数;
4.如果传参来的两者都有,则一起调用。

(7)模块七(函数六):执行一个完整的测试用例(test_filter)
根据思维导图的正向逆向来写测试用例(正向表示按照功能需求执行后期望的结果,逆向表示不是预期期望的结果)。
1.调用执行筛选函数;
2.捕捉没有数据的页面显示的特定图像,将其定义为一个变量(no_data_img),并且用变量 has_no_data存储是否存在no_data_img,作为结果判定的依据。
3.初始化测试用例通过为False;
4.如果是期望无数据的情况(if):
4.1 无数据图像 has_no_data存在,则passed=ture,否则passed=false;
(这里使用了Python的三元表达式:结果1 if 条件 else 结果2。如果符合条件,则为结果1;不符合,则为条件2)
5.如果不是期望无数据的情况(else):
5.1 无数据图像 has_no_data不存在,则passed=ture,否则passed=false;
6.在日志中对于通过与未通过的输出与截图(snapshot)。
[snapshot]函数:这个函数中的msg表示日志中输出的信息,可以自定义内容。
7.异常处理:如果测试中任何一步出错,则返回逻辑不符合预期(fail)。(不要用error,这这个表示脚本执行出错,容易与测试结果搞混)

(8)模块八(函数七):总调度(run_all)
编写所有的测试用例,并执行所有写入的测试用例。
1.进入小程序供应商筛选页面;
2.定义一个列表变量存储结果数量;
3.港口测试用例(正向逆向);
4.业务种类用例(正向逆向);
5.组合情况用例(正向逆向);
6.最终测试结果通过数量统计。

三、问题总结
在这次编写脚本中遇到最核心的问题就是左右滑动无法执行,原因有两个:第一个是开始时我使用图像识别来滑动,但是由于选中的图像没有特殊性,导致识别总是错误,所以我用坐标滑动的方法来进行。第二个是左右滑动时选择业务种类错误的问题,这个问题是由于种类名称相似,容易找错,所以我修改了图片的识别度,在图片后面增加threshold=0.95,成功解决了这个问题。
今天写的脚本复杂了一丢丢,总结一下:通过图片模板识别 UI 元素完成页面操作,结合数据驱动设计(港口与业务种类字典)实现灵活筛选;在执行过程中引入多层条件判断与循环滑动查找机制,有效应对复杂页面状态与动态列表;同时构建了统一测试用例执行函数(test_filter)与总调度模块(run_all),实现测试流程标准化;并通过异常捕获、自动截图(snapshot)与日志记录(log)机制,提升问题定位效率;整体上增强了脚本的稳定性、可复用性与可维护性。
本篇文章先介绍这么多,待我下篇文章再继续奋斗!!!!!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)