app的专项测试
常見的apk專項測試主要有一下幾類
1.)穩定性
2.)安全性
3.)兼容性
4.)版本升級
5.)流量測試
1.穩定性測試
穩定性測試是指對應用進行長時間的操作,檢測功能是否穩定。一般穩定性測試時間是 N*12小時。項目中穩定測試多采用monkey,進行隨機測試。
測試方法:
1、跑monkey
adb shell monkey -p packageName -v -v -v --throttle 500 -s 4 --ignore-crashes --ignore-timeouts --ignore-security-exceptions times(次數) |logcat -v time > e:\log\monkeyLog.txt(日志保存路徑)
參數:
-p : 指點包名,如果要指定多個包名,需多個-p參數
-v : 指定日志的詳細程度,取值1-3,三個 -v 詳細程度最高
-throttle : 指定用戶操作時的時延,單位毫秒
-s : 指定偽隨機數生成器的seed值,取值1-10,當seed相同,產生的事件序列也相同
–ignore-crashes : 指應用程序崩潰,monkey依然發送事件,直到事件數完成
–ignore-timeouts: 指應用程序發生ANR,monkey依然發送事件,直到事件數完成
–ignore-security-exceptions: 指應用程序發生許可錯誤,monkey依然發送事件,直到事件數完成
|logcat -v time: 給monkey命令的日志加上時間
2、日志解析
穩定性測試是否能通過在于日志,需要把日志里的報錯日志搜索出來,開發定位問題。
1)、用Notepad++打開日志
2)、ctrl + F
3)、分析exception日志,定位問題。
二、安全測試
如果平時不接觸安全測試,安全測試就像一個盲區,我也是有一個同事負責項目預置版本需要對安全方面進行測試,利用空余時間,琢磨了一二,其中看到了一些不錯的博客,能對安全測試有個系統了解,我覺得這是有必要的。
移動安全測試的一些總結:http://blog.51cto.com/laoyinga/2155341
常見的安全漏洞 :https://blog.csdn.net/zhangcanyan/article/details/51347629
在自己的項目測試中,安全測試就是利用一些安全輔助平臺對被測應用進行測試,主要用到兩個安全輔助平臺:騰訊哈勃分析系統 和 VirusTotal(一個可疑文件分析服務的網站)以及drozer(安全測試工具)。
測試方法:
1、將app在 https://www.virustotal.com/ 掃描,獲取報告
2、將app在 https://habo.qq.com/ 掃描,獲取報告
******* 如果有報錯日志,給開發看,他們會分析的是否需要修復還是忽略 *******
3、利用drozer進行安全滲透測試
drozer是一款綜合的安全評估和攻擊的android框架,全面評估app的安全性,并幫助團隊把app的安全風險保持在可控范圍內。安卓組件是構成安卓應用的基礎,其中有四大組件是我們安全滲透測試的關注點。
四大組件:
1)、activities ---- 控制用戶UI,處理用戶在智能手機屏幕上的交互
2)、services ----無須可視化界面,提供后臺長時間運行的功能
3)、Broadcast Receivers ---- 處理安卓應用程序與安卓系統之間的通信
4)、Content Providers ---- 處理數據與數據庫之間的管理問題
測試步驟:
(安裝drozer, drozerAgent.apk, 配置java, jdk,adb,這里我就不闡述了~~~)
1、手機和PC端相連,在PC上使用adb命令進行端口轉發,到drozer使用的端口:31415
adb forward tcp:31415 tcp:31415
2、在手機上打開drozer agent.apk,選擇embedded server ---->enable
3、cmd命令窗口切到drozer安裝路徑,開啟drozer console
在開始使用測試之前,首先得熟悉一些drozer命令:
https://blog.csdn.net/cch139745/article/details/53519900 (drozer命令大全)
以下就只介紹用的多的drozer命令噠~
a、list -----列出所有模塊
附錄:(APP模塊的作用說明)
APP模塊
模塊名 ------------------------ 作用
app.activity.forintent : 通過intent查找它的activity
app.activity.info : 獲取activities信息
app.activity.start : 開啟 Activity
app.broadcast.info : 獲取broadcast receivers信息
app.broadcast.send : 發送廣播
app.broadcast.sniff : 嗅探廣播中intent的數據
app.package.attacksurface :確定安裝包的可攻擊面
app.package.backup : 列出可備份的包
app.package.debuggable: 列出可debug的包
app.package.info : 獲取已安裝包的信息
app.package.launchintent: 獲取程序啟動的activity信息
app.package.list : 手機已安裝的程序包
app.package.manifest : 獲取程序manifest文件信息
app.package.native : 列出Native libraries 信息
app.package.shareduid : 查找擁有共同uid的包和他們所有的權限
app.provider.columns : 展示content provider URI的各列
app.provider.delete : 刪除content provider URI的內容
app.provider.download : 使用openInputStream讀取指定uri的內容,并下載在電腦中
app.provider.info : 獲取 content providers信息
app.provider.insert : 插入數據到content provider
app.provider.query : 查詢content provider 內容
app.provider.read : 使用openInputStream讀取指定uri的內容
app.provider.update : 更新content provider的內容
app.service.info : 獲取services的信息
app.service.send : 使用 Message攻擊暴露的service,其service實現了handleMessage
app.service.start : 開啟服務
app.service.stop : 停止服務
b、run 模塊名 -h ----查看某個模塊的參數
c、run app.package.list ----- 列出手機上安裝了的應用
run app.package.list -f 篩選字 ----搜索特定的包名
d、run app.package.info -a 包名 -----獲取包名的詳細信息
測試步驟:
1、確定攻擊面
安全滲透測試在我的淺薄的理解中,就是看能不能對暴露組件進行攻擊,導致敏感數據泄漏到安裝在同一設備上的其他應用程序上。一般來說,應用程私有組件只能被當前應用啟動,不能被其他應用啟動相對是安全的。當一個應用程序的組件暴露,就可以被第三方的應用任意調用,可能導致敏感信息泄露、拒絕服務、權限提升繞過,界面劫持、遠程代碼執行等安全漏洞。
run app.package.attacksurface packageName
還是存在很多的潛在風險的。接下來就是對這些暴露的組件進行攻擊。
補充:組件暴露漏洞檢測規則
每一個組件在Manifest.xml定義,都有一個android:exported屬性,滿足以下兩種情況都認為是有組件暴露漏洞的:1、顯式設置exported屬性為true;2、沒有顯式設定exported值,但組件下面有intent filter,這樣組件exported默認值也為true。
2、對暴露的組件進行攻擊
1)、Activities
應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。暴露的activity意味著可以被導出。
查看暴露的activities:
run app.activites.info -a packageName
在這里插入圖片描述
啟動暴露的activity:
run app.activity.start --component packageName activityName
2)、Service
service是一個沒有用戶界面的程序,可以用來開發后臺服務或者監控類的程序和執行比較耗時的后臺任務。例如,當音樂播放器退出用戶界面之后,還需要繼續播放,通常會使用Context.startService()來啟動一個后臺服務,來保持音樂的持續播放。
查看暴露的service:
run app.service.info -a packageName
提升權限:
run app.service.start
(平時沒有用到這一塊,有興趣的可以自己研究下~~~~~)
3)、Content Providers
每個應用程序都會有些數據存儲,Content Provider使一個應用程序的指定數據集提供給其他應用程序,例如通訊錄、信息和通話記錄等。
查看暴露的provider:
run app.provider.info -a packageName
瀏覽可以訪問的Uri:
run scanner.provider.finduris -a packageName
獲取Uri的數據:
run app.provider.query 可以訪問的Uri
如果查詢到數據,就說明存在漏洞。就可以對數據進行SQL注入,獲取表中的數據等。
(這些可以訪問的uri是facebook對外暴漏的,也是無法獲取到其數據的,根據自己應用的uri,可以排查,后面就只是介紹下常用的操作噠~)
SQL注入:(指利用現有應用程序,將惡意的SQL命令注入到后臺數據庫執行一些惡意的操作)
可以根據這些參數的使用嘗試著對可訪問的Uri進行操作。當你SQL注入的時候,如果報錯就證明存在SQL注入。
檢測sql注入和目錄遍歷:
run scanner.provider.injection -a packageName
run scanner.provider.traversal -a packageName
4)、Broadcast Receivers
應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收并做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它并獲取消息。
利用intent對組件的觸發一般有兩類漏洞,一類是拒絕服務(broadcast),一類的權限提升(service)。拒絕服務危害性比較低,更多的只是影響應用服務質量;而權限提升將使得沒有該權限的應用可以通過intent觸發擁有該權限的應用,從而幫助其完成越權行為。
查看暴漏的broadcast:
run app.broadcast.info -a packageName
嘗試拒絕服務攻擊檢測,向廣播組件發送不完整intent:
1)、空action
run app.broadcast.send --component com.hatsune.eagleee ReceiverName
2)、空extras
run app.broadcast.send --action android.intent.action.xxx
總的來說,使用drozer做安卓安全滲透測試需要對drozer命令和android組件比較熟悉。
三、兼容測試
兼容性測試主要是對app在各類機型上的兼容、適配等情況進行測試,而且用戶體驗是評價一個產品好壞的重要指標,所有做出來的軟件,盈利的軟件,最終是交付給用戶。所以兼容性測試也是一個很重要的測試項。兼容性測試常見的便是:
1、移動端設備的版本號測試
2、手機屏幕的分辨率測試
3、 新老版本兼容測試
(一個app, 一次次迭代,就會有多個版本在市場上被使用,新版本的開發不應該影響到舊版本,尤其是出現一次版本改動比較大,或者重構應用的時候,回歸多個老版本是必不可少的測試點,當然并不是要測試到每個點,修改的部分需著重測試,可以和開發溝通了解,了解可能影響的點,有針對性的測試)
測試點:
1、主要流程能正常運行
2、界面沒有錯位、重疊,展示不全等不美觀問題
3、舊版本可能影響的模塊主要功能可以正常運行
測試方法:
1、準備多臺測試機 (-----top排行的手機基本足夠)
(因為公司是做手機,不缺測試機,一般我準備至少5臺不同安卓版本,不同分辨率的手機,對新功能版本號,分辨率進行測試)
版本號:功能正常運行。
分辨率:頁面美觀,無錯位,重疊,展示不全等問題。
(以下是我項目組的測試報告中的兼容性測試~~~~)
在這里插入圖片描述
2、云測試
針對個人開發者、初創公司,以及App比較單一的公司,沒有足夠多的測試機,是可以使用兼容性云測服務的。目前很多的公司,已經提供了兼容性云測服務,例如TestIn、TestBird,除此,大型公司也對外推出自己的測試工具,比如谷歌、騰訊WeTest、百度MTC、阿里MQC等等。
eg: 以下是TestIn兼容性測試執行界面
testIn測試報告,很詳細:
用還是很好用的,就是得收費。其他的也差不多,可以去體驗下。
3、自主研發兼容性自動化測試平臺
無論是國際知名App,還是國內知名App,谷歌、Facebook,BAT等,他們都有大量的App對外推出,對于App兼容性要求非常高。這些公司的兼容性測試,都有一個相同的解決方案,那就是自動化測試框架與平臺的實現,但是這個成本是比較高的。不僅要有自己測試的實驗室,還要擁有大量的手機,還有一整套的自動化測試平臺。
當然我不會,但是也是一個努力的方向啊,本公司是制作手機的,正好擁有這些條件,今年10月份測試部自主研發一套兼容性自動化測試平臺,滿滿的膜拜啊,正在內部試用中。
四、版本升級
在項目中版本升級是一個很重要的測試項,每次版本的迭代都需要測升級,去驗證升級之后主要功能是否正常。一般情況下,正常用戶升級自己的軟件,無異于三種途徑:1、根據app彈出的升級提示框選擇升級; 2、自己到應用商店或者其他渠道下載升級。3、強制升級。然而其本質都是:覆蓋安裝。將最新的app下載到手機的sdcard上,然后安裝覆蓋掉舊版本的apk。
測試點:
1、正常升級
2、跨版本升級
3、強制升級
在傳音,先后進入了兩個項目團隊,對于升級測試,也有些不同。
第一個項目團隊是一個管理應用,并沒有上到市場上,升級測試也比較簡單,主要操作就是:
1)、在數據庫中修改版本號,客戶端彈出升級提示,點擊升級或者不升級。(用多個版本進行測試,是否都能升到最新版本,且功能正常)。
2)、如果是強制升級,將強制升級的字段修改成強制升級。那么所有的版本在打開應用的時候都會自動升級。(同樣用多個版本測試,是否都能升到最新版本,且功能正常)。
第二個項目團隊是一個新聞應用,有上到市場上,可以在GooglePlay下載。
測試方法:
1)、安卓設備上先安裝一個最近的舊版本
adb install apk路徑
在這里插入圖片描述
2)、將新版本push到手機的sdcard上
adb push 新版本apk路徑 /mnt/sdcard
在這里插入圖片描述
3)、在File Manager 文件管理中選擇剛push的apk,點擊安裝
4)、查看新版apk是否已經覆蓋安裝了舊版本,且功能正常
5)、然后卸載最新的apk, 設備上裝上前幾個版本,重復上面,進行跨版本升級測試。
6)、測試通過之后,上到GP或者應用商店等渠道后,驗證一遍,功能正常就算完成啦~
五、流量測試
應用的耗流也是用戶的一個重要關注點,一是節省用戶的使用成本,二是流量優化能帶來響應速度的優化,
三是能清楚的知道每個場景需消耗的流量,確認是否有能優化的空間。
測試點:
1、首次啟動到全部加載完成耗流(冷啟動)
2、非首次啟動到全部加載完成耗流(熱啟動)
3、后臺運行耗流
4、運行某個場景消耗的總流量
測試方法:
1、使用測試工具 Emmagee或者GT
1)、安裝應用待測apk,安裝Emmagee
2)、首次啟動–打開Emmagee,選擇被測應用,待頁面全部加載完成(Net Traffic數值趨于穩定)
測試流量的時候除了項目定的一些標準,還會和市場上競品進行對比。對于產品來說,尤其是同類產品,數據是最重要的。以下是我項目組的測試報告里流量測試的輸出:
2、使用安卓系統自帶的TCP流量計數進行人工計算
1)、查找app對應的Uid
方法1:adb shell dumpsys package packageName |grep userId=
方法2:adb shell ps |grep packageName --------先獲取pid,第二列
adb shell cat /proc/{pid}/status |grep Uid
2)、計算下行(下載)和上行(上傳)流量情況
步驟:
1、獲取當前下行(下載)流量
adb shell cat /proc/uid_stat/{Uid}/tcp_rcv
啟動app至徹底啟動,運行上面命令
2、獲取當前上行(上傳)流量
adb shell cat /proc/uid_stat/{Uid}/tcp_sd
啟動app至徹底啟動,運行上面命令
注意:
1)、啟動APP后的流量應多嘗試幾次,當不操作APP且流量值不變化時為準。
2)、此方法雖測出對應場景的上下行流量,但是無法進行具體的剖析,要定位查 找問題需要使用第三種方法
3、使用tcpdump+wireshark抓包分析(流量異常情況)
上面的兩種方法,都是直接對總的流量進行統計,如果發現某刻操作流量值異常增大,就需要我們定位到具體的請求來查找問題。 對于異常流量的分析,使用tcpdump+wireshark.
tcpdump(需獲取root權限)是Linux系統下的一款抓包命令集,是基于網卡抓取流動在網卡上的數據包。tcpdump攔截和顯示發送或收到過網絡連接到該機器的TCP/IP和其他數據包,簡單說就是監控手機的進出網絡數據。因為android本身也是一個Linux系統,所以也有對應的tcpdump。
wireshark是一個網絡封包分析軟件,擷取網絡封包,并盡可能顯示出最為詳細的網絡封包資料。wireshark使用WinPCAP作為接口,直接與網卡進行數據報文交換。
注意:如果我們需要測試某一個App消耗的流量就需要禁用其他APP的連網權限。
測試方法:
1、手機需獲取root權限,可以根據自己手機的機型版本號在度娘上找對應的刷機版本號(user debug版本),或者找可以刷機的工具一鍵root。
2、下載tcpdump,push到手機上
下載地址:http://www.strazzere.com/android/tcpdump
adb push tcpdump路徑 手機路徑
3、切換到root用戶,執行抓包命令
參數:
“-p”:不使用混雜模式
“-n”:不把網絡地址轉換成名字
“-s 0”:-s參數用以指定數據包捕獲長度,此處指定為0,表示抓取完整的數據包
“-vv”:輸出詳細的報文信息
4、打開wireshark對數據包進行分析
下載地址:https://www.wireshark.org/download.html
(后面這一塊自己也是一知半解,以后get到了,再補上~~~~~~~)
六、實際項目中的測試項
一個版本的迭代到上線,最終要輸出的一個測試通過的報告,才會正式上線。測試報告中應包含了項目團隊這一次版本的所有內容。根據我團隊的項目(新聞類app),測試報告大體包括:
1、Release Note (羅列此版本迭代和修改優化的功能點)
2、測試用例 (功能點)
3、穩定性測試(跑monkey,對日志、內存進行分析)
4、內存泄漏 (連續500次的登陸退出) ----(monkeyrunner)寫的腳本~~
5、性能測試(內存+CPU)
5、兼容性測試 (版本號、分辨率)
6、安全測試 (安全網站掃描)
7、流量測試 (測試工具統計:emmagee)
8、功耗測試 (測試工具統計:emmagee)
(現在都是快速迭代,只有大版本的時候才測得這么細,但是兼容,穩定、內存每個版本都要測)
MonkeyTestUI測試穩定性:
除了我在上面專項測試中提到的測試方法,在實際測試中,我是用的是我們團隊自己研發的一個MonkeyTestUI工具,相比通過adb命令的無圖形界面以及生成的日志只能自己寫腳本循環遍歷,然后查找出Expection來對日志進行分析,定位問題。MonkeyTestUI就沒有那么繁瑣,首先,MonkeyTestUI它是圖形界面,無需寫adb命令;可以同時對多臺手機進行Monkey測試;其次,生成的日志可直接掃描,自動生成execl報表,并統計出異常的個數以及是哪個層次的異常,除此之外,還能自動生成內存變化曲線圖(是可以定位一些可能存在的內存問題的)。
MonkeyTestUI界面
注意:被測應用monkey測試的時候,要選擇白名單
內存曲線:
在這里插入圖片描述
跑monkey,還有一個重要的點就是:對日志分析,查找報錯的日志,然后定位問題。
傳統的測試方法,就像我上面提到的穩定性測試一樣,需自己搜索整理出異常日志。MonkeyTestUi不需要這么麻煩,只需要把某個設備生成的日志直接在異常掃描工具(aee.exp_logv2.4_windows.exe)中掃描即可。如果有報錯的日志,會自動生成result.xls.
具體操作如下:
1)跑Monkey生成的內存和日志地址
2)掃描日志
結果解析:
(生成的掃描結果只會記錄異常的日志)
a、如果沒有異常日志,resule.xls則是空白
b、Statistics.txt,統計報錯的個數
注意事項:
掃描之前,先要將Monkey日志的 .dbg文件默認打開方式為aee_extract.exe。
3)掃描內存
生成的報告:(峰值過高或者一直增長是需要關注的,很有可能存在風險)
?
總結
- 上一篇: 电脑自动安装软件怎么办?
- 下一篇: SHA MD5用法