Ejemplo n.º 1
0
 def __init__(self, excel, sheet, workbook, interval, durtime, package,
              lock):
     super(QThread, self).__init__()
     self.excel = excel
     self.interval = interval
     self.durtime = durtime
     self.package = package
     self.sheet = sheet
     self.workbook = workbook
     self.btn_enable = False
     self.lock = lock
     self.appData = Common.app_data(self)
     self.phoneModel = self.appData['phone_model']  #获取手机型号
     self.com = Common()
Ejemplo n.º 2
0
class CpuThread(QThread, Common):

    trigger = pyqtSignal(str, bool)

    def __init__(self, excel, sheet, workbook, interval, durtime, package,
                 lock):
        super(QThread, self).__init__()
        self.excel = excel
        self.interval = interval
        self.durtime = durtime
        self.package = package
        self.sheet = sheet
        self.workbook = workbook
        self.btn_enable = False
        self.lock = lock
        self.com = Common()

    def run(self):
        try:
            row = 0
            count = 0
            durtime = self.durtime.replace("min", "")
            interval = self.interval.replace("s", "")
            durtime = int(durtime) * 60
            interval = int(interval)
            interval_time = interval
            n = int(durtime / interval)
            n = str(n)
            cpuCore = 1

            name = self.get_package(self.package)
            interval = str(interval)
            # cmd_cpu = self.com.adb + " shell \"top -n " + n + " -d " + interval + " | grep \"" + name + "\"\""
            cmd_cpu = self.com.adb + " shell top -n " + n + " -d " + interval + " | find \"" + name + "\""
            # self.execshell("adb shell")
            # cmd_cpu = "top -n " + n + " -d " + interval + " | find \"" + name + "\""

            if self.check_adb(self.package) == 1:
                phoneInfo = self.com.app_data()
                phoneModel = phoneInfo['phone_model']

                # 兼容三星A9机型
                if 'OPPO-R9' in phoneModel:
                    # cmd_cpu = self.com.adb + " shell top -n " + n + " -d " + interval + " | find \"" + name + "\""
                    cmd_cpu = self.com.adb + " shell \"top -n " + n + " -d " + interval + " | grep \"" + name + "\"\""

                cpuInfo_res = self.execshell(self.com.adb +
                                             " shell \"cat /proc/cpuinfo\"")
                #获取cpu核数
                while cpuInfo_res.poll() is None:
                    cpuInfo = cpuInfo_res.stdout.readline().decode(
                        'utf-8', 'ignore')
                    if "cpu cores" in cpuInfo:
                        cpuCore = int(
                            re.findall("cpu cores\\t\:\s(\S*)", cpuInfo).pop())
                    elif "CPU architecture" in cpuInfo:
                        cpuCore = int(
                            re.findall("CPU architecture:\s(\d)",
                                       cpuInfo).pop())

                res = self.execshell(cmd_cpu)
                while res.poll() is None:
                    start_time = time.time()
                    sleep_interval = 0.001
                    line = res.stdout.readline().decode('utf-8', 'ignore')

                    cpuRes = re.findall('cn\.(\S+)', line)
                    if cpuRes:
                        cpuRes = "cn." + cpuRes.pop()

                    if name == cpuRes:
                        if line != "":
                            cpu = self.format_by_re('(\d+)\%', line)
                            if len(cpu) == 0:
                                cpu = re.split('\s+', line)
                                if cpu[0] == "":
                                    cpu = float(cpu[9])
                                else:
                                    cpu = float(cpu[8])
                                cpu = cpu / cpuCore
                                cpu = str(round(cpu, 1))
                            else:
                                cpu = cpu.pop()

                            self.lock['cpu'].acquire()
                            self.trigger.emit(cpu, self.btn_enable)
                            count += 1
                            row += 1
                            self.sheet.write(row, 0, count)
                            self.sheet.write(row, 1, float(cpu))
                            # print("#####cpu %d#####" %row)
                            self.lock['battery'].release()
                            # print("battery release %d" % (self.lock['battery'].available()))

                            while (time.time() - start_time
                                   ) * 1000000 <= interval_time * 1000000:
                                sleep_interval += 0.0000001
                                time.sleep(sleep_interval)
                            # end_time = time.time()
                            # print("#####cpu为%f######" % (end_time * 1000 - start_time * 1000))

                # print("cpu over")
                self.btn_enable = True
                self.trigger.emit('0', self.btn_enable)
                self.workbook.save(self.excel)
        except Exception:
            self.com.writeLog().info(traceback.format_exc())
