腦洞
最近腦洞有點兒大钟些,最開始是想給自己的測試平臺添加手動執(zhí)行用例的功能,又覺得沒有一個很好的展示蒋困,所以想著要實時展示手機上的內(nèi)容,輸出到web頁面敬辣,但是覺得有點難啊雪标。
想了一下,還是換個方式吧溉跃,每個case執(zhí)行完畢村刨,都可以看到實時的錄像。這樣也許可行撰茎,哈哈哈嵌牺!
準備條件
- 一臺安卓機
- appium環(huán)境
基礎知識
-
adb命令
adb大家應該很熟悉,簡單的說就是個連接手機和電腦的工具龄糊,哈哈哈逆粹,簡單粗暴。
我們常用的adb命令有:
adb devices
查看已經(jīng)連接上的安卓設備adb logcat
查看安卓日志
具體的大家可以自己去百度下炫惩。
不過這里要講的是adb錄屏的命令~
我們連上安卓手機后僻弹, 在cmd窗口輸入命令:
adb shell screenrecord /sdcard/test.mp4
image.png
這時候其實手機上的內(nèi)容已經(jīng)開始錄制了~
我為了偷懶,就照搬這位兄弟的博客了~~!傳送門在此
image.png
注意
這里的adb命令開始錄制以后他嚷,不管是否正常結束蹋绽,都會保存文件芭毙,所以我們可以把錄制時間放長一點,到時候關閉就好了卸耘。
思路
因為用例是以一個class為單位的退敦,就算這個class有很多個test開頭的測試用例函數(shù),所以我這里是以一個class類為單位存儲視頻的鹊奖。
第一步
用例在setUp的時候苛聘,開啟錄制~
第二步
用例在tearDown的時候, 結束錄制~
第三步
用例結束錄制以后忠聚,使用adb命令將mp4文件拉取到本地硬盤上,供web頁面展示唱捣,或者將本地文件放入測試報告里作為超鏈接訪問两蟀。(但是此種方法不被Chrome瀏覽器支持)
開始勞作
import unittest
from time import sleep
class TestCase(unittest.TestCase)
@classmethod
def setUpClass(cls):
print("[{}]--正在執(zhí)行登陸初始化操作: {}".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開始的時候又會調(diào)用adb,這個pull還沒結束拣宰,第二個adb又開始了党涕,導致拉取的文件異常,無法播放巡社。 - subprocess
這個是Python調(diào)用控制臺命令的方法膛堤,后面的CREATE_NEW_CONSOLE是新起一個命令窗口。
優(yōu)化:
- sleep
應該有更好的辦法解決, 暫時還沒有考慮到更好的辦法~
- 手機垃圾文件清理
暫時還沒有做