Android UI自動化測試(脫機,無需root)


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).
配置文件內容及功能如下:
```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


```json
[{"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"__
設備黑名單,用法同上

四. 使用方法
---
* 將寫好的testDemon.json文件存儲到手機跟目錄下/autotest/testcases/路徑下,或者 點擊左側導航欄 “同步用例” 會自動同步目前自動化測試實現的測試case(需數據庫配置正確)
* 在工具左側導航欄里選擇“重新導入”,用例會顯示在主界面,長按每個item會顯示 用例詳情。
* 選中要執行的用例集合 點擊 “開始” 測試開始執行,選擇相應的測試環境,用例配置,case_tag 等參數
* 測試完成后 點擊導航欄 “日志報告” 可以查看測試報告


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM