pingback自动化测试(uiautomator2+nginx)

前几日,某项目上发现了一个严重问题,服务端统计该定制渠道的输入法键盘调起次数始终为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。

以上就是本次分享的全部内容了,祝愿大家能够合理的利用自动化方法来解决工作中的复杂难题。



留言