工作專案經驗總結(1)-- 投影儀自動化測試 (Android)

西米發表於2024-08-06

在極米主要負責顯示及影像方向:(AK 自動梯形校正、AF 自動對焦、AL 環境光自適應、光機、3D 等模組)
從這幾個業務維度,開始思考如何去完成自動化測試及自動化測試架構實現:

通訊方式

由於是投影儀基於安卓,所以一般情況的通訊方式:adb:Android Debug Bridge(安卓除錯橋);但是考慮到其穩定性影響較大,我們引用了串列埠通訊,當時沒有具體瞭解其通訊協議。

軟體基本架構

自己本身也不太專業,所以按照自己的想法來做的,沒有所謂的設計模式。
由於需要底層通訊:

通訊層(comm_layer)
  - comm_serial.py:基於串列埠通訊
       - __init__:初始化串列埠連線,傳入引數埠(獲取當前電腦串列埠,一個就預設傳入,多個就傳參,上層UI選擇)
       - getSerialStatus:獲取當前開機狀態,串列埠是否可輸入(此介面主要用於重啟後的檢測,判斷是否已經可以開始執行自動化);while透過不斷地去下發root指令,判斷回顯回覆包含來判斷可輸入狀態。
       - getRoot:獲取root許可權(不同平臺許可權命令不一致,有點需要輸入密碼):while迴圈根據串列埠返回值判斷是否已經su成功
       - getControlNum:獲取當前匹配遙控器event值,根據模擬傳送keyevent鍵值,然後透過dumpsys input去grep和awk獲得響應的keyevent,即為當前配對的遙控器鍵值。(為什麼需要這個?不用全input keyevent指令呢?因為我們有時候需要模擬使用者手動調焦距,需要壓測一直點按遙控器,試過keyevent的當時不行,用的是sendevent方式)
       - getCmd:下發指令到串列埠,此處有個預設引數cmd_type="down",是為了判別只是下發指令還是需要檢索回顯,有的命令不需要看到回顯去判斷是否下發成功
       - checkLogs:判斷回顯中是否包含對應tag,透過下發指令後,不斷地readlines,來判斷每一行中是否有對應的tag,找到就退出,模擬下發ctrl+c終止檢索(主要是檢視logcat是否有對應tag;也可以傳送其他指令)
  - comm_adb.py:基於adb通訊(主要使用的是串列埠),這裡不詳細介紹
底層介面層:(interface_layer)
  - basic_camera.py:主要封裝一些常用的攝像頭操作的函式:
        -  __init__:初始化usb攝像頭,傳入攝像頭的num(會檢索當前連線的攝像頭裝置)
        - cameraCheck:除錯攝像頭,會開啟一個攝像頭視窗,然後透過手動調節曝光和焦距將攝像頭畫面調節至清晰狀態,關閉視窗即退出
        - screenCap:拍照存圖,此介面呼叫一次則存一張圖,可傳入flag代表重複使用,可以節省初始化和開啟攝像頭的時間操作
        - getImageVar:獲取當前幀/圖片清晰度,使用了cv2.Laplacian 拉普拉斯運算元,傳入灰度圖,和影像深度,即可獲得當前幀/圖片清晰度值
  - basic_env.py:主要是為了獲取當前系統的環境變數值(不同晶片平臺的系統採用了不同的儲存方式)
        - platformDict:儲存了當前所有平臺代號
        - get_platform:獲取當前系統平臺cat /proc/cpuinfo| grep Hardware,透過呼叫getCmd,獲取回顯,然後用於platformDict字典
        - getAllCri:線上查詢當前環境變數,某些平臺用到了自己開發的環境變數,沒有用安卓原生的env
        - getAllEnv:線上查詢當前環境變數。(這裡正常環境變數只能進入recovery查詢,但是調研發現環境變數是掛載到了某個分割槽,透過查詢找到其掛載分割槽,然後去cat讀取分割槽檔案,實時訪問)
  - logger.py:主要用於日誌儲存,進行了分段和時間戳儲存
封裝層(package_layer):主要根據當時模組進行分類。
  - action_ak.py:主要根據業務測試來封裝相應介面功能(開機AK(重啟實現)、位移AK(暫時未做)、快捷選單AK、setting觸發AK等),基本都是業務流程,某些涉密,就不方便說,也沒什麼難點;有兩個自己覺得的量亮點吧
        - 所有流程均會去判斷校驗:app -> system -> 驅動(攝像頭、tof、步進電機)-> 顯示(光機) - > 演算法
        - 使用了一些裝飾器去做:比如每次開始自動花錢為了避免其他裝置影響,會先遮蔽藍芽遙控器配對等
  - action_3d.py:主要就是在不同格式影片場景下去做3D切換,透過拍照和日誌tag及拍照來多重確認是否切換成功
  - action_af.py:和AK類似,不同業務場景下的介面
使用者層(user_layer)
  - 使用tkinter寫了一個介面,用pyinstaller打包成可執行檔案,讓業務人員可以無成本使用
  - 基本流程就是選擇對應的模組、檢測串列埠、連線串列埠、選擇對應的串列埠號、選擇對應指令碼、選擇壓測次數、選擇攝像頭、選擇日誌和圖片儲存路徑、除錯攝像頭、開始測試、右側會有對應的日誌實時列印

總結

單獨講一下清晰度判斷是如何使用的:首先先找到當前環境下最清晰的影像:首先透過 sendevent 將步進電機調節至最左側 PI 位置 --> 開始迴圈調節步進電機(最小步進)--> 呼叫清晰度函式,獲取當前清晰度並存圖 --> 記錄當前步進電機所處位置 --> 依次迴圈,直到步進電機到最大步數;此時再用 matplotlib 繪製影像,基本可以獲得一個類似於正弦曲線的影像,然後再給定一個判斷區間(最優清晰度左右 5% 閾值作為清晰的判斷依據)--> 再進行業務場景壓測 --> 每次壓測對焦完成傳入當前幀,獲取清晰度和清晰閾值進行比較,大於清晰閾值代表此次對焦清晰,小於代表不清晰,拍照並記錄當前步進電機馬達位置
1、從業務角度出發,開發能力其實不那麼重要,最核心是要能解決問題即可
2、溝通能力是非常必要的,寫這個工具過程中有很多需要給對應模組的研發人員請教(日誌 TAG、命令如何調起某些功能、使用研發內嵌到系統的某些功能元件(顯示組大佬寫了一個 lua 指令碼,可以實時檢視很多日誌上或者命令上無法看到的內容))
3、其實現在回過頭來看,覺得當時的框架太 low 了,還有很多很多需要完善的地方,這其實就是成長的過程。

這個專案基本就是這樣了,有很多不足的地方希望各位大佬指出!

相關文章