星雲精準測試對安卓底層驅動程式碼的測試案例分析
Android 原生底層驅動應用面極廣,但一直沒有很好的辦法進行質量追蹤。本文藉助星雲精準測試的高可靠性的測試技術手段,針對 Android 原生底層驅動進行分析、插樁、編譯、採集資料、資料分析等,逐步講解精準測試是如何實現 android 原生底層驅動的對接。
在本文中,我們可以清晰地檢視到如何進行技術對接的每一步,比如如何使用星雲精準測試進行程式碼插樁、實現測試用例與採集底層驅動執行程式碼的資料追溯、對最終採集的資料進行一系列分析等。
一、安卓原始碼精準測試流程概述
經分析 android 原始碼的編譯主要依靠 Android.bp 為紐帶連線起來;在編譯時,只需要在想要編譯的模組目錄下執行 mm 命令即可自動的根據當前目錄下的 Android.bp 檔案對其所包含的模組進行編譯。
主要流程大致為:先將 ZOA 通訊庫原始碼複製進去並加入某一層次的 Android.bp 中,再透過對包含所有 Android.bp 編譯資訊的 ninja 檔案的解析可以得到 Shell 認可的插樁 json 檔案,Shell 透過 json 檔案對對應目錄的程式碼進行插樁,插樁完成後,把對 ZOA 通訊庫的引用加入該模組的 Android.bp 中再放入 ZoaInstru.h 標頭檔案後就可以正常編譯出插樁程式了。
二、對安卓原始碼進行精準測試的準備工具
1.安卓原生 8.1.0 系統原始碼,放於/data/source2/目錄下
2.shell.tar.gz 插樁工具包放於/data/目錄下
3.ZOAMQLib 通訊庫原始碼放於/data/source2/ frameworks/av/目錄下
4.谷歌官方裝有原生 8.1.0 系統手機一部
本例是對/data/source2/ frameworks/av/camera 模組進行插樁編譯,首先 source build/envsetup.sh 配置環境變數,再 lunch 後輸入 2 選擇 aosp_arm64-eng,再 mm 編譯模組
三、精準測試插樁工具部署
在存放精準測試插樁工具包的/data/目錄下執行命令
tar -zxvf shell.tar.gz
將精準測試插樁工具包解壓
cd /data/shell/bin
進入 shell 包 bin 目錄下開啟並修改 Server.cfg 的 [SERVER] 欄位的 ip 為星雲精準測試服務端 ip,對 [LOCAL] 欄位的 ip,客戶端若與服務端在同一主機則保持 127.0.0.1,若在不同主機則寫明客戶端 ip。
四、ZOA 通訊庫加入安卓體系
本次選擇 av 模組進行精準測試的插樁編譯驗證模組,在對 av 模組進行深入瞭解後,解析出其 Android,bp 的連線其結構大致如此,每一個最終節點就代表會生成一個動態庫或者靜態庫。
av 大致結構與 ZOA 通訊庫加入安卓體系示意圖:
注:由於第二層 mediadrm 模組庫目錄過多不便展開,但原理又是相同,所以僅對該模組展示骨架資訊;綠色部分代表會產生一個庫檔案,mediadrm 只是骨架結構所以未標識。
本次是將寫好對應的 Android.bp 檔案的 ZOA 通訊庫原始碼目錄整個複製到 av 目錄下,並在 av 目錄下的 Android.bp 檔案中加入 ZOA 通訊庫的目錄。
cd /data/source2/frameworks/av/
進入 av 模組
vi Android.bp
開啟 av 模組的 Android.bp 檔案,並將 ZOAMQLib 目錄加入其中
ZOA 通訊庫加入 av 模組的 Android.bp 圖示:
然後在 ZOAMQLib 目錄下直接執行 mm 命令,編譯出安卓體系下的 ZOA 通訊庫。
五、插樁編譯流程
1.生成 json 檔案
android 原始碼在進行編譯時他會將所有的 Android.bp 中的資訊提取出來並新增一些編譯資訊來生成一個 build.ninja 檔案。該檔案中含有編譯的模組、原始碼和編譯引數等資訊。
透過 android 自帶的 ninja 工具可以將該 build.ninja 檔案轉化為包含原始碼路徑、原始碼名字和編譯引數資訊的 json 檔案;再透過工具可以將要插樁模組的部分提取出來生成該模組的插樁 json 檔案
生成 json 檔案的命令:
/data/source2/prebuilts/build-tools/linux-x86/bin/ninja -t compdb g.cc.cc > compile_commands.json
其中/data/source2/為安卓原始碼路徑
2.插樁程式碼
shell 編譯器可以透過該 json 檔案對該模組進行插樁或還原操作。
插樁程式碼命令 shell 的路徑/shell -p json 檔案的路徑/ compile_commands.json
還原始碼命令 shell 的路徑/shell -r json 檔案的路徑/ compile_commands.json
本次插樁與還原命令:
/data/shell/bin/shell -p /data/source2/compile_commands.json
/data/shell/bin/shell -r /data/source2/compile_commands.json
插樁成功後在客戶端重新載入版本資料:
3.編譯連結
連結通訊庫
cd /data/source2/frameworks/av/camera
進入 camera 目錄下
vi Android.bp
開啟 camera 模組的 Android.bp 檔案並在 shared_libs 中加入 ZOA 通訊庫的名字
camera 的 Android.bp 加入 ZOA 通訊庫連結圖示:
加入標頭檔案
cp /data/shell/include/ZoaInstru.h /data/source2/frameworks/av/camera/include/
將 ZOA 的標頭檔案加入被插樁的 camera 的標頭檔案夾中
然後就可以按照正常的編譯流程來進行編譯,執行 mm 編譯該模組。
插樁編譯圖示:
六、測試方式
本例是將安卓原生 8.1.0 程式碼進行插樁後,放入谷歌官方 8.1.0 系統並獲得 root 許可權的手機中進行測試
本次插樁的是 av 模組的 camera 部分,所以我們將
camera 模組庫:
/data/source2/out/soong/.intermediates/frameworks/av/camera/libcamera_client/android_arm64_armv8-a_shared_core/libcamera_client.so
ZOA 通訊庫:
/data/source2/out/soong/.intermediates/frameworks/av/ZOAMQLib/libZOAMQLib/android_arm64_armv8-a_shared_core /libZOAMQLib.so
這兩個庫放進手機的/system/lib64/目錄中開機進行相機測試。
測試概念圖:
將被測手機開機後用 usb 線連線到電腦上,採用 adb 埠對映的方法將程式執行時產生的動態資料傳輸到星雲精準測試工具上,再透過示波器進行波形展示。
資料傳輸圖:
在星雲精準測試工具客戶端開啟示波器介面,建立測試用例並選擇測試用例後點選 開始 並對手機進行相機功能的操作就可以在接收到動態資料並示波器看到波形了。
示波器接收資料圖:
七、精準測試 - 基礎功能
1.覆蓋率
在對測試用例錄製完成後就可以在主介面看到覆蓋率等相關資訊。
在函式列表中隨便點開一個函式就可以檢視該函式的各項覆蓋率。
1.SCO 覆蓋率
SCO 覆蓋率即為語句塊覆蓋率,在函式內順序執行遇見 if、for、while 等就算為一個語句塊。
SC0 覆蓋率圖示:
2.MCDC 覆蓋率
MCDC 修訂條件判定覆蓋,精準測試中對 mcdc 做了量化展示,分別統計單一條件個數,針對每一個條件判斷是否滿足 mcdc 覆蓋如果滿足如上圖綠色表示條件滿足 mcdc 覆蓋,藍色表示不滿足。並對 MCDC 做了詳細資訊的展示(選擇 MCDC 覆蓋,點選判定,顯示 MCDC 的詳細資訊)
MCDC 覆蓋率圖示:
注:
1.覆蓋率資訊一共有七種,分別為 SCO 語句塊覆率、True、Flase、Both 等條件覆蓋率、Branch 條件分支覆蓋率、CDC 條件判定覆蓋率、MCDC 修正條件判定。
2.精準測試預設是不關聯原始碼的,如需要關聯原始碼使用,請將原始碼複製到客戶端本地,在版本上右鍵選擇修改原始碼路徑,然後新增原始碼路徑來關聯原始碼。
2.函式呼叫關係圖
函式呼叫圖,只有函式呼叫的關係,能夠比較清楚地看清函式呼叫的層次關係。當點選其中的某個函式時,能顯示以該函式為中心,呼叫該函式的上三層和下三層呼叫 (可點選設定層級進行層級的調整)。
當接收過動態資料後還能將各項資料顯示在影像介面中。
3.程式控制流程圖
控制流程圖基礎功能是展示函式的控制流程,即控制流程圖,用於表示函式的控制流程、顯示測試覆蓋率結果、實現半自動高效率測試用例設計,進行邏輯流程查錯,以及原始碼、測試用例和相關文件之間的雙向自動追溯等。
4.簡易控制流程圖
簡易控制流程圖功能,以語句塊的形式清晰的展示函式內部的控制邏輯,介面上可以直觀的看出控制流各節點的測試覆蓋情況,在展示中,簡易控制流程圖還可以透過顏色對每個程式塊進行覆蓋率標識,在縮圖中整個模組的覆蓋率非常直觀。(背景色為綠色表示有測試用例覆蓋到該塊)關聯原始碼後點選語句塊可定位到程式碼具體行。
5.雙向追溯
由於精準測試的測試用例與執行過的函式繫結,可以在測試臺透過選擇不同的測試用例來正向追溯找到它執行過的函式;或者透過選擇不同的函式或程式碼來反向追溯找到執行過它的測試用例。
正向追溯圖示:
該正向追溯是透過在左上側選擇測試用例來在下方展示該測試用例執行過的函式
反向追溯圖示:
反向追溯既可以透過左下角的函式來追溯執行過該函式的測試用例,還可以透過選擇程式碼塊來追溯執行過該塊的測試用例。
八、精準測試 - 高階分析功能
1.智慧迴歸測試用例選取
在第一個版本測試完成後對第二個版本進行插樁後就在星雲精準測試工具生成了第二個工程版本。此時我們要做的不是立馬對新版本進行測試,而是使用我們星雲精準測試的迴歸功能對新插樁的版本進行迴歸,它會根據版本之間程式碼的變化的來分析出與該函式相關的測試用例,然後根據測試用例內函式改變的多少進行迴歸優先順序的排序,智慧的推薦出需要重新跑的測試用例,以及顯示出不需要跑的測試用例。
智慧迴歸示例:
cd /data/source2/frameworks/av/camera 進入到 camera 目錄下
vi ICamera.cpp 開啟該原始碼進行修改
在 getParameters 函式中加入 if(1==1);條件
然後對 camera 模組進行插樁,再在客戶端使用選取回歸測試用例功能進行迴歸
由於 getParameters 函式內新增條件發生變化,所以執行過該函式的測試用例的迴歸計數就加一,然後該測試用例就被推薦出來需要重新去跑一遍。
迴歸圖示:
對精準測試而言,其是採用在測試階段,將測試用例和它所執行過的函式繫結的方法。在版本迭代時會將上一個版本的測試用例繼承下來,透過迴歸跟上個版本進行比較,哪個函式有了變化,那麼與其相關的測試用例的功能都可能會發生變化,所以在迴歸時會推薦出要重新測試的測試用例;而當一個測試用例裡面關聯的所有函式都沒發生變化時他的功能也不會發生變化,那麼此時再去測試一遍該用例是沒有意義的事情。所以,在新版本插樁完畢後和以前的進行迴歸後就可以看出哪些用例需要重新跑哪些完全不用再跑。
2.最後執行時序
該部分是執行插樁程式進行動態資料接收時儲存的最後五十個語句塊執行的時序關係圖
它可以點選每一步次序檢視執行塊的程式碼
3.聚類分析
聚類演算法中個數的設定是需要手動設定的,一般看顆粒度的粗細進行設定。聚類演算法是透過測試用例的程式碼相似程度得出結果的,所以可以幫助我們劃分出來有哪些測試用例的程式碼相似程度比較高,
本次共設計 7 個測試用例,兩次拍照、兩次錄影片、一次隨便側、一次開啟相機、一次開啟相機後閒置。
選擇分類個數為 5 後,聚類結果為:
切換為圖形模式為:
10、Web 報表
1.覆蓋率按日增長曲線圖
使用折線圖清晰的展現每天該版本覆蓋率的變化情況
左下角雷達圖展示了預期的各項覆蓋率與實際各項覆蓋看的差距
右下角對比了當前版本與最新版本各項覆蓋率的差異
2.測試漏洞的智慧分析
在一個程式中,往往有成百上千的函式,這些函式有的是關聯整個程式核心、有的則是開發人員棄而不用,但一直保留遲遲不肯刪除的,針對這些大量的函式,“精準測試” 採用透過靜態、動態指標的綜合分析,在大量的程式函式中,透過計算直接篩選潛在的高危的測試漏洞,透過報表給予展示。
當一個函式複雜度很高但覆蓋率卻很低的時候其出現風險的機率就可能比較高
當函式扇入扇出越大時,意味著其關聯函式越多,結合其覆蓋率資訊也可能是風險較高。
相關文章
- 【星雲測試】開發者測試-採用精準測試工具對SpringBoot應用進行測試Spring Boot
- 【星雲測試】Devops微服務架構下具有程式碼級穿透能力的精準測試dev微服務架構穿透
- 【星雲測試】開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 精準測試案例展示
- 【星雲測試】精準測試系列產品白皮書2020版
- 【星雲測試】開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試SpringGCCloud微服務穿透
- 【星雲測試】開發者測試(2)-採用精準測試工具對J2EE Guns開發框架進行測試框架
- 精準測試
- golang 表格驅動測試案例Golang
- 當程式碼變更遇上精準測試的總結
- 使用springboot對各層的程式碼進行測試!Spring Boot
- 精準測試實踐
- 開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 安卓小程式模擬定位測試安卓
- 攜程程式碼分析平臺實現精準測試與應用瘦身
- 精準測試方案 [部分原始碼整理中]原始碼
- 精準測試之覆蓋
- 軟體測試的底層邏輯
- 安卓下的串列埠測試安卓串列埠
- 在Docker中安裝PostgreSQL的ODBC驅動並新增Python測試程式碼DockerSQLPython
- 在Docker中安裝GaussDB的ODBC驅動並新增Python測試程式碼DockerPython
- 開發者測試(4)-採用精準測試工具對dubbo微服務應用進行測試微服務
- 關於安卓 sdk 測試安卓
- 開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試SpringGCCloud微服務穿透
- 《不測的祕密:精準測試之路》筆記筆記
- 安卓測試跟ios 測試有什麼區別?安卓iOS
- 精準化測試原理簡介
- 精準測試白皮書 2020 版
- 精準測試白皮書2020版
- golang 表格驅動測試Golang
- 網路底層測試方法淺談
- Laravel 測試驅動開發 -- 正向單元測試Laravel
- 開發者測試(2)-採用精準測試工具對J2EE Guns開發框架進行測試框架
- Devops微服務架構下具有程式碼級穿透能力的精準測試dev微服務架構穿透
- 精準測試:如何判斷兩次測試中哪次的質量更好?
- 談“測試驅動的開發”
- jtest 精準測試平臺開源
- 精準測試的軟體產品質量效率變化分析