從零開始玩轉 PerfDogService Demo解析篇


1.Demo文件夾

當下載好PerfDogService后文件夾是這個樣子的。

 


文件說明:

PerfDogService.exe: Service啟動文件,一般不用手工啟動,自動化腳本會自動啟動此程序。
perfdog.proto: grpc接口和protobuf結構體的定義文件
demo/python: python3的demo,依賴庫grpcio和protobuf
demo/java: java的demo,依賴庫grpc-netty-shaded, grpc-protobuf, grpc-stub
PerfDogService.jar: 服務所依賴的jar包

我們先不管其他,只專注於demo文件夾;
展開后是Java和Python兩種語言的Demo,我們本次只分析改造Python的

 


Python的Demo只有三個文件

 


Demo.py: 我們程序的執行入口,同時我們主要操作的也是這個文件;
perfdog_pb2.py: 此文件是由協議緩沖區編譯器生成,也就是由perfdog.proto這個文件生成的。我們不要修改它。
perfdog_pb2_grpc.py: 此文件是gRPC Python協議編譯器插件生成,也不要修改它
這里簡單介紹下==協議緩沖區==
協議緩沖區是是一種與語言無關,平台無關的數據序列化結構化機制;
只需要一次構造數據,然后就可以使用生成的特殊源代碼輕松地使用各種語言在各種數據流中寫入和讀取結構化數據;

 


你用python語言,你辛辛苦苦用python定義好了一堆字典啦或者Class啦或者其他什么數據,你想給隔壁老李用,然而老李用java啊,這時候隔壁小王也需要用,然而小王用C++啊,各種語言不能直接調用。這個時候通過協議緩沖區這種機制,先把你的數據編譯生成一種特殊的源代碼,老李和小王就可以調用這份源代碼了。

2.Demo.py文件解析

 

其實全篇只有一個Run函數,而且官方寫的注釋也比較清晰了,我們就來簡單看下吧

 


0到3其實沒什么好說的了,就是喚起PerfDogService服務,通過令牌和服務器建立了一個連接,其中stub除了建立連接還有好多其他的方法

 


接下來看看第四步

 

deviceEventIterator這里是一個可迭代對象,存放着當前所有的連接設備,例如Android啦,Ios,模擬器啦等等;

 


我們最常用的應該是device,這里保存着被測機型的uid,名字等。這里的uid就是當前連接設備的唯一標識,如果你安裝了ADB,可以在控制台輸入ADB devices查看你當期連接的設備信息,例如這樣:

 


5其實就是開始初始化設備
6是開始獲取當前被測設備的所有安裝的應用,應用保存在apps這個對象里,這也是一個可迭代對象,
迭代apps可以獲取到每個app,以及每個app的名字,包名,版本,Icon,是不是系統App,subVersion等等。

 

第7步這里實際上是獲取了當前被測設備的硬件信息,例如像CPU,型號,安卓版本之類的等等

 


第8步這里開始選擇要搜集的性能數據指標都有哪些,我這里多加了一個CPU Core的使用率
第9步就開始搜集性能數據了

 


采集性能數據信息實際上通過多線程的方式進行的,所以Sleep(20)就是采集20s的數據

 


10和11就是添加不同時間段的注釋

 


第12步是兩個操作
1.上傳整個數據到雲端
2.導出第5秒到20秒的數據到本地,其中導出路徑可以自己更改(outputDirectory)

 


13最后停止測試,不過其實進程沒停止,如果此時你啟動Perfdog客戶端,可能會顯示這個錯誤。

 


此時去Kill掉這個java進城就可以了。

 

3.Demo簡單修改

由於我個人的需求1是不想每次配置都挨行代碼修改,2是為后續搭建自定義的雲性能測試平台做鋪墊,所以簡單修改了下代碼:源代碼未刪,僅是注釋掉了,方便做對比;
1.提取常用配置
2.需要提前配置好需要測試的對應設備
3.需要提前配置好要測試的APP(配置APP的名字)
4.只上傳一份數據到雲端,
5.保存到本地的數據不會從中間截取某段時間了。

