初探自動遍歷測試工具-AppCrawler

一、簡介

1.1 概要

  • AppCrawler是由TesterHome聯合創始人黃延勝(思寒)大佬開源的一個項目,經過名字咱們大概也能猜出個方向,Crawler是爬蟲的意思,App的爬蟲,遍歷App;官方GitHub上對這款工具的解釋是:

一個基於自動遍歷的app爬蟲工具. 支持android和iOS, 支持真機和模擬器. 最大的特色是靈活性. 可經過配置來設定遍歷的規則.html

這裏順便提一下的是谷歌也發佈了一款自動遍歷的工具,名字幾乎同樣,叫作App Crawler(差了一個空格),設計的思想也一致,可是這款工具目前還在開發完善中,思寒大佬的工具比谷歌的早了兩年時間,厲害啊!
google app crawler連接: developer.android.com/training/te…前端

吹完思寒以後,再來看看AppCrawler的做用和價值:java

1.2 需求背景

  • 互聯網的業務需求背景
    • 業務變動快速
    • 業務線衆多
    • 業務流程複雜
    • 依賴第三方接口較多
  • 測試工做常見問題
    • UI自動化只能覆蓋核心業務邏輯,新功能來不及上自動化
    • 產品業務測試量較大,新版發佈後,老功能來不及全面迴歸,容易漏測
    • 時間長,強度大的工做後,人容易產生疲乏,對數字的位數,文字的顯示等錯誤信息的敏感度降低
    • 產品的界面深度很深,且包含大量的展現信息功能
    • 專項測試迴歸難度大:內存泄漏、健壯性測試、弱網等測試太多

這個時候咱們須要一種手段,能夠達到兩方面的目的:android

  • code less: UI自動化用例維護成本降到最低
  • automate: 儘量的自動化覆蓋迴歸業務

而自動遍歷就能夠知足咱們對上述的業務的需求;接着再來看咱們對自動遍歷測試的一些需求,既然要用自動遍歷,那麼具體要等到什麼樣的效果?ios

二、工具選擇

2.1 遍歷工具需求

自動遍歷的需求git

  • 可控:能夠定義遍歷的路徑,指定須要測試的業務,保證核心業務的覆蓋優先級
  • 可定製:可實現自動輸入、自動滑動等基礎行爲

結果分析github

  • 點擊先後的截圖對比
  • 結果的數據建模

2.2 工具對比

2.2.1 Monkey

首先來看業界用的較早也是常常聽過的一款工具——Monkeyweb

這是Android官方提供的一個工具,在Android的官網咱們能夠看到對這款工具的解釋以下: shell

在這裏插入圖片描述
沒錯,谷歌本來設計這款工具是爲了對App進行壓力測試的,而並非自動遍歷測試,注意的是這裏的壓力測試並非咱們日常意義上的對服務端的壓力,而是對App前端的壓力。下面是思寒對App壓力測試的緣由解釋:

谷歌早期在設計Android的時候,Android須要響應滑動、輸入、音量、電話等事件,早期activity設計不完善的時候,谷歌但願測試activity的性能,把全部的數據批量化的輸出給activity,看activity一秒鐘能夠處理多少數據。因此早期monkey是用來作Android的一個壓力測試的工具json

因爲monkey在測試過程當中的「隨機」性,恰巧能夠被用來作自動遍歷測試,可是monkey的缺點行業很明顯,就是不知足咱們的兩個自動遍歷需求:可控性可定製

  • 缺點:不支持業務行爲定製,沒法靈活的控制,常常會點到外部的APP沒法迴歸原測試APP;或者點擊到註銷和退出,形成沒法繼續後面的測試; 所以monkey在通過調研瞭解後沒有成爲咱們作自動遍歷測試的首選
2.2.2 Maxim

Maxim也是一款自動遍歷工具,由咱們國內的一名叫作zhangzhao的工程師開發,官方給出的定義是:

An efficient Android Monkey Tester, available for emulators and real devices 基於遍歷規則的高性能Android Monkey,適用於真機/模擬器的APP UI壓力測試

官方GitHub地址:github.com/zhangzhao44…
testerhome地址:testerhome.com/topics/1171…

