前几日,某项目上发现了一个严重问题,服务端统计该定制渠道的输入法键盘调起次数始终为0,接到消息后我是瞠目结舌、浑身冰冷、汗毛直立,想着是不是该收拾行李了!经过一番紧张的调查,发现原来该项目版本比较低,还没有增加该pingback……虚惊一场。
不过问题终究是存在的,如果开发同学改代码的时候不小心修改、删除了某些关键pingback的统计,后果还是很严重的。因此我们还是要验证pingback的,但pingback一共有2000多条,逐条验证代价太大,和同事商讨后决定将其列入自动化测试范围。
简述一下本次测试的思路:
1、搭建一台nginx+php的测试服务器,拦截pingback请求,将body信息保存在access.log中 ;
——目的是搭建出一个服务框架,方便以后其他类似需求的接入。
2、测试服务器添加一个接口,支持查询、删除access.log 中的相关信息;
——目的是支持客户端自动删除、查询log的能力。
3、通过unittest+uiautomator2编写自动化测试框架脚本;
4、根据产品提供的关键pingback编写测试集。
下面详细介绍一下过程:
测试服务器相关代码如下:(conf配置文件)
log_format sogou_main '$remote_addr [$time_local:$msec] "$request_method $request_uri&$request_body HTTP/1.0" "$http_referer" "$status"'; server{ listen 9999; server_name ping****back.com; client_max_body_size 30m; client_body_in_single_buffer on; client_body_buffer_size 1024k; fastcgi_buffers 4 1024k; access_log /search/odin/sogou_test/ping****back.log sogou_main; location /pingback/index { proxy_pass http://10.142.92.184/pingback/index; root html; } }
注意:
1、其中access.log的配置format中添加$request_body,用来记录post请求的body信息;
2、由于pingback的body过大,log默认只能保存1M的内容,因此需要添加client_max_body_size 30m 用来保存body信息;
3、该pingback为加密请求,需客户端解密后发出,但解密后的地址已失效,因此不做转发处理,直接在测试服务器创建index.php返回200即可。
//pingback/index.php <?php echo"ok"; ?>
服务端查询、删除接口文件及客户端脚本保存在云盘:
链接如下:
https://pan.baidu.com/s/1axwr4NHj3GuPzZEa9_VC-A
密码:iu5r
本次脚本主要使用单元测试框架unittest,以及uiautomator2来实现。
简单介绍下unittest框架
unittest单元测试框架主要由三部分组成:
1、setUp:
每条case执行前的预操作,相当于初始化过程,本次脚本中用来执行连接设备、清除服务器log等操作。
2、case部分:
可编写多个case,继初始化后的操作。
本次脚本中主要用来触发pingback动作,查询pingback结果与预期对比。
3、tearDown:
case结束的操作,用来给每条case收尾。
unittest的好处是每条case无论执行成功、失败,都不会影响下一条case的执行。
再聊一聊uiautomator2的一些方法
1、uiautomator2一个非常大的优点是支持了wifi连接,可以脱离数据线的束缚。
import uiautomator2 as u2 #通过wifi连接(ip地址) d = u2.connect('10.0.0.1') #通过数据线连接(device_id) d = u2.connect('8e67d6d6')
2、添加等待事件的点击操作,解决界面加载速度慢,需要强制time.sleep的操作。
import uiautomator2 as u2 #监听界面,若5S内界面出现指定元素,则执行点击操作,若超时则返回错误。 d(resourceId="com.android.mms:id/fab").click(timeout=5)
3、获取控件信息,由于输入法是一个整体view,不支持元素拆分,因此可以通过获取输入框高度变化,来判定输入法的某些功能是否被触发。
import uiautomator2 as u2 #获取当前元素相关信息,这里为获取高度坐标。 h = d(className ="com.android.mms:id/fab").info["bounds"]["top"]
4、可以支持中文输入,不再局限于只能输入英文。
import uiautomator2 as u2 #通过FastInputIME输入法来实现中文的输入和清除 #切换成FastInputIme输入法 d.set_fastinput_ime(True) d.send_keys(“你好123abcEFG ”) d.clear_text() #切换成正常输入法 d.set_fastinput_ime(False)
5、支持截屏,并保存在PC端。
import uiautomator2 as u2 #截屏,并保存在PC端指定文件夹内,支持png和jpg image = d.screenshot() image.save("Dhome.jpg")
6、其他如点击、滑动、执行硬键盘操作等大部分与uiautomator相似,感兴趣的朋友可以参考官方网站翻译版网站:
http://www.cnblogs.com/jec1999/p/8976044.html。
以上就是本次分享的全部内容了,祝愿大家能够合理的利用自动化方法来解决工作中的复杂难题。