关于Android自动化测试

github地址:https://github.com/yanglikai0806/testool.git (如果对你有帮助,请给个小星星 star 一下)


一. 工具介绍

适用于Android app ui 自动化测试

无需连接usb,脱机执行自动化测试

测试用例需按照指定数据结构实现方可执行

app执行需要root权限,如果无法获取root权限需要pc连接usb后执行“adb tcpip 5555”后方可执行测试(手机重启后需重新开启5555端口)

需安装 testool.apk, atx-debug.apk, atx-androidTest.apk 三个应用并允许读写存储等权限

二. 配置文件

apk 安装完成后,首次启动apk会自动同步config.json文件(文件路径:/sdcard/autotest/config.json). 配置文件内容及功能如下:

{"APP": {"微信":"com.tencent.mm",},"TEST_ENV":"production",#测试环境"RETRY":2,#重试次数,表示case失败后的重试次数"CASE_TAG":"monitor",#用例标签,如例,代表执行case_tag为“monitor”的测试case"LOG":"true",#log开关,表示失败case是否抓取bugreprot"SCREENSHOT":"true",#截图开关,表示失败用例是否截图"ALARM_MSG":"false",#报警开关,表示是否发送报警短信"SCREEN_LOCK_PW":"0000",#锁屏密码,表示执行设备的解锁密码"OFFLINE":"false","CHECK_TYPE":1,#设置三种检测级别,0:fc&anr,1:界面检查,2:0&1"POST_RESULT":"true",#数据上传开关"MYSQL": {#数据库信息"url":"jdbc:mysql://your.mysql.ip/your_table?useUnicode=true&characterEncoding=UTF-8","user":"user_name","password":"your_pw"}  }

三. 用例格式

测试case以json文件的格式执行: 如:文件名 testDemon.json 文件,用例主要包括四个部分

id, case, check_point, skip_condition

[{"id":"set_alarm","case":{"app":"时钟","action":"设置闹钟","step":[{"text":"闹钟"}],"wait_time":[6]},"check_point":{"text":"08:00","resource-id":"android:id/checkbox","status": {"index":2,"checked":"false"},"activity":"","img": {"text":"text","language":"chi_sim"},"nd":""},"skip_condition": {"scope":"single","app": {"pkg":"com.xxx.xxx","version_code":[0,30400500]}    }  }]

1. "id"

主要标识测试用例,根据测试用例功能特点命名即可,主要用于报告展示,方便查找定位

2. "case"

case 是测试用例的主体,执行测试用例的核心部分。

"app"

类型 String,值 app名称,如“微信”。 会从config.json 中根据APP 配置的名称对应其package name。表示测试执行依赖此app,会判断其是否安装,未安装则跳过测试。

"case_tag"

类型 String, 值 标签名称,如 “monitor”。执行时会根据所选择的case_tag 过滤测试用例

"step"

类型 list, 值 dict, 如 [{"text":"天气"}], dict元素表示执行的操作,目前支持的字段如下

{"text":"string", "nex":0, "index":0) 根据界面元素text属性点击界面控件,"nex" 表示查找上下关系控件例如:1表示下一个元素,-1表示上一个元素,"index"当前界面有多个符合条件元素时,第几个元素。0均代表当前元素。"nex","index"缺省默认均为0。

{"id":"string"} 根据界面元素resource-id属性点击界面控件,"nex","index"用法同上。

{"content":"string"} 根据界面元素content-desc属性点击界面控件,"nex","index"用法同上。

{"class":"string"} 根据界面元素class属性点击界面控件,"nex","index"用法同上。

{"click": [x, y]} 根据x,y坐标点击操作。

{"swipe":[xs, ys, xe, ye, step]} 根据起始点 xs, ys 滑动界面到 xe,ye;step 为滑动步数,控制滑动快慢。

{"activity":"string"/list} 支持string/list两种数据类型,list内多个activity 会随机启动一个,实现方式为adb命令。

{"launchApp":"string"} 支持activity启动,支持package name 启动应用,Android方法实现。

{"kill":"string"} 根据应用package name 结束应用进程。

{"uninstall":"string"} 根据应用 package name 卸载应用。

{"notification":""} 无参数,下滑打开通知栏。

{"lock":""} 无参数,锁屏。

{"unlock":"string"} 根据锁屏密码解锁屏幕,参数为空则执行上滑解锁。

{"press":"string"} 根据参数执行按键操作,支持:home, recent, back, power, AIkey

{"wait":int} 等待,单位 秒。

{"shell":"string"} 执行shell命令。

{"wifi":"string"} on/off 开关wifi。

{"if": {}} 执行过程判断,参数与check_point 用法一致。通过"true","false" 字段执行相应操作【参考check_point用法】

其他字段均为描述性字段可缺省

3. check_point

check_point 对测试执行后的结果检测字段如下:

"text"

    {"text":[]} / {"text":"string"}

检测当前界面**(xml布局文件)**是否存在文本属性(text 、content-desc、recource-id...),list 元素之间为  的关系,元素中 "|" 分割 为  的关系,如{"text":["今天天气|空气","度"]}

"resource-id" / "id"

    {"resource-id":"string"}

是否存在某个控件id,与"text"实现方式相似,只支持string参数

"nd"

    {"nd": [ ]/ "string"}

与 "text" 用法一致,结果取反

"activity"

    {"activity":"string"}

检查当前activity,元素中 "|" 分割 为  的关系

"toast"

{"toast":"string"}

检查toast内容是否包含元素

"status"

{"status":{}} 检查某个元素的状态,"s_text", "s_id", "s_content", "nex", "index" 通过这几个元素定位要判断的元素,然后判断要检查的属性及其预期的值

例如:

    {"s_text":"开关", "s_id":"id/button", "nex":0, "index":1, "checked":"false“}

    表示定位id为id/button, text属性为”开关“ 的第二个元素,"check"属性是否为”false“

"delta" {"delta":{"path": "you/folder/", "file_re": "文件匹配的正则表达式", "cbt":0, "diff": 1}} 检测某路径下的文件增减情况 "cbt" 为 "count before test"

例如:

    "delta":{"path": "/sdcard/DCIM/Camera", "file_re": "IMG_\\d{8}_\\d{6}\\.jpg", "cbt":0, "diff": 1}

    表示测试后相机目录下新增1个jpg文件

"img"

    {"img":{"text":"string", "language":"chi_sim"}}

通过ocr识别当前界面是否存在目标文本,"language" 可缺省,默认为中文简体"chi_sim", 可支持英文"eng".

"logcat"

    {"logcat":"string"}

检测logcat中是否存在目标log。

"or"

    {"or":"true"}

"true" 表示对以上判断结果取 

"reverse"

    {"reverse":"true"}

"true" 表示对以上判断结果取 

check_point 中的执行操作字段如下:

"teardown" 执行消除测试影响的步骤,使用方法与 case 中的 "step" 字段一致

"true" 检测结果为true时,执行相关操作,使用方法与 case 中的 "step" 字段一致

"false" 检测结果为false时,执行相关操作,使用方法与 case 中的 "step" 字段一致

4. skip_condition

skip_condition 字段的用法继承了check_point 的用法,check_point的字段都是支持的。

"scope"

    "scope":"all/single"

表示跳过条件的影响范围,"all" 表示跳过条件成立时,json文件内当前case后面的所有case都会跳过,"single" 表示只跳过当前case

"app"

    "app": {"pkg": "com.android.camera", "version_name": "3.0", "version_code": [100, 300]}

判断 app的version name 或 version code 是否符合条件

"sim_card"

    "sim_card":"true/false"

判断设备是否有sim卡安装

"nfc"

    "nfc":"true/false"

判断是否支持nfc功能

"dev_white_lst"

设备白名单,参数为设备代号,例如:

    "dev_white_lst": ["mido"]

"dev_black_lst"

设备黑名单,用法同上

四. 使用方法

1. 将写好的testDemon.json文件存储到手机跟目录下/autotest/testcases/路径下,或者 点击左侧导航栏 “同步用例” 会自动同步目前自动化测试实现的测试case(需数据库配置正确)

2. 在工具左侧导航栏里选择“重新导入”,用例会显示在主界面,长按每个item会显示 用例详情。

3. 选中要执行的用例集合 点击 “开始” 测试开始执行,选择相应的测试环境,用例配置,case_tag 等参数

4. 测试完成后 点击导航栏 “日志报告” 可以查看测试报告

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342