咱們來看看這款工具的優缺點:

  • 優勢:
    • 基於Monkey二次開發,也用了一些AppCrawler的設計思路,擁有定製化功能
    • 由於底層基於了Monkey,因此運行速度仍是比較快的
  • 缺點:
    • 由於是基於Monkey,因此不具有跨平臺性,只能測試Android,不能測試IOS,web等

這款工具沒有開源,可是能夠直接使用,在GitHub上下載後根據官方說明操做便可,這裏不作重點說明,後期有空時候專門研究,獨立成篇,或者直接參考做者在testerhome上的帖子; 重點來看一下工具的特色和選擇性

  • 配置文件,官方給出了配置文件的示例,以json格式進行編寫:
    在這裏插入圖片描述
    接觸過appcrawler後會發現寫法很是類似,只不過appcrawler是以yaml文件進行書寫 選擇
    這也是一款很優秀的工具,可在必定程度上進行定製,若是隻測試Android系統的話,能夠考慮選用Maxim作自動遍歷,速度相對較快;若是想要跨平臺或者對開源工具進行二次開發,那就要appcrawler登場了
2.2.3 AppCrawler

再來看今天的主角-AppCrawler,看看它爲什麼知足咱們的測試需求,它的優缺點有在哪裏

先來看它與其餘框架的關係結構

  • 與其餘框架的關係
    • appcrawler底層引擎
      • appium
        • wda
        • uiautomator2
      • adb
      • macaca(未維護,已廢棄)
      • selenium(暫未開源)
  • 優勢
    • 跨平臺性:AppCrawler是基於appium開發的,因此支持AndroidIOS
    • 可控性:對測試的頁面,控件類型的選擇,測試的深度等均可自由控制
    • 可定製:可自定義操做,如輸入,滑動等
  • 缺點
    • 運行速度較慢:AppCrawler是基於appium開發具有了跨平臺的優勢,可是也由於這層封裝形成了運行速度相對較慢
    • 使用門檻高:正由於使用靈活性的問題,也形成了使用門檻的提升,主要基於yaml文件中使用appium的相關技術知識進行配置,這就對使用者有了必定的技術要求

