简介:日常测试中特别是在Linux环境下,会遇到需要测试某项程序是否能正常运行,并且观察是否出现error,warning的情况,同时对运行的次数或者运行的时间有着一些特定需求。这时一个封装好的程序脚本,可以帮助我们快速高效的完成这类事务。既需要命令行输入相关测项快速执行,又需要日志采集整个运行过程。
历史攻略:
Python:aiomultiprocess实现协程与多进程的强强联合
案例源码:
# -*- coding: utf-8 -*-
# time: 2022/10/4 21:51
# file: collection.py
import os
import time
import logging
import argparse
import subprocess
class Logger:
log_path = r"./" # log_path
def __init__(self):
self.log_name = os.path.join(self.log_path, '%s.log' % time.strftime('%Y-%m-%d_%H_%M_%S'))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')
def __console(self, level, message):
fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)
if level == 'info':
self.logger.info(message)
elif level == 'debug':
self.logger.debug(message)
elif level == 'warning':
self.logger.warning(message)
elif level == 'error':
self.logger.error(message)
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
fh.close()
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
log = Logger()
def init_args():
parser = argparse.ArgumentParser()
parser.add_argument("--cmd", required=True, type=str, help="shell or dos command.")
parser.add_argument("--loop", default=1, required=False, type=int, help="how many times to run this command.")
args = parser.parse_args()
return args
def start(cmd, loop):
log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
log.info("\033[1;31m" + f"cmd: {cmd}" + "\033[0m")
log.info("\033[1;31m" + f"loop: {loop}" + "\033[0m")
log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
def finish(cmd, loop):
log.info("\033[1;32m" + "All the command have been executed." + "\033[0m")
log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
log.info("\033[1;31m" + f"cmd: {cmd}" + "\033[0m")
log.info("\033[1;31m" + f"loop: {loop}" + "\033[0m")
log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
def run(cmd, loop=1):
for i in range(loop):
log.info("*" * 50)
log.info("\033[1;32m" + f"{i + 1} / {loop} start" + "\033[0m")
popen = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
out, err = popen.communicate()
log.info('std_err: ' + err)
log.info('out: ' + out)
log.info("\033[1;32m" + f"{i + 1} / {loop} finish" + "\033[0m")
log.info("*" * 50)
if __name__ == "__main__":
args = init_args()
start(args.cmd, args.loop)
run(args.cmd, args.loop)
finish(args.cmd, args.loop)
执行效果:python3 main.py --cmd=“bash test.sh” --loop=3