Ejemplo n.º 3
0
class MyWindow(QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.init_Ui()
        self.com = Common()
        self.title = [
            u"COUNT", u"CPU(%)", u"MEM(M)", u"FPS", u"Wifi下行(KB/S)",
            u"Wifi上行(KB/S)", u"下载流量(MB)", u"上传流量(MB)", u"Wifi总流量(MB)",
            u"移动网络下行(KB/S)", u"移动网络上行(KB/S)", u"下载流量(MB)", u"上传流量(MB)",
            u"移动网络总流量(MB)", u"温度", "Drawcall", u"电量"
        ]
        self.excel_path = "D:\PerfReport"
        # self.create_excel()
        self.getData = 0

        BufferSize = 1  #同时并发的线程数
        FpsS = QSemaphore(BufferSize)  # cpu并发锁
        CpuS = QSemaphore(0)
        DrawcallS = QSemaphore(0)
        NetS = QSemaphore(0)
        MemS = QSemaphore(0)
        TempS = QSemaphore(0)
        BatteryS = QSemaphore(0)
        TimeS = QSemaphore(0)
        self.lock = {}  #并发锁词典
        self.lock['cpu'] = CpuS
        self.lock['fps'] = FpsS
        self.lock['drawcall'] = DrawcallS
        self.lock['net'] = NetS
        self.lock['mem'] = MemS
        self.lock['temp'] = TempS
        self.lock['battery'] = BatteryS
        self.lock['time'] = TimeS
        self.dw = Draw()
        self.isCollect = 0

    def init_Ui(self):
        self.setWindowTitle('性能测试自动化工具')
        self.resize(450, 170)

        self.centralwidget = QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_2 = QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")

        self.label = QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)

        self.excel_name = QLineEdit(self.centralwidget)
        self.excel_name.setObjectName("excel_name")
        self.excel_name.setEnabled(False)
        self.gridLayout.addWidget(self.excel_name, 0, 1, 1, 1)

        self.check_device = QPushButton(self.centralwidget)
        self.check_device.setObjectName("check_device")
        self.check_device.clicked.connect(self.check_device_fun)
        self.gridLayout.addWidget(self.check_device, 1, 2, 1, 1)

        self.open_dir = QPushButton(self.centralwidget)
        self.open_dir.setObjectName("open_dir")
        self.open_dir.clicked.connect(self.open_dir_fun)
        self.gridLayout.addWidget(self.open_dir, 0, 2, 1, 1)

        self.drawBtn = QPushButton(self.centralwidget)
        self.drawBtn.setObjectName("drawBtn")
        self.drawBtn.clicked.connect(self.draw)
        self.gridLayout.addWidget(self.drawBtn, 2, 2, 1, 1)

        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)

        self.test_package = QComboBox(self.centralwidget)
        self.test_package.setObjectName("test_package")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.test_package.addItem("")
        self.gridLayout.addWidget(self.test_package, 1, 1, 1, 1)

        self.label_2 = QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)

        self.interval_time = QComboBox(self.centralwidget)
        self.interval_time.setObjectName("interval_time")
        self.interval_time.addItem("")
        self.interval_time.addItem("")
        self.interval_time.addItem("")
        self.interval_time.addItem("")
        self.gridLayout.addWidget(self.interval_time, 2, 1, 1, 1)

        self.label_3 = QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
        self.during_time = QComboBox(self.centralwidget)
        self.during_time.setObjectName("during_time")
        self.during_time.addItem("")
        self.during_time.addItem("")
        self.during_time.addItem("")
        self.during_time.addItem("")

        self.timer = QtWidgets.QLabel(self.centralwidget)
        self.timer.setText("")
        self.timer.setObjectName("timer")

        self.gridLayout.addWidget(self.during_time, 3, 1, 1, 1)
        self.gridLayout.addWidget(self.timer, 3, 2, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.get_cpu = QPushButton(self.centralwidget)
        self.get_cpu.setObjectName("get_cpu")
        self.horizontalLayout.addWidget(self.get_cpu)
        self.get_cpu.clicked.connect(self.get_cpu_fun)

        self.stop_collect = QPushButton(self.centralwidget)
        self.stop_collect.setObjectName("stop_collect")
        self.horizontalLayout.addWidget(self.stop_collect)
        self.stop_collect.clicked.connect(self.stop_collect_fun)

        self.gridLayout_2.addLayout(self.horizontalLayout, 1, 0, 1, 1)

        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_cpu = QtWidgets.QLabel(self.centralwidget)
        self.label_cpu.setObjectName("label_cpu")
        self.horizontalLayout_2.addWidget(self.label_cpu)
        self.cpu_data = QtWidgets.QLabel(self.centralwidget)
        self.cpu_data.setText("")
        self.cpu_data.setObjectName("cpu")
        self.horizontalLayout_2.addWidget(self.cpu_data)
        self.label_mem = QtWidgets.QLabel(self.centralwidget)
        self.label_mem.setObjectName("label_mem")
        self.horizontalLayout_2.addWidget(self.label_mem)
        self.mem_data = QtWidgets.QLabel(self.centralwidget)
        self.mem_data.setText("")
        self.mem_data.setObjectName("mem")
        self.horizontalLayout_2.addWidget(self.mem_data)
        self.label_fps = QtWidgets.QLabel(self.centralwidget)
        self.label_fps.setObjectName("label_fps")
        self.horizontalLayout_2.addWidget(self.label_fps)
        self.fps = QtWidgets.QLabel(self.centralwidget)
        self.fps.setText("")
        self.fps.setObjectName("fps")
        self.horizontalLayout_2.addWidget(self.fps)
        self.gridLayout_2.addLayout(self.horizontalLayout_2, 2, 0, 1, 1)

        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_recieve = QtWidgets.QLabel(self.centralwidget)
        self.label_recieve.setObjectName("label_recieve")
        self.horizontalLayout_3.addWidget(self.label_recieve)
        self.recieve = QtWidgets.QLabel(self.centralwidget)
        self.recieve.setText("")
        self.recieve.setObjectName("recieve")
        self.horizontalLayout_3.addWidget(self.recieve)
        self.label_send = QtWidgets.QLabel(self.centralwidget)
        self.label_send.setObjectName("label_send")
        self.horizontalLayout_3.addWidget(self.label_send)
        self.send = QtWidgets.QLabel(self.centralwidget)
        self.send.setText("")
        self.send.setObjectName("send")
        self.horizontalLayout_3.addWidget(self.send)
        self.label_total = QtWidgets.QLabel(self.centralwidget)
        self.label_total.setObjectName("label_total")
        self.horizontalLayout_3.addWidget(self.label_total)
        self.total = QtWidgets.QLabel(self.centralwidget)
        self.total.setText("")
        self.total.setObjectName("total")
        self.horizontalLayout_3.addWidget(self.total)
        self.gridLayout_2.addLayout(self.horizontalLayout_3, 3, 0, 1, 1)

        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_drawcall = QtWidgets.QLabel(self.centralwidget)
        self.label_drawcall.setObjectName("label_drawcall")
        self.horizontalLayout_4.addWidget(self.label_drawcall)
        self.drawcall = QtWidgets.QLabel(self.centralwidget)
        self.drawcall.setText("")
        self.drawcall.setObjectName("drawcall")
        self.horizontalLayout_4.addWidget(self.drawcall)

        self.label_battery = QtWidgets.QLabel(self.centralwidget)
        self.label_battery.setObjectName("label_battery")
        self.horizontalLayout_4.addWidget(self.label_battery)
        self.battery = QtWidgets.QLabel(self.centralwidget)
        self.battery.setText("")
        self.battery.setObjectName("battery")
        self.horizontalLayout_4.addWidget(self.battery)

        self.label_tempe = QtWidgets.QLabel(self.centralwidget)
        self.label_tempe.setObjectName("label_tempe")
        self.horizontalLayout_4.addWidget(self.label_tempe)
        self.tempe = QtWidgets.QLabel(self.centralwidget)
        self.tempe.setText("")
        self.tempe.setObjectName("tempe")
        self.horizontalLayout_4.addWidget(self.tempe)
        self.gridLayout_2.addLayout(self.horizontalLayout_4, 4, 0, 1, 1)

        self.setLayout(self.gridLayout)
        self.setLayout(self.gridLayout_2)

        self.label.setText("存储的Excel文件名:")
        self.open_dir.setText("打开目录")
        self.excel_name.setPlaceholderText("默认存储到D盘PefReport目录")
        self.check_device.setText("检测设备")
        self.label_4.setText("选择测试包:")
        self.test_package.setItemText(0, "JJ斗地主")
        self.test_package.setItemText(1, "JJ比赛")
        self.test_package.setItemText(2, "JJ欢乐斗地主")
        self.test_package.setItemText(3, "单机斗地主")
        self.test_package.setItemText(4, "JJ捕鱼")
        self.test_package.setItemText(5, "JJ麻将")
        self.test_package.setItemText(6, "JJ象棋")
        self.label_2.setText("数据采集间隔:")
        self.interval_time.setItemText(0, "2s")
        self.interval_time.setItemText(1, "3s")
        self.interval_time.setItemText(2, "5s")
        self.interval_time.setItemText(3, "10s")
        self.label_3.setText("数据采集时长:")
        self.during_time.setItemText(0, "10min")
        self.during_time.setItemText(1, "30min")
        self.during_time.setItemText(2, "60min")
        self.during_time.setItemText(3, "90min")
        self.get_cpu.setText("开始采集数据")
        self.stop_collect.setText("停止采集数据")
        self.label_cpu.setText("实时CPU :")
        self.label_mem.setText("实时内存:")
        self.label_fps.setText("实时FPS:")

        self.label_total.setText("总流量 :")
        self.label_drawcall.setText("Drawcall:")
        self.label_send.setText("上行速度:")
        self.label_recieve.setText("下行速度:")
        self.label_tempe.setText("cpu温度:")
        self.label_battery.setText("实时电量:")
        self.drawBtn.setText("绘制折线图")

    # 打开存储文件夹
    def open_dir_fun(self):
        QFileDialog.getOpenFileNames(self, "打开...", self.excel_path,
                                     "All Files(*)")

    # 停止采集数据
    def stop_collect_fun(self):
        try:
            if self.isCollect:
                self.cpu_thread.terminate()
                self.fps_thread.terminate()
                self.drawcall_thread.terminate()
                self.mem_thread.terminate()
                self.tempe_thread.terminate()
                self.net_thread.terminate()
                self.battery_thread.terminate()
                self.time_thread.terminate()

                self.cpu_data.setText("")
                self.mem_data.setText("")
                self.fps.setText("")
                self.send.setText("")
                self.recieve.setText("")
                self.total.setText("")
                self.tempe.setText("")
                self.drawcall.setText("")
                self.battery.setText("")
                self.timer.setText("")

                self.get_cpu.setEnabled(True)
                self.stop_collect.setEnabled(False)
        except Exception:
            self.com.writeLog().info(traceback.format_exc())

    # 读取性能数据excel绘制数据分析图表
    def draw(self):
        try:
            file, type = QFileDialog.getOpenFileNames(self, "打开...",
                                                      self.excel_path,
                                                      "All Files(*)")
            self.dw.cpu_line_chart(file)
            self.dw.mem_line_chart(file)
            self.dw.fps_line_chart(file)
            self.dw.drawcall_line_chart(file)
        except Exception:
            self.com.writeLog().info(traceback.format_exc())

    # 使用QMessageBox提示
    def closeEvent(self, QCloseEvent):
        try:
            reply = QMessageBox.warning(self, "提示", "确认退出并保存数据到默认目录?",
                                        QMessageBox.Yes | QMessageBox.No,
                                        QMessageBox.No)
            if (reply == QMessageBox.Yes):
                if self.getData:
                    self.wb.save(self.excel)
                QCloseEvent.accept()
            if (reply == QMessageBox.No):
                QCloseEvent.ignore()
        except Exception:
            self.com.writeLog().info(traceback.format_exc())

    # 创建excel表格,如已存在,默认插入该表格中,如无创建
    def create_excel(self):
        app_data = self.com.app_data()
        self.android_version = "安卓版本:" + app_data['android_version']
        self.phone_model = "手机型号:" + app_data['phone_model']
        self.mem_total = app_data['mem_total']
        self.book = self.excel_name.text()
        self.current_time = time.strftime('%Y-%m-%d_%H-%M-%S',
                                          time.localtime(time.time()))
        self.excel = "D:\\PerfReport\\" + self.book + "_Report" + "_" + self.current_time + "_性能数据.xls"
        res = self.com.check_excel(self.excel)
        if res == 0:
            self.wb = xlwt.Workbook()
            self.writeSheet = self.wb.add_sheet('report',
                                                cell_overwrite_ok=True)
            self.writeSheet.write(
                0, 17, self.android_version + "__" + self.phone_model + "__" +
                self.mem_total)
            for i in range(0, len(self.title)):
                self.writeSheet.write(0, i, self.title[i])
            # self.wb.save(self.excel)
        else:
            self.workbook = xlrd.open_workbook(self.excel)
            self.wb = copy(self.workbook)
            self.writeSheet = self.wb.get_sheet(0)

    # 检测设备是否连接
    def check_device_fun(self):
        package = self.test_package.currentText()
        status = self.com.check_adb(package)
        if status == 0:
            res = "ADB连接异常,请连接ADB或者允许USB调试"
            self.show_msg(res)
            return status
        elif status == 1:
            if self.com.check_adb(package) == 1:
                self.show_msg('连接成功')
                app_data = self.com.app_data()
                self.android_version = "安卓版本:" + app_data['android_version']
                self.phone_model = "手机型号:" + app_data['phone_model']
                self.mem_total = app_data['mem_total']
                if self.mem_total is not None:
                    self.mem_total = int(
                        re.findall('\d+', self.mem_total).pop()) / 1024 / 1024
                    self.mem_total = str(round(self.mem_total, 2))
                    self.mem_total = "手机内存:" + self.mem_total + "G"
                    self.show_msg(self.android_version + self.phone_model +
                                  self.mem_total)
                return status
        elif status == 2:
            res = "测试包启动异常,手机端运行APP与工具所选测试包不一致或手机端未启动运行测试包"
            self.show_msg(res)
            return status

    # 采集数据槽函数
    def get_cpu_fun(self):
        device = self.check_device_fun()
        self.interval = self.interval_time.currentText()
        self.durtime = self.during_time.currentText()
        self.package = self.test_package.currentText()

        if device == 1:
            self.create_excel()
            self.get_cpu.setEnabled(False)
            self.show_msg("采集性能数据")
            self.getData = 1
            path = "D:\\PerfReport"
            self.com.mkdir(path)

            self.cpu_thread = CpuThread(self.excel, self.writeSheet, self.wb,
                                        self.interval, self.durtime,
                                        self.package, self.lock)
            self.mem_thread = MemThread(self.excel, self.writeSheet, self.wb,
                                        self.interval, self.durtime,
                                        self.package, self.lock)
            self.fps_thread = FpsThread(self.excel, self.writeSheet, self.wb,
                                        self.interval, self.durtime,
                                        self.package, self.lock)
            self.net_thread = NetThread(self.excel, self.writeSheet, self.wb,
                                        self.interval, self.durtime,
                                        self.package, self.lock)
            self.tempe_thread = TempeThread(self.excel, self.writeSheet,
                                            self.wb, self.interval,
                                            self.durtime, self.package,
                                            self.lock)
            self.battery_thread = BatteryThread(self.excel, self.writeSheet,
                                                self.wb, self.interval,
                                                self.durtime, self.package,
                                                self.lock)
            self.drawcall_thread = DrawcallThread(self.excel, self.writeSheet,
                                                  self.wb, self.interval,
                                                  self.durtime, self.package,
                                                  self.lock)
            self.time_thread = TimeThread(self.excel, self.writeSheet, self.wb,
                                          self.interval, self.durtime,
                                          self.package, self.lock)

            self.mem_thread.trigger.connect(self.stop_get_mem)
            self.cpu_thread.trigger.connect(self.stop_get_cpu)
            self.fps_thread.trigger.connect(self.stop_get_fps)
            self.net_thread.trigger.connect(self.stop_get_net)
            self.tempe_thread.trigger.connect(self.stop_get_tempe)
            self.battery_thread.trigger.connect(self.stop_get_battery)
            self.drawcall_thread.trigger.connect(self.stop_get_drawcall)
            self.time_thread.trigger.connect(self.stop_get_time)

            QueThread = Queue()
            QueThread.put(self.cpu_thread)
            QueThread.put(self.fps_thread)
            QueThread.put(self.battery_thread)
            QueThread.put(self.mem_thread)
            QueThread.put(self.tempe_thread)
            QueThread.put(self.net_thread)
            QueThread.put(self.drawcall_thread)
            QueThread.put(self.time_thread)

            while not QueThread.empty():
                QueThread.get().start()
            self.isCollect = 1
            self.stop_collect.setEnabled(True)

    # 电量采集槽函数
    def stop_get_battery(self, int, bool):
        # print("电量采集")
        self.battery.setText(str(int))
        self.get_cpu.setEnabled(bool)

    # drawcall采集槽函数
    def stop_get_drawcall(self, int, bool):
        # print("drawcall采集")
        self.drawcall.setText(str(int))
        self.get_cpu.setEnabled(bool)

    # 终止温度采集槽函数
    def stop_get_tempe(self, int, bool):
        # print("温度采集")
        self.tempe.setText(str(int))
        self.get_cpu.setEnabled(bool)

    # 终止cpu采集槽函数
    def stop_get_cpu(self, str, bool):
        # print("cpu采集")
        self.cpu_data.setText(str)
        self.get_cpu.setEnabled(bool)

    # 内存采集槽函数
    def stop_get_mem(self, float, bool):
        # print("内存采集")
        self.mem_data.setText(str(float))
        self.get_cpu.setEnabled(bool)

    # fps采集槽函数
    def stop_get_fps(self, float, bool):
        # print("fps采集")
        self.fps.setText(str(float))

    # net采集槽函数
    def stop_get_net(self, list, bool):
        # print("流量采集")
        self.get_cpu.setEnabled(bool)
        self.recieve.setText(str(list[0]) + 'Kb/s')
        self.send.setText(str(list[1]) + 'Kb/s')
        self.total.setText(str(list[4]) + 'Mb')

    def stop_get_time(self, str):
        self.timer.setText(str)

    # 展示消息弹窗
    def show_msg(self, text):
        QMessageBox.information(self, "提示:", text)