# -*- coding: utf-8 -*- import subprocess import time import traceback import grpc import perfdog_pb2_grpc import perfdog_pb2 import threading class Config(): PERFDOGSERVER_PATH=r'C:\Users\Administrator\Desktop\perfdog\PerfDogService.exe' #PerfDogService的路徑 TOKEN='XXXXXXXXXXXXXXXXXXXX '#token DEVICES_UID="813QEDTE228ZK" #需要測試的手機序列號 APP_NAME="天氣" #需要測試的app名字 TEST_TIMER=11 #需要測試時長 LABEL="this is a label" #label內容 NOTE="this is a note" #note內容 CASENAME="天氣測試數據" #用例描述 ,會覆蓋相同用例名字的數據 SAVEDATA_BEGINTIME=1 #導出到本地數據的開始時間(秒) SAVEDATA_ENDTIME=20 #導出到本地數據的結束時間(秒) OUTPUT="F:\\perfdog_service_output\\" #導出文件所保存的目錄, SAVEDATA_TYPE=perfdog_pb2.EXPORT_TO_JSON #導出文件所保存的類型, # 第一次運行demo前需要通過pip安裝grpcio(1.23.0)和protobuf(3.10.0) def run(): try: # 在代碼里啟動PerfDogService或手動啟動PerfDogService print("0.啟動PerfDogService") # 1.**************************填入PerfDogService的路徑 perfDogService = subprocess.Popen(Config.PERFDOGSERVER_PATH) # 等待PerfDogService啟動完畢 time.sleep(5) print("1.通過ip和端口連接到PerfDog Service") options = [('grpc.max_receive_message_length', 100 * 1024 * 1024)] channel = grpc.insecure_channel('127.0.0.1:23456', options=options) print("2.新建一個stub,通過這個stub對象可以調用所有服務器提供的接口") stub = perfdog_pb2_grpc.PerfDogServiceStub(channel) print("3.通過令牌登錄,令牌可以在官網申請") userInfo = stub.loginWithToken(perfdog_pb2.Token(token=Config.TOKEN)) print("UserInfo:\n", userInfo) print("4.啟動設備監聽器監聽設備,每當設備插入和移除時會收到一個DeviceEvent") deviceEventIterator = stub.startDeviceMonitor(perfdog_pb2.Empty()) for deviceEvent in deviceEventIterator: # 從DeviceEvent中獲取到device對象,device對象會在后面的接口中用到 device = deviceEvent.device print("當前devices: ",device," **** ",deviceEvent) # time.sleep(20000) if deviceEvent.eventType == perfdog_pb2.ADD and device.uid==Config.DEVICES_UID: print("設備[%s:%s]插入\n" % (device.uid, perfdog_pb2.DEVICE_CONTYPE.Name(device.conType))) # 每台手機會返回兩個conType不同的設備對象(USB的和WIFI的),如果是測有線,取其中的USB對象 if device.conType == perfdog_pb2.USB: print("5.初始化設備[%s:%s]\n" % (device.uid, perfdog_pb2.DEVICE_CONTYPE.Name(device.conType))) stub.initDevice(device) print("6.獲取app列表") appList = stub.getAppList(device) # apps = appList.app app_index = 0 for app in apps: print('%s: %s->%s' % (app_index, app.label, app.packageName)) if app.label==Config.APP_NAME: app_select=app_index break else: app_index += 1 app_select=None if app_select is None:app_select = int(input("未安裝輸入APP,請選擇要測試App: ")) app = apps[app_select] print("7.獲取設備的詳細信息") deviceInfo = stub.getDeviceInfo(device) print("8.開啟性能數據項") stub.enablePerfDataType( perfdog_pb2.EnablePerfDataTypeReq(device=device, type=perfdog_pb2.NETWORK_USAGE)) stub.enablePerfDataType( perfdog_pb2.EnablePerfDataTypeReq(device=device, type=perfdog_pb2.NORMALIZED_CPU_CORE_USAGE)) print("9.開始收集[%s:%s]的性能數據\n" % (app.label, app.packageName)) print(stub.startTestApp(perfdog_pb2.StartTestAppReq(device=device, app=app))) req = perfdog_pb2.OpenPerfDataStreamReq(device=device) perfDataIterator = stub.openPerfDataStream(req) def perf_data_process(): for perfData in perfDataIterator: print(perfData) threading.Thread(target=perf_data_process).start() # 采集一些數據 time.sleep(Config.TEST_TIMER) print("10.設置label") stub.setLabel(perfdog_pb2.SetLabelReq(device=device, label="I am a label")) time.sleep(3) print("11.添加批注") stub.addNote(perfdog_pb2.AddNoteReq(device=device, time=5000, note="I am a note")) print("12.上傳和導出所有數據") saveResult = stub.saveData(perfdog_pb2.SaveDataReq( device=device, caseName=Config.CASENAME, # web上case和excel的名字 uploadToServer=True, # 上傳到perfdog服務器 exportToFile=True, # 保存到本地 outputDirectory=Config.OUTPUT, dataExportFormat=Config.SAVEDATA_TYPE )) print("保存結果:\n", saveResult) # print("12.上傳和導出第5秒到20秒的數據") # stub.saveData(perfdog_pb2.SaveDataReq( # device=device, # beginTime=5000, # 指定開始時間 # endTime=20000, # 指定結束時間 # caseName="case2", # web上case和excel的名字 # uploadToServer=True, # 上傳到perfdog服務器 # exportToFile=True, # 保存到本地 # outputDirectory="F:\\perfdog_service_output\\", # dataExportFormat=perfdog_pb2.EXPORT_TO_EXCEL # )) print("13.停止測試") stub.stopTest(perfdog_pb2.StopTestReq(device=device)) print("over") break elif deviceEvent.eventType == perfdog_pb2.REMOVE: print("設備[%s:%s]移除\n" % (device.uid, perfdog_pb2.DEVICE_CONTYPE.Name(device.conType))) except Exception as e: traceback.print_exc() if __name__ == '__main__': run() #

性能測試技術交流群:720150565

查看PerfDog詳情:https://perfdog.qq.com/?ADTAG=media.dev_website


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM