腦洞
最近腦洞有點兒大,最開始是想給自己的測試平台添加手動執行用例的功能,又覺得沒有一個很好的展示,是以想着要實時展示手機上的内容,輸出到web頁面,但是覺得有點難啊。
想了一下,還是換個方式吧,每個case執行完畢,都可以看到實時的錄像。這樣也許可行,哈哈哈!
準備條件
- 一台安卓機
- appium環境
基礎知識
- adb指令
adb大家應該很熟悉,簡單的說就是個連接配接手機和電腦的工具,哈哈哈,簡單粗暴。
我們常用的adb指令有:
-
adb devices
檢視已經連接配接上的安卓裝置
-
adb logcat
檢視安卓日志
具體的大家可以自己去百度下。
不過這裡要講的是adb錄屏的指令~
我們連上安卓手機後, 在cmd視窗輸入指令:
adb shell screenrecord /sdcard/test.mp4

這時候其實手機上的内容已經開始錄制了~
我為了偷懶,就照搬這位兄弟的部落格了~~
!傳送門在此注意
這裡的adb指令開始錄制以後,不管是否正常結束,都會儲存檔案,是以我們可以把錄制時間放長一點,到時候關閉就好了。
思路
因為用例是以一個class為機關的,就算這個class有很多個test開頭的測試用例函數,是以我這裡是以一個class類為機關存儲視訊的。
第一步
用例在setUp的時候,開啟錄制~
第二步
用例在tearDown的時候, 結束錄制~
第三步
用例結束錄制以後,使用adb指令将mp4檔案拉取到本地硬碟上,供web頁面展示,或者将本地檔案放入測試報告裡作為超連結通路。(但是此種方法不被Chrome浏覽器支援)
開始勞作
import unittest
from time import sleep
class TestCase(unittest.TestCase)
@classmethod
def setUpClass(cls):
print("[{}]--正在執行登陸初始化操作: {}".format(datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"), cls.__name__))
# 錄屏
cls.replay = subprocess.Popen(r"adb shell screenrecord "
r"/sdcard/{}.mp4 --time-limit 600".format(cls.__name__),
creationflags=subprocess.CREATE_NEW_CONSOLE)
def test_01(self):
pass # 這裡其實最好多一些操作,不然視訊一下就結束了,看不到效果
@classmethod
def tearDownClass(cls):
# 終止錄像
cls.replay.terminate()
# 這裡我的cls.conf是個配置檔案, 擷取到錄像儲存的路徑然後mp4的名字是以用例class命名的
replay_path = os.path.join(cls.conf.get_value("replay_path"), "{}.mp4".format(cls.__name__))
sleep(2)
# 這裡的pull是指從sdcard擷取檔案到本地硬碟,
subprocess.Popen(r"adb pull /sdcard/{}.mp4 {}".format(cls.__name__, replay_path),
creationflags=subprocess.CREATE_NEW_CONSOLE)
# 等待視訊拉取完畢
sleep(6)
注意:
-
第一個sleep
為了等用例停止錄制後有個緩沖時間~
-
第二個sleep
為了pull的時候等檔案完全pull完畢,不然下一個case開始的時候又會調用adb,這個pull還沒結束,第二個adb又開始了,導緻拉取的檔案異常,無法播放。
-
subprocess
這個是Python調用控制台指令的方法,後面的CREATE_NEW_CONSOLE是新起一個指令視窗。
優化:
- sleep
應該有更好的辦法解決, 暫時還沒有考慮到更好的辦法~
- 手機垃圾檔案清理
暫時還沒有做