三、安裝與啓動

  • 下載
    由於較大,官方也給出了打包後的百度網盤下載地址 最新版本下載地址: pan.baidu.com/s/1dE0JDCH 這裏以目前最新的2.4.0爲例

    在這裏插入圖片描述
    如何本身編譯打包
    1)從GitHub上clone源碼,當前開源的最新2.4.0版本對應的分支是2.3.1
    AppCrawler官方GitHub地址:github.com/seveniruby/…
    在這裏插入圖片描述
    2)切換到分支:git checkout 2.3.1
    3)使用maven構建:執行mvn assembly:single命令進行編譯便可

  • 安裝 AppCrawler自己是個jar包,不須要安裝,須要安裝的是運行時所依賴的環境: * Java版本:Java八、Java10(未測試過,做者說支持) * appium:appium 1.8以上 由於AppCrawler是基於appium開發的,因此appium的環境是必不可少的 appium的安裝方式可參考另一篇博客:
    Windows(Win10)、Mac下安裝appium

  • 查看幫助文檔 直接使用命令java -jar appcrawler-2.4.0-jar-with-dependencies.jar,能夠看到以下幫助文檔信息 相關參數含義和部分註解以下:

    $ java -jar appcrawler-2.4.0-jar-with-dependencies.jar
    
    ----------------
    AppCrawler 2.4.0 [霍格沃茲測試學院特別記念版]
    Appium 1.8.1 Java8 tested
    app爬蟲, 用於自動遍歷測試. 支持Android和iOS, 支持真機和模擬器
    項目地址: https://github.com/seveniruby/AppCrawler
    移動測試技術交流: https://testerhome.com
    聯絡做者: seveniruby@testerhome.com (思寒)
    致謝: 曉光 泉龍 楊榕 恆溫 mikezhou yaming116 沐木
    
    --------------------------------
    
    
    Usage: appcrawler [options]
    
      -a, --app <value>        Android或者iOS的文件地址, 能夠是網絡地址, 賦值給appium的app選項 #安裝App,實際中使用較少
      -e, --encoding <value>   set encoding, such as UTF-8 GBK #在Windows下可能會產生亂碼,對其編碼格式進行設置
      -c, --conf <value>       配置文件地址 #複雜且重要,是AppCrawler定製的核心
      -p, --platform <value>   平臺類型android或者ios, 默認會根據app後綴名自動判斷
      -t, --maxTime <value>    最大運行時間. 單位爲秒. 超過此值會退出. 默認最長運行3個小時
      -u, --appium <value>     appium的url地址 #運行依賴於appium,不加此參數就使用默認的appium地址端口
      -o, --output <value>     遍歷結果的保存目錄. 裏面會存放遍歷生成的截圖, 思惟導圖和日誌
      --capability k1=v1,k2=v2... # 和appium的capability設置一致
                               appium capability選項, 這個參數會覆蓋-c指定的配置模板參數, 用於在模板配置之上的參數微調
      -r, --report <value>     輸出html和xml報告
      --template <value>       輸出代碼模板
      --master <value>         master的diff.yml文件地址
      --candidate <value>      candidate環境的diff.yml文件
      --diff                   執行diff對比
      -vv, --verbose           是否展現更多debug信息
      --demo                   生成demo配置文件學習使用方法
      --help
    示例
    appcrawler -a xueqiu.apk
    appcrawler -a xueqiu.apk --capability noReset=true
    appcrawler -c conf/xueqiu.json -p android -o result/
    appcrawler -c xueqiu.json --capability udid=[你的udid] -a Snowball.app
    appcrawler -c xueqiu.json -a Snowball.app -u 4730
    appcrawler -c xueqiu.json -a Snowball.app -u http://127.0.0.1:4730/wd/hub
    
    #生成demo例子
    appcrawler --demo
    
    #啓動已經安裝過的app
    appcrawler --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
    
    #從已經結束的結果中從新生成報告
    appcrawler --report result/
    
    #新老版本對比
    appcrawler --candidate result/ --master pre/ --report ./
    複製代碼

    這裏順便說一下的是當前版本的diff功能還不完善,也相對較複雜,目前先不作深刻研究

  • quick start
    1) 啓動appium

    $ appium
    [Appium] Welcome to Appium v1.14.1
    [Appium] Appium REST http interface listener started on 0.0.0.0:4723
    複製代碼

    2)啓動模擬器或真機,保證adb devices可有找到你的設備

    $ adb devices
    List of devices attached
    FKFBB19120151100	device
    複製代碼

    3) 根據參考文檔中的命令,啓動遍歷一個已經安裝過的APP(以示例中的雪球App爲例): java -jar appcrawler-2.4.0-jar-with-dependencies.jar --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias" 這個命令執行後會以默認的方式去執行用例,而後遍歷

  • 遍歷原則 它的遍歷原則是,找頁面的裏層次最深的元素,也就是處於中心位置元素會被優先遍歷

  • 部分遍歷效果展現

    在這裏插入圖片描述

  • 測試結果 若是沒有使用-o參數指定log輸出的路徑,appcrawler就會在當前目錄下生成以時間爲命名的文件夾,裏面保存了全部的數據,文件、截圖、log

    $ ls
    20191129154742
    appcrawler-2.4.0-jar-with-dependencies.jar
    複製代碼

    打開文件夾會發現以下,每一步都會進行截圖(這也是速度變慢的緣由之一吧)以及對於的dom文件,這裏會看到有幾個steps文件,這個只是隨意點了某個操做來告知用戶正在操做,真正的執行步驟是從這以後開始

    在這裏插入圖片描述

  • 測試報告 在測試log中有一個index.html文件,打開它會看到剛纔運行的測試報告,appcrawler會把每一次點擊當作一個測試用例,沒一個頁面當作是一個測試套件;將界面和界面內的控件點擊模擬成了測試套件和測試用例的關係

    在這裏插入圖片描述
    在這裏插入圖片描述
    報告中也能夠查看對應頁面操做事件的截圖
    在這裏插入圖片描述

  • 測試log 在生成的文件夾中有appcrawler.log,裏面記錄了詳細的執行步驟的log信息(加上-vv參數運行的話會獲得更多更多的log信息)

    在這裏插入圖片描述
    截取部分log展現以下:

    2019-11-29 15:48:10 INFO [Crawler.996.doElementAction] current element = MainActivity.tag=ImageView.depth=24
    2019-11-29 15:48:10 INFO [Crawler.997.doElementAction] current index = 2
    2019-11-29 15:48:10 INFO [Crawler.998.doElementAction] current action = click
    2019-11-29 15:48:10 INFO [Crawler.999.doElementAction] current xpath = //*[@resource-id="com.xueqiu.android:id/decor_content_parent"]//*[@resource-id="android:id/content"]//*[@resource-
    id="com.xueqiu.android:id/mainContent"]//*[@resource-id="com.xueqiu.android:id/main_content"]//*[@resource-
    id="com.xueqiu.android:id/pager"]//*[@resource-id="com.xueqiu.android:id/layout_refresh"]//*[@resource-
    id="com.xueqiu.android:id/list"]//*[@resource-id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
    id="com.xueqiu.android:id/time_line_topic_item_case2"]//*[@resource-
    id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
    id="com.xueqiu.android:id/time_line_topic_footer"]//*[@resource-id="com.xueqiu.android:id/feedback"]
    2019-11-29 15:48:10 INFO [Crawler.1000.doElementAction] current url = MainActivity
    2019-11-29 15:48:10 INFO [Crawler.1001.doElementAction] current tag path =
    hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.ImageView
    2019-11-29 15:48:10 INFO [Crawler.1002.doElementAction] current file name = MainActivity.tag=ImageView.depth=24
    2019-11-29 15:48:10 INFO [Crawler.1071.doElementAction] need input click
    2019-11-29 15:48:10 INFO [AppiumClient.53.findElementByURI] find by uri element= MainActivity.tag=ImageView.depth=24
    2019-11-29 15:48:10 INFO [AppiumClient.245.findElementsByURI] findElementByAndroidUIAutomator new UiSelector().className("android.widget.ImageView")
    2019-11-29 15:48:10 INFO [AppiumClient.60.findElementByURI] find by xpath success
    2019-11-29 15:48:10 INFO [Crawler.1080.doElementAction] mark 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png to 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
    2019-11-29 15:48:10 INFO [AppiumClient.141.mark] read from 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
    2019-11-29 15:48:11 INFO [AppiumClient.154.mark] write png 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
    2019-11-29 15:48:11 INFO [AppiumClient.161.mark] ImageIO.write newImageName 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
    2019-11-29 15:48:11 INFO [Crawler.1095.$anonfun$doElementAction$5] click element
    複製代碼

    index等於幾就表示第幾回事件,action表示當前的操做,xpath就表示當前操做的元素的xpath表達式

四、補充說明

  • 總說appcrawler慢,其餘工具相對較快,緣由爲什麼,先來看他們的架構組成

    - appcrawler
    - appium、atx
    - appium on Uiautomator2 server、atx on Uiautomator二、maxim、adb shell uiautomator、改進版本Uiautomator2 server
    - Uiautomator2
    - AccessibilityService
    複製代碼

    底層有個叫AccessibleServices東西,它能夠獲取Android全部界面的控件,uiautomator獲取元素進行操做的時候就是靠AccessibleServices去獲取控件,而後去觸發必定的行爲,uiautomator就是將其進行了包裝;

    基於uiautomator,appium開發了一個uiautomator server,ATX開發了一個uiautomator2,maxim就處於這一層 appium走的是HTTP協議,ATX走的是JSON-RPC協議,appcrawler處於最上層 因此appcrawler因爲多了兩層封裝,再加上運行過程當中加入了截圖(能夠在配置中取消,可是取消後不利於結果的查看),運行起來天然就慢了。

  • 改進指望: 後期指望appcrawler團隊能夠將其根據需求指定底層操做,繞過不少沒必要要的流程來增長效率,這樣功能很是完善的同時也能保證效率

五、寫在最後

到這裏只是完成了appcrawler的一個基本認識,既然提到了它的定製化的特色,就須要經過配置文件來完成了,下一篇將進行詳細的介紹,可參考博客:
以AppCrawler的配置文件完成定製化的自動遍歷測試(基礎)-01

相關文章
相關標籤/搜索