愛奇藝移動端APP健壯性測試的設計與實踐

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"前言"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一款APP的發佈以及新功能的迭代需要經過嚴格的質量保證,而"},{"type":"text","marks":[{"type":"strong"}],"text":"崩潰性問題"},{"type":"text","text":"是影響APP穩定的頭號問題。其中,因前端不兼容後端服務數據格式變更而引起的崩潰問題佔有一定的比例。這類崩潰問題一般排查難度較大,且利用常規測試方法通常很難有效降低這種類型缺陷的比例。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"是否有更好的方式來提前預防數據變更導致的崩潰問題?"},{"type":"text","text":"本文將重點介紹愛奇藝技術產品團隊打造的APP健壯性測試實踐內容。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"背景"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"愛奇藝APP擁有豐富的視頻資源,需要頻繁進行節目上線或者下線、各種活動配置等操作調整。這些內容迭代主要是通過後臺管理系統進行,然後下發到APP端並在UI層展示。在版本功能迭代過程中儘管有大量的、針對性的質量保證方法,但是服務端業務邏輯盤根錯節,一些極少用到的功能配置可能在歷經多次代碼迭代後在最新版本APP中出現兼容問題,一些第三方依賴接口可能會因爲格式的變化而引發前端UI不兼容甚至崩潰,這對於APP的"},{"type":"text","marks":[{"type":"strong"}],"text":"健壯性、穩定性"},{"type":"text","text":"提出了很大的挑戰。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"愛奇藝技術團隊對線上歷史問題進行總結、對行業內前沿技術進行探索,最終經過多次探討後設計了一種APP健壯性測試方案。團隊研發的基礎網絡庫SDK對APP收到的服務端接口返回進行攔截,從網絡層進行數據替換。團隊根據歷史問題的總結、日常經驗的積累提煉出一系列數據組合,當APP進入需要測試的頁面時,就會去拉取並進行“髒數據”填充,以便儘早發現因數據變更引發的崩潰問題。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9f\/9fd647c6f20676e2b08c4f47bbdf9ee1.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"測試效果圖:從圖中可以看到頁面中的文字被髒數據修改"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"技術實現"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9d\/9de69da32394b51f35e5ab44dd3b8407.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上圖可以看到:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)策略配置是一個獨立的Web化模塊,APP內“"},{"type":"text","marks":[{"type":"strong"}],"text":"髒數據"},{"type":"text","text":"”注入規則都由策略配置控制。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)APP內的基礎網絡庫SDK模塊是一個獨立的功能模塊,不會對其他功能模塊有影響;並具有單獨的開關控制,只有開關開啓時纔對後端返回的數據進行攔截替換。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面將對實現情況進行具體說明。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"一、WEB策略配置--可視化界面"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"策略配置的前提是確認頁面的哪些接口請求需要進行校驗,通常一個頁面有非常多的後端請求,每個請求都會帶有很多不同類型的參數,對應的返回數據帶了大量的KEY和VALUE,數據配置對測試結果尤其重要。豐富的高危“髒數據”才能極大的提升網絡數據測試的效果,如果純手工輸入“髒數據“進行測試,人力成本較高,最終我們通過WEB可視化界面進行數據策略配置,大幅度減少用戶對“髒數據”的設計成本,因此策略配置界面的原則是數據通配、操作簡單、策略可複用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"--策略示例圖-1"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/e4\/e464ce65e11bc92dae4d959ce39a597b.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"--策略示例圖-2"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/0d\/0d145a5d2960bf927bdc500b94a1ab9f.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從策略示例圖1、2可以看到,配置分爲二部分:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)"},{"type":"text","marks":[{"type":"strong"}],"text":"URL配置"},{"type":"text","text":": "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"被測頁面的請求URL,支持域名模糊匹配、多域名同策略、域名參數匹配等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)"},{"type":"text","marks":[{"type":"strong"}],"text":"數據配置"},{"type":"text","text":": "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"支持單節點、多節點、節點移除\/跳過;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"支持同類型、非同類型、emoji表情、#color、null 、空值、object等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可視化頁面爲用戶提供多種默認策略,這些默認策略均是測試中提煉出的經驗積累,用戶僅需配置待測URL即可使用,極大地降低操作成本。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"二、策略通信原理"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"鑑於測試的目標覆蓋度以及測試任務執行效率兩個維度考慮,我們具有兩種遍歷JSON的策略:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)"},{"type":"text","marks":[{"type":"strong"}],"text":"刷新單個節點進行順序訪問"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此策略可以覆蓋所有節點檢查,根據返回結構,依次替換節點數據。具有節點全覆蓋的特點。接口返回數據體量大時耗時會較長,所以此方式適用於UI自動化測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)"},{"type":"text","marks":[{"type":"strong"}],"text":"刷新遍歷所有節點的全節點訪問"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此策略每次訪問到匹配的URL時從列表內隨機獲取一個髒數據,對原數據進行替換。具有數據隨機性強,遍歷靈活度高的特點。接口返回數據體量無論大小,各個節點均有機會被替換,所以此方式適用於穩定性測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"遍歷策略開發難點:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"任務過程中如有發生崩潰,重啓APP後遍歷執行仍然會在相同的崩潰節點反覆測試,這導致測試效率低下後續測試步驟無法繼續進行。爲了解決這個問題,測試中SDK維護一個“髒數據”遍歷的訪問棧使用非遞歸遍歷,會保存遍歷棧到本地,不論是重啓還是發生崩潰都可以直接從這個棧裏恢復訪問進度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"SDK數據攔截實現:"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/43\/43c93e74a30c6029896685304b0fcbe3.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過基於ASM的hook框架編譯時指定網絡庫對應的方法進行hook修改網絡庫的字節碼實現攔截,將JSON數據按指定規則進行修改,最後將數據返回給網絡庫,傳遞到請求網絡的業務方,此方法能有效地降低對基礎庫的侵入性能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"SDK的特點:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"泛用性廣"},{"type":"text","text":":移動端有各種不同的網絡庫在使用,把攔截網絡庫的功能獨立成一個library並適應不同開發團隊的技術場景,目前已落地到多個業務線。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"非侵入式對接"},{"type":"text","text":":各業務線通過該SDK對接網絡庫進行數據攔截,原有網絡庫無任何侵入式修改。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"缺陷管理"},{"type":"text","text":":在業務方使用“髒數據”的過程中發生異常崩潰,SDK自動捕捉異常信息並投遞缺陷給模塊的負責人,測試任務將重啓APP繼續測試流程的循環。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"三、測試驅動方式"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"SDK開關打開後,運行我們的測試應用服務,就可以在APP的UI頁面上進行操作。操作方式包括:自動化測試、穩定性測試、手工測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"自動化測試("},{"type":"text","text":"UI自動化"},{"type":"text","marks":[{"type":"strong"}],"text":")"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們使用UI自動化作爲主要的驅動方式之一,UI自動化可以精準到達被測頁面,並進行指定場景接口的返回數據替換測試。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9a\/9a489e6fd2de3b6a33a155cd49c11db8.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對健壯性測試的UI自動化,無需複雜的步驟,在達到指定頁面後,重複觸發接口請求。此驅動方式具有編寫便利、維護成本低的特點。當被測頁面接口返回數據量級較大時,需要耗費較長時間才能達到數據高覆蓋的目的,UI自動化無需值守可以極大降低人力投入。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此方式適用於迴歸測試、大量數據頁面、性能壓測等測試場景。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"穩定性測試("},{"type":"text","text":"Monkey類測試"},{"type":"text","marks":[{"type":"strong"}],"text":")"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了讓APP混沌測試覆蓋更廣,我們將“髒數據”修改方案在穩定性測試中進行實施 , 以低成本實現多頁面觸達的需求,觸發更多頁面的後端接口。默認使用全量字段隨機注入。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下是處理邏輯:"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/bc\/bcd1f4fc9234d985e84936f444e4b63f.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據預埋或者自定義的頁面層級訪問權重,對APP中的頁面進行隨機訪問。在APP啓動且進入預期頁面之前打開SDK開關。爲了提高修改頻率,可以在進入目標頁面後適當加入刷新操作(可配置)。期間如觸發崩潰問題,則通知SDK側進行日誌提取和缺陷提交,隨後關閉SDK,進入下一個循環。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"手工測試"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"特點優勢"},{"type":"text","text":":具備靈活度高、成本低,針對自動化難以涉及的掃碼、支付等多種場景;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"使用場景"},{"type":"text","text":":在開發准入、新功能測試中落地,針對新增接口節點進行充分驗證;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"執行流程"},{"type":"text","text":":配置策略>安裝APK>進入啓動頁>填寫策略ID>進入被測頁>缺陷分析>自動缺陷管理。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"效果收益及未來規劃"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目前,該技術方案已經推行到多個業務線,在測試過程中召回多個難以發現的缺陷,幫助規避了線上可能出現的崩潰問題;新業務新場景接入便捷,落地投入成本較低,自動化任務幾乎零維護;缺陷閉環率達50%以上,有效提升代碼的健壯性和穩定性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"未來,團隊計劃增加更豐富更多變的服務能力,包括:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)提升數據節點覆蓋的廣度和深度;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)豐富“髒數據”類型與內容形態;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)接口迭代場景精準匹配,支持數據自動提取解析,針對性測試;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4)支持多臺設備併發執行策略的能力,實現分佈式數據遍歷修改。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文轉載自:愛奇藝技術產品團隊(ID:iQIYI-TP)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"},{"type":"link","attrs":{"href":"https:\/\/mp.weixin.qq.com\/s\/kQDhrSU3Erk__1XJrUS-qg","title":"xxx","type":null},"content":[{"type":"text","text":"愛奇藝移動端APP健壯性測試的設計與實踐"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章