成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Fastbot 開源版技術原理與架構

移動開發
下面將逐一介紹工具的工作流程、核心概念、算法原理、設計實現以及常用配置,深入了解其在提升移動應用測試效率的能力。

問題背景

近年來,移動應用程序的數量呈現爆炸性增長,隨之而來的是用戶對應用程序質量的高要求。確保應用程序的質量對于維護用戶忠誠度和業務成功至關重要。然而傳統的人工測試方法存在一些挑戰,包括耗費大量時間和資源、可擴展性和可維護性的限制等,因此移動應用的自動化測試工具應運而生。隨著人工智能時代的到來,軟件測試領域不斷向智能化發展,其中自動測試生成的能力一直是學術和工業界共同關注的研究熱點,依靠自動生成測試能較大程度減少測試腳本的編寫與維護工作量。

在實際應用中,工業級應用程序經常需要進行更新以適應不斷變化的用戶需求,例如,工業廠商一般每周都會發布一個新的核心應用版本,然而采用現有的自動化測試工具在這種情況下效果一般,它們僅僅是簡單地在移動應用上重新運行一次測試,缺乏對人類經驗和知識的運用。Fastbot正是一款結合了強化學習和基于模型決策算法的自動化安卓測試工具,它由字節跳動軟件工程實驗室(https://se-research.bytedance.com/)團隊提出,旨在利用強化學習的技術,通過學習和推理從之前的測試運行中獲得知識,從而達到更快更高效的測試效果。此外,Fastbot還提供了個性化的專家系統,用戶可以自定義各種配置去滿足不同的測試場景和需求。

下面將逐一介紹工具的工作流程、核心概念、算法原理、設計實現以及常用配置,深入了解其在提升移動應用測試效率的能力。

工作流程

圖片

Fastbot 是一種利用強化學習的可復用的基于模型的自動化安卓測試工具。它接受一個給定的應用程序版本,以 APK 文件的形式作為輸入,并輸出覆蓋報告和找到的崩潰。Fastbot 的工作流程包括兩個主要階段,如圖所示:

(a) 測試前的設置。a1 對 APK 文件進行反編譯,收集控件的靜態文本信息。a2 在一組設備上安裝 APK,同時 a3 加載先前測試運行中的歷史測試數據填充模型。

(b) 引導式 UI 探索。b1 從被測應用程序中獲取當前的 GUI 頁面,b2 識別和抽象出當前頁面上的可用 hyper-event(超事件,一組具有相同屬性的事件,將在下文具體解釋)。b3 選擇一個具體的 UI 事件,該事件有可能增加 Activity 覆蓋率,b4 執行該事件。執行完畢后,b5 更新歷史測試數據、概率模型,同時 b6 更新強化學習智能體。

這些步驟將循環迭代,直到使用完時間預算。

核心概念

技術和算法原理

Fastbot 的關鍵思想是利用存儲在概率模型中的先驗知識,去有效地指導 GUI 測試。為了實現這一點,關鍵步驟是決定在當前 GUI 頁面上選擇哪個 UI 事件,可以快速地提高 Activity 覆蓋率。具體而言,給定一個 GUI 頁面,Fastbot 提取當前所有可用的超事件,并采用以下兩種策略協同組合去選擇執行的事件:(1)基于模型的事件選擇,(2)基于學習的事件選擇。

1. 基于概率模型的事件選擇

為了平衡模型對未知動作的探索和已知高回報動作的利用,避免陷入局部最優的僵局,基于模型的事件選擇包括兩種模式:模型擴展和模型利用。

模型擴展: 如果當前 GUI 頁面中的某些超事件尚未包含在概率模型??中,Fastbot 將啟動擴展策略,隨機選擇一個尚未執行的超事件。在實際中有兩種可能的情況:1)先前的測試運行可能沒有覆蓋所有的超事件,2)當前測試應用程序版本中添加了一些新的功能。該模式可以幫助擴展模型并優先探索潛在的新功能。

Fastbot 的算法原理在于利用先前的知識和概率模型,通過模型擴展和模型利用兩種策略模式選擇事件,以快速提高 GUI 測試的 Activity 覆蓋率。該算法的設計使得 GUI 測試能夠更高效地進行,并能夠適應不同的應用場景。

2. 基于強化學習的事件選擇

前面概率模型只能表達一步的指導信息,而強化學習技術能夠將一步擴展為多步的指導信息。Fastbot 采用了 Sarsa N-Step 算法作為獎勵函數去計算和更新 Q 值。

3. 案例解釋

為了加深理解,下面用頭條應用來對算法的幾種決策進行解釋:

概率模型的探索與利用模式

通過對歷史數據記載對概率模型 M 初始化,見圖 b,啟動頭條應用后,進入 home Activity1,當前頁面可以抽象為 3 個 hyper-event,這三個事件都被包含在模型中,因此 Fastbot 回啟動模型利用策略選擇事件,看圖 b 左邊部分,可以知道 e3 有 90%的概率留在 Activity1,因此更傾向于選擇 e1 和 e2,假設選擇 e1 后,到達 Activity2,在 Activity2 中 e4 已經在模型中,并且 100%回到 Activity1,同時 e5,e6 不再模型中,此時 Fastbot 將啟動探索模式,隨機選擇 e5 或者 e6,如果選擇 e5,到達 Activity3,此時模型添加一條 e5-Activity3 的概率值 100%,同時由于 e1 的執行次數加 1,因此 e1 的概率也要改變,e1-Activity2 的概率變為 0.7/1.1=63.6%,e1-Activity5 的概率變為 36.4%,更新為圖 b 右半部分。

圖片圖片

Q 表的更新利用

在圖 a 中,Activity2,e4,e6 沒有被執行過,同時 e6 不在模型內,因此 e1 的獎勵更高,相似的,e7,e8 也是新的事件,因此 e5 的獎勵會更高,假設 e1,e2,e3 都會執行過很多次,并且 Activity2,3,4 都被覆蓋了,此時將利用 Q 表中的值去計算事件選擇的概率,在當前 Activity1 中,由于 e1 的獎勵最高說明他能夠到達更深的 Activity,因此選擇 e1 作為下一個事件執行。

圖片

設計實現

Fastbot 開源版包括客戶端和本地服務端兩部分,客戶端負責監聽 UI 事件,接收和注入相應的動作,服務端負責計算和決策。具體而言,在每個設備上運行 Fastbot 客戶端,通過監控 GUI 頁面信息發送給服務端,服務端接收信息根據算法決策返回選擇的事件,客戶端接收事件并執行操作。

客戶端使用 Java 語言編寫,用于獲取 GUI 信息,讀取服務端決策,并將決策轉化為設備可以執行的代碼,從而操作設備;本地服務端,即與 Java 層相對應的底層 C/C++代碼層,以動態鏈接庫(.so 文件)的形式與 Java 層通過 JNI 接口進行交互,它用于實現用戶偏好的讀取,模型的學習和任務決策,并將決策結果轉化為 JSON 格式的信息傳遞給 Java 層。

Fastbot 的實現繼承 Monkey 原生框架,下圖展示了 Fastbot 擴展的代碼簡要結構圖,在 java 層新增了來自 Fastbot 算法返回的事件源 MonkeySourceApeNative 類,對 GUI 樹的獲取,以及對 Android 不同的系統的兼容的 Adapter 適配接口,此外,為了支持自定義操作的解析和執行對 Monkey 的原始事件進行了封裝。

圖片

常用配置

1. 配置自定義事件

Fastbot 支持自定義事件序列,適用于場景覆蓋不全,通過人工配置到達 Fastbot 遍歷不到的場景。

配置步驟:

  1. 新建 max.xpath.actions 文件(文件名稱固定不能更改)
  2. 參照案例格式指定控件和相應的動作。其中:
  1. prob:發生概率,"prob":1,代表發生概率為 100%
  2. activity:所屬場景
  3. times:重復次數,默認為 1 即可
  4. actions:具體需要執行的事件序列,其中要指名每個操作對象的 xpath,對應的動作 action,和與下一個事件間隔的時間 throttle(ms),注意 xpath 寫法
  1. 動作類型(必須大寫):
  2. CLICK:點擊,想要輸入內容在 action 下補充 text,如果有 text 則執行文本輸入

  3. LONG_CLICK:長按

  4. BACK:返回

  5. SCROLL_TOP_DOWN:從上向下滾動

  6. SCROLL_BOTTOM_UP:從下向上滑動

  7. SCROLL_LEFT_RIGHT:從左向右滑動

  8. SCROLL_RIGHT_LEFT:從右向左滑動

  9. 配置完成后,將配置文件推送到手機端: adb push 路徑+max.xpath.actions /sdcard


下面以 AmazeFileManager 為例:

  1. 第一種情況:當事件執行不涉及 Activity 的跳轉時,只需將所有的事件序列寫在一個對象中。

如圖所示,actions 字段里的 4 個動作分別對應下圖中紅框標出的動作,(1)點擊菜單按鈕打開菜單欄,(2)點擊 recent file 按鈕到達相應文件目錄,(3)點擊加號按鈕,打開浮選選項,(4)點擊 File 按鈕打開新建文件對話框。

圖片

[
    {
        "prob":1,
        "activity":"com.amaze.filemanager.ui.activities.MainActivity",
        "times":1,
        "actions":[
            {
                "xpath":"http://*[@content-desc='Navigate up']",
                "action":"CLICK",
                "throttle": 2000
            },
            {
                "xpath":"http://*[@resource-id='com.amaze.filemanager:id/design_menu_item_text' and @text='Recent files']",
                "action":"CLICK",
                "throttle": 2000
            },
            {
                "xpath":"http://*[@resource-id='com.amaze.filemanager:id/sd_main_fab']",
                "action":"CLICK",
                "throttle": 2000
            },
            {
                "xpath":"http://*[@resource-id='com.amaze.filemanager:id/menu_new_file']",
                "action":"CLICK",
                "throttle": 2000
            }
        ]
    }
]
  1. 第二種情況:當事件執行涉及到 Activity 的跳轉時,要將對應不同 Activity 的事件序列單獨存放。

下圖展示了從 MainActivity 跳轉到 PreferencesActivity 的例子。

圖片

可以看到在配置文件中有兩個對象,分別對應 MainActivity 和 PreferencesActivity 兩個頁面下需要執行的事件序列。

[
    {
        "prob":1,
        "activity":"com.amaze.filemanager.ui.activities.MainActivity",
        "times":1,
        "actions":[
            {
                "xpath":"http://*[@content-desc='Navigate up']",
                "action":"CLICK",
                "throttle": 2000
            },
            {
                "xpath":"http://*[@resource-id='com.amaze.filemanager:id/design_navigation_view']",
                "action":"SCROLL_BOTTOM_UP",
                "throttle": 2000
            },
            {
                "xpath":"http://*[@text='Settings' and @resource-id=['com.amaze.filemanager:id/design_menu_item_text']",
                "action":"CLICK",
                "throttle": 2000
            }
        ]
    },
    {
         "prob":1,
         "activity":"com.amaze.filemanager.ui.activities.PreferencesActivity",
         "times":1,
         "actions":[
                 {
                     "xpath":"http://*[@resource-id='android:id/title' and @text='Appearance']",
                     "action":"CLICK",
                     "throttle": 2000
                 }
             ]
    }
]
  1. 帶文本輸入的情況

配置格式: 在 action 字段選擇“CLICK”,同時添加“text”字段存儲需要輸入的文本。

圖片

以抖音為例,使用以下配置信息可以指定完成輸入賬戶信息的操作。兩個動作,分別對應點擊 use phone 按鈕和輸入文本。

[
    {
        "prob":1,
        "activity":"com.ss.android.ugc.aweme.account.login.auth.I18nSignUpActivityWithNoAnimation",
        "times":1,
        "actions":[
            {
                "xpath":"http://*[@resource-id='com.zhiliaoapp.musically:id/ayo' and @text='Use phone / email / username']",
                "action":"CLICK",
                "throttle": 2000
            }

        ]
    },
{
        "prob":1,
        "activity":"com.ss.android.ugc.aweme.account.login.v2.ui.SignUpOrLoginActivity",
        "times":1,
        "actions":[
            {
                "xpath":"http://*[@text='Phone number' and @resource-id=['com.zhiliaoapp.musically:id/e61']",
                "action":"CLICK",
                "text":"12341828506",
                "throttle": 2000
            }

        ]
    }
]

2. 屏蔽控件

Fastbot 支持手動配置需要屏蔽的控件或區域,比如測試過程中“半路”中途退出登錄,屏蔽退出登錄按鈕。

配置步驟:

  1. 新建 max.widget.black 文件(文件名稱固定不可更改)
  2. 參照案例格式指定需要屏蔽的控件,格式如下:
  • bounds:屏蔽某個區域,在該區域內的控件或坐標不會被點擊。
  • xpath:查找匹配的控件,屏蔽點擊該控件。
  • xpath+bounds:查找匹配的控件,當控件存在時屏蔽指定的區域。
  1. activity:當 activity 與 currentactivity 一致時執行如下匹配
  2. 屏蔽控件或區域共有三種方式:
  3. 配置完成后,將配置文件推送到手機端: adb push 路徑+max.widget.black /sdcard

下面以 AmazeFileManager 為例,展示如何進行控件,區域以及樹剪枝屏蔽:

圖片

  1. 屏蔽控件

如圖(a)所示,紅框標出來的黑色區域控件是手動配置的屏蔽控件。在這里,使用 xpath 來指定需要被屏蔽的控件。

[
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "xpath":"http://*[@content-desc='Navigate up']"
},
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "xpath":"http://*[@content-desc='More options']"
}

]
  1. 屏蔽區域

如圖(b)所示,紅框標出來的黑色區域控件是手動配置的屏蔽區域。在這里使用 bounds 來配置屏蔽區域。

[
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "bounds":"[0,18],[240,60]"
}
]
  1. 樹剪枝屏蔽

樹剪枝屏蔽是指在 GUI 樹中查找到對應控件,通過將控件屬性的 enable 設置為 False,從而使控件屏蔽。

配置步驟:

  1. 配置 max.tree.pruning 文件(文件名固定不可更改)
  2. 參照案例格式指定需要屏蔽的控件,格式如下:
  1. activity:當 activity 與 currentactivity 一致時執行如下匹配
  2. 剪枝方式:配置 xpath,查找匹配的控件,改變控件屬性,從而使控件屏蔽。
  1. 配置完成后,將配置文件推送到手機端: adb push 路徑+max.tree.pruning /sdcard

例子:仍以 AmazeFileManager 為例, 如上圖(c)所示,被紅框標出的黑色區域即為手動配置的樹剪枝屏蔽控件,可以通過將控件的 enabled 屬性變為 flase,也可以將其他屬性變為空來實現屏蔽。

[
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "xpath":"http://*[@content-desc='Navigate up']",
    "enabled":"false"
},
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "xpath":"http://*[@content-desc='More options']",
    "enabled":"false"
},
{
    "activity":"com.ss.android.ugc.aweme.main.MainActivity",
    "xpath":"http://*[@resource-id='com.amaze.filemanager:id/search'",
    "resourceid":"",
    "contentdesc":"",
    "text":"",
    "classname":""
}
]

更多信息

Fastbot 開源地址:https://github.com/bytedance/Fastbot_Android

更多 Fastbot 技術細節請參考該論文:“Fastbot2: Reusable Automated Model-based GUI Testing for Android Enhanced by Reinforcement Learning”。 Zhengwei Lv(呂正偉), Chao Peng(彭超), Zhao Zhang(張釗), Ting Su(蘇亭), Kai Liu(劉凱), Ping Yang(楊萍)。 37th IEEE/ACM International Conference on Automated Software Engineering (ASE 2022).

責任編輯:龐桂玉 來源: 字節跳動技術團隊
相關推薦

2012-07-10 16:22:01

開源架構

2015-09-25 09:56:37

負載均衡

2009-03-20 09:49:00

負載均衡CDN網站架構

2018-06-26 11:33:21

云計算開源軟件

2024-10-30 10:06:51

2021-12-07 07:32:09

kafka架構原理

2022-01-10 23:59:02

Sentry SaaS 開源

2021-11-11 10:48:35

架構運維技術

2024-12-05 10:42:51

網絡架構NAT

2012-08-01 10:50:48

性能測試測試架構

2017-05-16 15:33:42

Python網絡爬蟲核心技術框架

2009-11-30 10:55:22

2025-04-03 07:00:00

2024-09-29 08:00:00

動態代理RPC架構微服務架構

2013-06-17 16:29:56

2017-07-07 14:30:27

Flink架構拓撲

2018-12-19 16:15:35

服務器虛擬化開源

2025-03-27 02:50:00

2020-11-26 13:54:03

容器LinuxDocker

2025-06-03 00:00:04

VMware FT虛擬機服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩毛片 | 网站黄色在线免费观看 | 一区二区三区高清在线观看 | 午夜一区| 欧美一级在线免费 | 国产情侣在线看 | 日韩高清在线 | 91视频中文 | 免费a级毛片在线播放 | 久草院线 | 国产成人综合一区二区三区 | 欧洲亚洲视频 | 亚洲视频免费在线观看 | 国产精品久久久久久久久久久久午夜片 | 久久999 | 欧美片网站免费 | 欧美日韩精品一区二区三区视频 | 色婷婷激情 | 亚洲欧美日韩成人在线 | 日韩中文一区二区三区 | 免费成人在线网站 | 国产精品揄拍一区二区 | 91精品国产综合久久久久 | 色一级 | www国产成人免费观看视频,深夜成人网 | 中文字幕一级毛片 | 亚洲视频精品 | 一区二区国产在线观看 | 国产成人精品久久 | 9191av| 手机在线一区二区三区 | 亚洲资源在线 | 成人免费视频网站在线观看 | 亚洲午夜网 | 欧美日韩在线一区二区 | 爱爱视频在线观看 | 日韩精品一区二区三区免费视频 | 天堂av中文在线 | 国产一区二区a | 久久国产传媒 | 亚洲国产一区二区三区在线观看 |