zoukankan      html  css  js  c++  java
  • app专项测试自动化测试方法思路与实现

    秉着个人意愿打算把python+rf接口自动进行彻底结束再做些其它方面的输出~但事与愿违,但领导目前注重先把专项测试方面完成,借此,先暂停python+rf(主要是与Jenkins集成+导入DB+微信告警)接口自动化,且目前个人觉得前面讲解的python+rf可以说基本完成了接口自动化测试前期和后续的核心工作了,转而介绍下app专项测试方面的指标检查~

    介绍app专项自动化具体实现前,先谈一下我的思路(如下图),若有不妥,欢迎斧正~

    步骤一:循环执行&指标获取,准确点来说是实现循环启动某个页面(adb shell am start)时指标数据获取

    具体实现可以看下核心代码

    __author__ = 'niuzhigang'
    # -*- coding: utf-8 -*-
    #encoding=utf-8
    
    import os  
    import time
    import datetime
    import sys
    import subprocess
    
    import xlwt
    from tempfile import TemporaryFile
    from xlwt import Workbook
    
    dir = r'C:Users
    iuzhigangDesktoppacketautoScript'
    print dir
    
    now_time = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    print now_time
    
    print (os.getcwd())
    os.chdir(dir)
    print (os.getcwd())
    
    if os.path.exists("TotalTime.log")==True:
        os.remove("TotalTime.log")
    if os.path.exists("StartAppDalvikPss.log")==True:
        os.remove("StartAppDalvikPss.log")
    if os.path.exists("StartAppNativePss.log")==True:
        os.remove("StartAppNativePss.log")
    if os.path.exists("StartAppTOTALPss.log")==True:
        os.remove("StartAppTOTALPss.log")
    if os.path.exists("AppCpuThr.log")==True:
        os.remove("AppCpuThr.log")
        
    restartAppCrashlog = os.popen("adb logcat | findstr /I XXX | findstr /I Crash >> XXXCrash.log")
    restartAppAlllog = os.popen("adb logcat | findstr /I XXX  >> XXXAll.log")
    restartAllCrashlog = os.popen("adb logcat | findstr /I Crash >> AllCrash.log")
    
    for i in  range(1000):
        try:
            restartAppTotalTime = os.popen("adb shell am start -W  -S com.XXX.app.ui/.homepage.LaunchActivity | findstr TotalTime >> TotalTime.log")
            time.sleep(5)
            #print restartAppTotalTime.read();
            for x in range(5):
                StartAppTOTALPss = os.popen("adb shell dumpsys meminfo -a com.XXX.app.ui | findstr TOTAL >> StartAppTOTALPss.log")  
                #print StartAppTOTALPss.read();
                StartAppTOTALPss = os.popen("adb shell dumpsys meminfo -a com.XXX.app.ui | findstr Native  | findstr Heap >> StartAppNativePss.log")  
                #print StartAppTOTALPss.read();
                StartAppTOTALPss = os.popen("adb shell dumpsys meminfo -a com.XXX.app.ui | findstr Dalvik  | findstr Heap >> StartAppDalvikPss.log")  
                #print StartAppTOTALPss.read();
                restartAppCpuThr = os.popen("adb shell top  -d 1 -n 2 -m 1 -s cpu | findstr com.XXX.app.ui >> AppCpuThr.log")
                #print restartAppCpuThr.read();
            time.sleep(2)
            #强制杀死进程
            StopApp = os.popen("adb shell am force-stop com.XXX.app.ui")
            time.sleep(1)
            StartApp = os.popen("adb shell am start -W  -n com.XXX.app.ui/.homepage.LaunchActivity")
            time.sleep(5)
            OnceStopApp = os.popen("adb shell am force-stop com.XXX.app.ui")
            time.sleep(1)
        except Exception,e:
            print Exception,":",e
            #print "在没有出现异常的情况下执行的循环次数为:"+i
            #出现异常点击返回键退出APP程序
            BackKeyStart = os.popen("adb shell input keyevent 4")
            time.sleep(1)
            BackKeyEnd = os.popen("adb shell input keyevent 4")
            #出现异常按home键
            HomeKeyStart = os.popen("adb shell input keyevent 3")
            #强制杀死进程
            StopApp = os.popen("adb shell am force-stop com.XXX.app.ui")
            time.sleep(1)
            continue
            
        
        

    首先针对这个专项目前我只收集了cpu、Thr、totaltime、jni层和java层的pss、crash

    感兴趣的同学可以收集battery,network等~

    再说明下第一次force-stop了为什么我又做了app的重启操作之后再force-stop app呢?

    原因1:不属于重启的异常导致手机异常没办法再次拉起app(系统异常),原因2:内部异常也可能导致无法下次start正常以至于程序出现假死的情况。

    因此在正常start的情况下收集完本次循环中指标数据又做了下面的start和force-stop操作,当然这次启动我是不记录指标的~

    最后说明下为什么做了except操作,可能系统导致程序运行出现异常的情况下也是有可能的,所以做了一系列的手机回到home操作后重启app后,跳出本次异常继续执行下一个循环~

    当然,上面的except不一定都是出现这个情况,可以根据实际情况来下,当然写的多了异常考虑我觉得会更好~因为不能在设定的循环过程中没执行完就结束本次循环~

    步骤二:指标处理&指标导入,准确点来说就是通过adb命令无法把每项具体的指标以一个list方法展现,因此我们要对搜集到的指标数据按照一定格式进行处理,把每个指标进行剥离后导入excel或者DB

    说明下,我写的导入DB的脚本不是从txt里面读取的数据~而是excel

    首先大家可以看下从txt读入excel(主要包括数据剥离和数据计算)

    __author__ = 'niuzhigang'
    # -*- coding: utf-8 -*-
    #encoding=utf-8
    import os  
    import time
    import datetime
    
    import xlwt
    from tempfile import TemporaryFile
    from xlwt import Workbook
    
    dir = r'C:Users
    iuzhigangDesktoppacketautoScript'
    print dir
    
    now_time = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    print now_time
    
    print (os.getcwd())
    os.chdir(dir)
    print (os.getcwd())
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableTotalTime = file.add_sheet('TotalTime')
    #每列给出名称
    tableTotalTime.write(0,0,'TotalTime')
    #写出第二列的平均值名称
    tableTotalTime.write(0,1,'AvgTotalTime')
    
    
    
    TotalTimefpath = r'C:Users
    iuzhigangDesktoppacketautoScriptTotalTime.log'
    #打开文件并读取
    f = open(TotalTimefpath,'r')
    line = f.readlines()
    len = 1 
    SumTotalTime = 0
    for item in line:
        #转为list
        list = item.split( )
        TotalTime = list[1]
        print u"TotalTime耗时为:"+TotalTime+"ms"
        tableTotalTime.write(len,0,float(TotalTime))
        len = len + 1
            #获取totaltime总值
            SumTotalTime += float(TotalTime)
    print u"TotalTime总耗时为:"+str(SumTotalTime)
    #求平均值
    AvgTotalTimeint = SumTotalTime/(len-1)
    print  AvgTotalTimeint
    #获取TotalTime的平均值且保留2位小数
    AvgTotalTime = float('%.2f' % AvgTotalTimeint)
    tableTotalTime.write(1,1,AvgTotalTime)
    print AvgTotalTime
    f.close()
    #保存excel并命名
    file.save('TotalTime.xlsx')
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableTOTALPss = file.add_sheet('TOTALPss')
    #每列给出名称
    tableTOTALPss.write(0,0,'TOTALPss')
    #写出第二列的平均值名称
    tableTOTALPss.write(0,1,'AvgTOTALPss')
    
    
    
    
    TOTALPssfpath = r'C:Users
    iuzhigangDesktoppacketautoScriptStartAppTOTALPss.log'
    #打开文件并读取
    f = open(TOTALPssfpath,'r')
    line = f.readlines()
    len = 1
    SumTOTALPss = 0
    for item in line:
        #转为list
        list = item.split( )
        TOTALPss = list[1]
        print u"TOTALPss占用大小为:"+TOTALPss+"Kb"
        # print TOTALPss 并存入excel为整数类型
        tableTOTALPss.write(len,0,float(TOTALPss))
        len = len + 1
             #获取TOTALPss总值
            SumTOTALPss += float(TOTALPss)
        print len
    print u"SumTOTALPss总pss为:"+str(SumTOTALPss)
    #求平均值
    AvgTOTALPssint = SumTOTALPss/(len-1)
    print  AvgTOTALPssint
    #获取TOTALPss的平均值且保留2位小数
    AvgTOTALPss = float('%.2f' % AvgTOTALPssint)
    tableTOTALPss.write(1,1,AvgTOTALPss)
    print AvgTOTALPss
    f.close()
    #保存excel并命名
    file.save('TOTALPss.xlsx')
    
    
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableNativePss= file.add_sheet('NativePss')
    #每列给出名称
    tableNativePss.write(0,0,'NativePss')
    #写出第二列的平均值名称
    tableNativePss.write(0,1,'AvgNativePss')
    
    
    NativePssfpath = r'C:Users
    iuzhigangDesktoppacketautoScriptStartAppNativePss.log'
    #打开文件并读取
    f = open(NativePssfpath,'r')
    line = f.readlines()
    len = 1
    SumNativePss = 0
    for item in line:
        #转为list
        list = item.split( )
        NativePss = list[2]
        print u"NativePss占用大小为:"+NativePss+"Kb"
        # print Cpu  并存入excel为整数类型
        tableNativePss.write(len,0,float(NativePss))
        len = len + 1
            #获取TOTALPss总值
            SumNativePss += float(NativePss)
    print u"SumNativePss总pss为:"+str(SumNativePss)
    #求平均值
    AvgNativePssint = SumNativePss/(len-1)
    print  AvgNativePssint
    #获取TOTALPss的平均值且保留2位小数
    AvgNativePss = float('%.2f' % AvgNativePssint)
    tableNativePss.write(1,1,AvgNativePss)
    print AvgNativePss
    f.close()
    #保存excel并命名
    file.save('NativePss.xlsx')
    
    
    
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableDalvikPss= file.add_sheet('DalvikPss')
    #每列给出名称
    tableDalvikPss.write(0,0,'DalvikPss')
    #写出第二列的平均值名称
    tableDalvikPss.write(0,1,'AvgDalvikPss')
    
    
    
    DalvikPssfpath = r'C:Users
    iuzhigangDesktoppacketautoScriptStartAppDalvikPss.log'
    #打开文件并读取
    f = open(DalvikPssfpath,'r')
    line = f.readlines()
    len = 1
    SumDalvikPss = 0
    for item in line:
        #转为list
        list = item.split( )
        DalvikPss = list[2]
        print u"DalvikPss占用大小为:"+DalvikPss+"Kb"
        # print Cpu  并存入excel为整数类型
        tableDalvikPss.write(len,0,float(DalvikPss))
        len = len + 1
            #获取TOTALPss总值
            SumDalvikPss += float(DalvikPss)
    print u"SumDalvikPss总pss为:"+str(SumDalvikPss)
    #求平均值
    AvgDalvikPssint = SumDalvikPss/(len-1)
    print  AvgDalvikPssint
    #获取TOTALPss的平均值且保留2位小数
    AvgDalvikPss = float('%.2f' % AvgDalvikPssint)
    tableDalvikPss.write(1,1,AvgDalvikPss)
    print AvgDalvikPss
    f.close()
    #保存excel并命名
    file.save('DalvikPss.xlsx')
    
    
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableCpu = file.add_sheet('AppCpuResult')
    tableThr = file.add_sheet('AppThrResult')
    #每列给出名称
    tableCpu.write(0,0,'%Cpu')
    tableThr.write(0,0,'Thr')
    #写出第二列的平均值名称
    tableCpu.write(0,1,'AvgCpu')
    tableThr.write(0,1,'AvgThr')
    
    AppCpuThrfpath = r'C:Users
    iuzhigangDesktoppacketautoScriptAppCpuThr.log'
    
    #打开文件并读取
    f = open(AppCpuThrfpath,'r')
    line = f.readlines()
    len = 1
    SumCpu = 0
    SumThr = 0
    for item in line:
        #转为list
        list = item.split( )
        cpu = list[2]
        Thr = list[4]
        print u"cpu利用率为:"+cpu+u" 线程数为:"+ Thr
        # 截取字符串%
        Cpu = cpu.rstrip('%')
        # print Cpu  并存入excel为整数类型
        tableCpu.write(len,0,float(Cpu))
        tableThr.write(len,0,float(Thr))
        len = len + 1
            #获取cpu总值
            SumCpu += float(Cpu)
            #获取cpu总值
            SumThr += float(Thr)
    print u"SumCpu总cpu为:"+str(SumCpu)
    print u"SumThr总thr为:"+str(SumThr)
    #求平均值
    AvgCpuint = SumCpu/(len-1)
    AvgThrint = SumThr/(len-1)
    print  AvgCpuint
    print  AvgThrint
    #获取Cpu和Thr的平均值且保留2位小数
    AvgCpu = float('%.2f' % AvgCpuint)
    AvgThr = float('%.2f' % AvgThrint)
    tableCpu.write(1,1,AvgCpu)
    tableThr.write(1,1,AvgThr)
    print AvgCpu
    print AvgThr
    f.close()
    #保存excel并命名
    file.save('AppCpuThrResult.xlsx')
    
    
    
    
    if os.path.exists("TotalTime.log")==True:
        os.rename("TotalTime.log",now_time+"TotalTime.log")
    if os.path.exists("StartAppTOTALPss.log")==True:
        os.rename("StartAppTOTALPss.log",now_time+"StartAppTOTALPss.log")
    if os.path.exists("StartAppNativePss.log")==True:
        os.rename("StartAppNativePss.log",now_time+"StartAppNativePss.log")
    if os.path.exists("StartAppDalvikPss.log")==True:
        os.rename("StartAppDalvikPss.log",now_time+"StartAppDalvikPss.log")
    if os.path.exists("AppCpuThr.log")==True:
        os.rename("AppCpuThr.log",now_time+"AppCpuThr.log")
        


    这个脚本我目前一方面主要是完成数据剥离和计算,另一方面进行了保存,保留了历史记录!!!详细的说明都是excel操作,我就不多说了,不懂的可以私信或者留下评论~

    好了,数据导入excel,数据从txt转入excel大家可以从下图(拿CPU举例~)视觉上看下变化,数据怎么剥离、怎么导入、怎么计算的~

    TXT格式的数据截图:

    EXCEL格式的数据截图:

     

    一般来说接下来就要考虑根据数据出图~那我们就按照一般的思路来出图,根据excel列表数据画图~

    借助matplotlib插件库,这个我就粗略的介绍下根据excel列表数据如何自动化画出伸缩图,就给大家晒下py脚本吧~

    不多余介绍,都是简单方法的使用完成图的自动伸缩,因为这个方式感觉很笨拙~为什么笨拙?下面就会讲~

    __author__ = 'niuzhigang'
    # -*- coding: utf-8 -*-
    #encoding=utf-8
    import numpy as np
    import matplotlib.pyplot as plt
    
    #X,Y轴数据
    y = [20,59,11,12,16,20,15,12,16,21,34,48,11,15,18,16,17,17,11,25,16,9,10,18,16,18,18]
    #计算list y的长度
    ylen = len(y)
    #print ylen 
    #(开始值、终值 、元素个数作为X坐标目的实现X轴自动伸缩)
    xArray = np.linspace(0,ylen,ylen,endpoint=False)
    #list与array互相转换,转为list
    x = xArray.tolist()
    print x
        
    #创建绘制图像像素大小
    #plt.figure(figsize=(15,10))
    #在当前绘图对象绘图(XY轴数据,红色实线,线宽度)
    plt.plot(x,y,"c",linewidth=1)
    #X轴标题
    #plt.xlabel("line")
    #Y轴标题
    plt.ylabel("date")
    #图标题
    plt.title("Cpu%")
    #显示网格
    plt.grid(True)
    #显示图
    plt.show()
    #保存图
    plt.savefig(r"C:Users
    iuzhigangDesktoppacketautoScriptCpu.png")

    说了通过excel画图很笨拙,为什么?原因一:不是UI的方式展现,看起来不方便(想想如果做成报表是不是很好)原因二:死的就是死,没有你想的维度查看、对比等等~

     那么接下来,我就讲下导入DB的操作

    步骤三:导入DB,具体脚本如下,目前主要从平均值、具体版本执行过程中抓取的详细数据

    平均值的目的暂时是做成不同版本之间比较,详细数据目的是检查本版本此指标的走势~

    有个问题说下:为什么设置版本(var)为变量,因为目前没有什么好的办法主动获取版本号~

    如果其他上神有思路的话可以提供下~

    __author__ = 'niuzhigang'
    # -*- coding: utf-8 -*-
    #encoding=utf-8
    
    
    import MySQLdb
    import xlrd
    
    #版本号
    ver = "'9.1.0'"
    #页面activity
    pageActivity = "'homepage.LaunchActivity'"
    
    #连接数据库
    conn= MySQLdb.connect(
            host='10.10.30.200',
            port = 3306,
            user='mobtest',
            passwd='XXX520',
            db ='test',
            )
    #创建游标目的操作数据库
    cur = conn.cursor()
    
    #通过游标cur 操作execute方法来创建表
    cur.execute("create table if NOT EXISTS AutoTest_AvgTotalTime(id int NOT NULL auto_increment primary key ,totalTimeAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllTotalTime(id int NOT NULL auto_increment primary key ,totalTimeAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    cur.execute("create table if NOT EXISTS AutoTest_AvgTOTALPss(id int NOT NULL auto_increment primary key ,totalPssAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllTOTALPss(id int NOT NULL auto_increment primary key ,totalPssAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    cur.execute("create table if NOT EXISTS AutoTest_AvgNativePss(id int NOT NULL auto_increment primary key ,totalPssAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllNativePss(id int NOT NULL auto_increment primary key ,nativePssAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    cur.execute("create table if NOT EXISTS AutoTest_AvgDalvikPss(id int NOT NULL auto_increment primary key ,totalPssAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllDalvikPss(id int NOT NULL auto_increment primary key ,dalvikPssAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    cur.execute("create table if NOT EXISTS AutoTest_AvgCpu(id int NOT NULL auto_increment primary key ,cpuAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllCpu(id int NOT NULL auto_increment primary key ,cpuAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    cur.execute("create table if NOT EXISTS AutoTest_AvgThr(id int NOT NULL auto_increment primary key ,thrAvgResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    cur.execute("create table if NOT EXISTS AutoTest_AllThr(id int NOT NULL auto_increment primary key ,thrAllResult varchar(255) ,excVersion varchar(255),excPage varchar(255),excTerminal varchar(255) NOT  NULL DEFAULT 'App',creatTime timestamp  NOT NULL DEFAULT NOW() )")
    
    
    #读取平均值并插入mysql
    path = r'C:Users
    iuzhigangDesktoppacketautoScriptTotalTime.xlsx'
    wb = xlrd.open_workbook(path)
    tableTotalTime = wb.sheets()[0]
    TotalTimeValue = tableTotalTime.cell(1, 1).value
    TotalTime = str(TotalTimeValue)
    print u"启动耗时为:"+ TotalTime
    #插入totaltime平均值
    cur.execute("insert into AutoTest_AvgTotalTime values(DEFAULT," + TotalTime + "," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #捕获到有效数据的行数
    nrows=tableTotalTime.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allTotalTimeValue=tableTotalTime.cell(line_num,0).value
            allTotalTime = str(allTotalTimeValue)
            print allTotalTime
            #插入本迭代执行所有totaltime
            cur.execute("insert into AutoTest_AllTotalTime values(DEFAULT,"+allTotalTime+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    
    
    
    #读取平均值并插入mysql
    path = r'C:Users
    iuzhigangDesktoppacketautoScriptTOTALPss.xlsx'
    wb = xlrd.open_workbook(path)
    tableTOTALPss = wb.sheets()[0]
    TOTALPssValue = tableTOTALPss.cell(1, 1).value
    TOTALPss = str(TOTALPssValue)
    print u"TOTALPss为:"+ TOTALPss
    #插入TOTALPss平均值
    cur.execute("insert into AutoTest_AvgTOTALPss values(DEFAULT," + TOTALPss + "," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #捕获到有效数据的行数
    nrows=tableTOTALPss.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allTOTALPssValue=tableTOTALPss.cell(line_num,0).value
            allTOTALPss = str(allTOTALPssValue)
            print allTOTALPss
            #插入本迭代执行所有TOTALPss
            cur.execute("insert into AutoTest_AllTOTALPss values(DEFAULT,"+allTOTALPss+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    
    
    
    #读取平均值并插入mysql
    path = r'C:Users
    iuzhigangDesktoppacketautoScriptNativePss.xlsx'
    wb = xlrd.open_workbook(path)
    tableNativePss = wb.sheets()[0]
    NativePssValue = tableNativePss.cell(1, 1).value
    NativePss = str(NativePssValue)
    print u"NativePss为:"+ NativePss
    #插入NativePss平均值
    cur.execute("insert into AutoTest_AvgNativePss values(DEFAULT," + NativePss + "," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #捕获到有效数据的行数
    nrows=tableNativePss.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allNativePssValue=tableNativePss.cell(line_num,0).value
            allNativePss = str(allNativePssValue)
            print allNativePss
            #插入本迭代执行所有NativePss
            cur.execute("insert into AutoTest_AllNativePss values(DEFAULT,"+allNativePss+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    
    
    
    #读取平均值并插入mysql
    path = r'C:Users
    iuzhigangDesktoppacketautoScriptDalvikPss.xlsx'
    wb = xlrd.open_workbook(path)
    tableDalvikPss = wb.sheets()[0]
    DalvikPssValue = tableDalvikPss.cell(1, 1).value
    DalvikPss = str(DalvikPssValue)
    print u"DalvikPss为:"+ DalvikPss
    #插入DalvikPss平均值
    cur.execute("insert into AutoTest_AvgDalvikPss values(DEFAULT," + DalvikPss + "," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #捕获到有效数据的行数
    nrows=tableDalvikPss.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allDalvikPssValue=tableDalvikPss.cell(line_num,0).value
            allDalvikPss = str(allDalvikPssValue)
            print allDalvikPss
            #插入本迭代执行所有DalvikPss
            cur.execute("insert into AutoTest_AllDalvikPss values(DEFAULT,"+allDalvikPss+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    
    
    
    #读取平均值并插入mysql
    path = r'C:Users
    iuzhigangDesktoppacketautoScriptAppCpuThrResult.xlsx'
    wb = xlrd.open_workbook(path)
    tableCpu = wb.sheets()[0]
    cpuValue = tableCpu.cell(1, 1).value
    cpu = str(cpuValue)
    print u"cpu利用率为:"+ cpu
    tableThr = wb.sheets()[1]
    thrValue = tableThr.cell(1, 1).value
    thr = str(thrValue)
    print u"thr数为:"+ thr
    #插入Cpu平均值
    cur.execute("insert into AutoTest_AvgCpu values(DEFAULT," + cpu + "," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #插入Thr平均值
    cur.execute("insert into AutoTest_AvgThr values(DEFAULT,"+thr+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
    #捕获到有效数据的行数
    nrows=tableCpu.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allCpuValue=tableCpu.cell(line_num,0).value
            allCpu = str(allCpuValue)
            print allCpu
            #插入本迭代执行所有cpu
            cur.execute("insert into AutoTest_AllCpu values(DEFAULT,"+allCpu+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    #捕获到有效数据的行数
    nrows=tableThr.nrows
    line_num = 0
    for i in range(nrows):
        #获取一行的所有值,每一列的值以列表项存在
        if i > 0:
            line_num += 1
            allThrValue=tableThr.cell(line_num,0).value
            allThr = str(allThrValue)
            print allThr
            #插入本迭代执行所有thr
            cur.execute("insert into AutoTest_AllThr values(DEFAULT,"+allThr+"," + ver + "," + pageActivity + ",DEFAULT,DEFAULT)")
        else:
            print u"数据为空"
    
    
    #关闭游标
    cur.close()
    #提交
    conn.commit()
    #关闭数据库连接
    conn.close(

    好了,导入数据sql的数据如下

    平均值方面:

    详细数据方面:

    后面就是APM读取数据且支持维度查询了~APM暂时不是我来搞,所以~~~……后续截图大家可以看下~

    补充 截图:平均趋势图如下:

    另外指标采集的数据比较多,画出来的详细图,相对来说不易观察,且点与点堆积比较密集,视觉上很不理想,因此对数据做了聚合之后再导入EXCEL以及DB的!

    处理方式为每10项数据求和后得出来的平均值导入EXCEL和DB!(不满足10条没在做平均值而是把不满足10条的数据没做处理直接导入)

    具体实现如下:

    __author__ = 'niuzhigang'
    # -*- coding: utf-8 -*-
    #encoding=utf-8
    import os  
    import time
    import datetime
    
    import xlwt
    from tempfile import TemporaryFile
    from xlwt import Workbook
    
    dir = r'C:Users
    iuzhigangDesktoppacketautoScript'
    print dir
    
    now_time = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    print now_time
    
    print (os.getcwd())
    os.chdir(dir)
    print (os.getcwd())
    
    
    
    #创建文件
    file = Workbook(encoding='utf-8')
    #创建sleet
    tableTotalTime = file.add_sheet('TotalTime')
    #每列给出名称
    tableTotalTime.write(0,0,'TotalTime')
    #写出第二列的平均值名称
    tableTotalTime.write(0,1,'AvgTotalTime')
    
    
    
    TotalTimefpath = r'C:Users
    iuzhigangDesktoppacketautoScriptTotalTime.log'
    #打开文件并读取
    f = open(TotalTimefpath,'r')
    line = f.readlines()
    a = 1
    SumTotalTime = 0
    TotalTimeArry = []
    TotalTimeArryNew = []
    offset = 0
    #每几项聚合求平均值
    step = 10
    for item in line:
        #转为list
        list = item.split()
        TotalTime = list[1]
            TotalTimeArry.append(int(TotalTime))
        # print u"TotalTime耗时为:"+TotalTime+"ms"
    # print TotalTimeArry
    length = len(TotalTimeArry)
    while offset < length:
        tmp = TotalTimeArry[offset:offset + step]
        # print tmp
        if len(tmp) == step:
                avg = 0
                for t in tmp:
                    avg += t
                avg /= float(step)
                TotalTimeArryNew.append(avg)
        else:
            for t in tmp:
                TotalTimeArryNew.append(t)
        offset += step
    
    print TotalTimeArryNew
    #计算聚合后的总值
    SumTotalTime = 0
    for x in TotalTimeArryNew:
        SumTotalTime += x
        tableTotalTime.write(a,0,float(x))
        a += 1
    # print a
    print  SumTotalTime
    #求平均值
    AvgTotalTimeint = SumTotalTime/(a-1)
    # print  AvgTotalTimeint
    #获取TotalTime的平均值且保留2位小数
    AvgTotalTime = float('%.2f' % AvgTotalTimeint)
    tableTotalTime.write(1,1,AvgTotalTime)
    print AvgTotalTime
    f.close()
    #保存excel并命名
    file.save('TotalTime.xlsx')

    执行结果前与后的对比:

    一:数量对比

    聚合前:

    聚合后:

    二:数值对比:

    聚合前:

    聚合后:

  • 相关阅读:
    journalctl命令
    systemctl命令
    AgileConfig
    优化 ASP.NET Core Docker 镜像的大小
    ASP.NET Core 集成 React SPA 应用
    使用SQL-Server分区表功能提高数据库的读写性能
    AgileConfig
    用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?
    Prometheus为你的SpringBoot应用保驾护航
    在冷风中我凌乱了半小时,只因健康码刷不出来
  • 原文地址:https://www.cnblogs.com/nzg-noway/p/6694655.html
Copyright © 2011-2022 走看看