def getopts(argv=sys.argv): global TEST global RESULT_DB global RESULT_FILE try: opts, args = getopt.getopt(argv[1:],"ht:f:r:",["help",'test', 'file', 'report']) except getopt.GetoptError: usage() if len(argv) <= 1: usage() for opt,value in opts: if opt in ('-h','--help'): usage() if opt in ('-t', '--test'): if value not in TOOLS: lptlog.error('请核对测试工具,不支持您所输入的测试工具 %s' % value) sys.exit() else: TEST = value if opt in ('-f', '--file'): if os.path.isfile(value): RESULT_DB = value if opt in ('-r', '--report'): RESULT_FILE = value
def getopts(argv=sys.argv): ''' 自定义参数 ''' tools_list = [] try: opts, args = getopt.getopt(argv[1:],"ht:g:",["help",'test', 'group']) except getopt.GetoptError: usage() if len(argv) <= 1: usage() for opt,value in opts: if opt in ('-h','--help'): usage() if opt == '-t': if value not in TOOLS: lptlog.error('请核对测试工具,不支持您所输入的测试工具 %s' % value) sys.exit() else: tools_list.append(value) if opt in ('-g', '--group'): value_list = value.split() for tools in value_list: if tools in TOOLS: tools_list.append(tools) else: lptlog.warning('%s不是有效的测试工具,请核对工具名称' % tools) return tools_list
def add_job(tools_list, jobs_xml=JOBS_XML, parameter=default_parameter, job_attrib={}, resultXmlName="results"): ''' 创建新任务 @param tools_list:工具列表 @type tools_list: list ''' try: lptlog.info(''' ~~~~~~~~~~~~~~~~~~~~ 开始创建测试任务 ~~~~~~~~~~~~~~~~~~~~''') lptlog.debug("指定测试工具集: %s" % utils.list_to_str(tools_list)) lptxml.add_job(jobs_xml, tools_list, parameter, job_attrib=job_attrib, resultXmlName=resultXmlName) lptlog.info(''' ++++++++++++++++++ 创建测试任务:PASS ++++++++++++++++++''') except CreateJobException, e: lptlog.debug(e) lptlog.error(''' ++++++++++++++++++ 创建测试任务:FAIL ++++++++++++++++++''')
def getopts(argv=sys.argv): ''' 自定义参数 ''' tools_list = [] try: opts, args = getopt.getopt(argv[1:], "ht:g:", ["help", 'test', 'group']) except getopt.GetoptError: usage() if len(argv) <= 1: usage() for opt, value in opts: if opt in ('-h', '--help'): usage() if opt == '-t': if value not in TOOLS: lptlog.error('请核对测试工具,不支持您所输入的测试工具 %s' % value) sys.exit() else: tools_list.append(value) if opt in ('-g', '--group'): value_list = value.split() for tools in value_list: if tools in TOOLS: tools_list.append(tools) else: lptlog.warning('%s不是有效的测试工具,请核对工具名称' % tools) return tools_list
def _print_complier_log(*args, **kwargs): try: ret = func(*args, **kwargs) except Exception: lptlog.error('编译:FAIL') # os.chdir(root_dir) raise CompileException() else: lptlog.info('编译:OK') return ret
def main(): tools_list = getopts() if not tools_list : lptlog.error('没有输入有效的测试工具') sys.exit() else: lptlog.info('测试工具集:%s' % ', '.join(tools_list)) add_job(tools_list)
def main(): tools_list = getopts() if not tools_list: lptlog.error('没有输入有效的测试工具') sys.exit() else: lptlog.info('测试工具集:%s' % ', '.join(tools_list)) add_job(tools_list)
def run_shell(cmd, args_list=[]): ''' 采用os.system执行shell ''' args_string_list = map(str, args_list) commands = cmd + " " + " ".join(args_string_list) try: lptlog.debug("执行命令:%s" % commands) os.system(commands) except Exception: #lptlog.exception("执行 %s 发生Error:" % commands) lptlog.error("执行 %s 发生Error:" % commands) raise RunShellError()
def run_shell(cmd, args_list=[]): """ 采用os.system执行shell """ args_string_list = map(str, args_list) commands = cmd + " " + " ".join(args_string_list) try: lptlog.debug("执行命令:%s" % commands) os.system(commands) except Exception: # lptlog.exception("执行 %s 发生Error:" % commands) lptlog.error("执行 %s 发生Error:" % commands) raise RunShellError()
def run_cmd(command, args=[], timeout=None, ignore_status=False, output_tee=None): """ Run a command on the host. @param command: the command line string. @param timeout: time limit in seconds before attempting to kill the running process. The run() function will take a few seconds longer than 'timeout' to complete if it has to kill the process. @param ignore_status: do not raise an exception, no matter what the exit @param ignore_status: do not raise an exception, no matter what the exit code of the command is. @param stdout_tee: optional file-like object to which stdout data will be written as it is generated (data will still be stored in result.stdout). @param args: sequence of strings of arguments to be given to the command inside " quotes after they have been escaped for that; each element in the sequence will be given as a separate command argument :return: a CmdResult object :raise CmdError: the exit code of the command execution was not 0 """ if not isinstance(args, list): raise TypeError('Got a string for the "args" keyword argument, ' 'need a list.') for arg in args: command += ' "%s"' % sh_escape(arg) lptlog.debug("执行命令:%s" % command) p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) output, output_err = p.communicate() if timeout and isinstance(timeout, int): time.sleep(timeout) retcode = p.poll() if retcode: lptlog.error('运行 %d 秒,%s 程序无响应' %(timeout, command)) raise CalledProcessError() if p.wait(): lptlog.error("执行命令: %s, 输出错误信息:\n%s" %(command, output_err)) if not ignore_status: raise CalledProcessError(p.poll(), command) elif output_tee: lptlog.debug("执行命令: %s, 输出信息:\n %s" %(command, output)) return output else: lptlog.debug("执行命令: %s, 输出信息:\n %s" %(command, output)) return 0
def copy(src, dst): '''@attention: first,如果src为file,赋予 777 权限 ''' try: if os.path.isfile(src): os.chmod(src, stat.S_IRWXU) shutil.copy2(src, dst) elif os.path.isdir(src): shutil.copytree(src, dst) else: pass except Exception: lptlog.error("文件/文件夹不存在或权限不足, copy失败") raise PermitsError()
def copy(src, dst): """@attention: first,如果src为file,赋予 777 权限 """ try: if os.path.isfile(src): os.chmod(src, stat.S_IRWXU) shutil.copy2(src, dst) elif os.path.isdir(src): shutil.copytree(src, dst) else: pass except Exception: lptlog.error("文件/文件夹不存在或权限不足, copy失败") raise PermitsError()
def run_cmd(command, args=[], timeout=None, ignore_status=False, output_tee=None): """ Run a command on the host. @param command: the command line string. @param timeout: time limit in seconds before attempting to kill the running process. The run() function will take a few seconds longer than 'timeout' to complete if it has to kill the process. @param ignore_status: do not raise an exception, no matter what the exit @param ignore_status: do not raise an exception, no matter what the exit code of the command is. @param stdout_tee: optional file-like object to which stdout data will be written as it is generated (data will still be stored in result.stdout). @param args: sequence of strings of arguments to be given to the command inside " quotes after they have been escaped for that; each element in the sequence will be given as a separate command argument :return: a CmdResult object :raise CmdError: the exit code of the command execution was not 0 """ if not isinstance(args, list): raise TypeError('Got a string for the "args" keyword argument, ' "need a list.") for arg in args: command += ' "%s"' % sh_escape(arg) lptlog.debug("执行命令:%s" % command) p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) output, output_err = p.communicate() if timeout and isinstance(timeout, int): time.sleep(timeout) retcode = p.poll() if retcode: lptlog.error("运行 %d 秒,%s 程序无响应" % (timeout, command)) raise CalledProcessError() if p.wait(): lptlog.error("执行命令: %s, 输出错误信息:\n%s" % (command, output_err)) if not ignore_status: raise CalledProcessError(p.poll(), command) elif output_tee: lptlog.debug("执行命令: %s, 输出信息:\n %s" % (command, output)) return output else: lptlog.debug("执行命令: %s, 输出信息:\n %s" % (command, output)) return 0
def main(): #判断是否root用户 #if os.getuid() <>0: # lptlog.critical('请使用root用户') # sys.exit() lptlog.info(__START_MSG) try: if not os.path.isfile(JOBS_XML): #lptlog.warning("jobs.xml文件不存在") raise NameError, "%s 不存在" % JOBS_XML run() except Exception, e: lptlog.error('Debug Message: %s' % e)
def run_shell2(cmd, args_list=[], file=None): """ 采用subprocess.call执行测试 """ args_list.insert(0, cmd) args_string_list = map(str, args_list) lptlog.info("执行命令: %s" % " ".join(args_string_list)) if file: fd = open(file, "w") else: fd = None status = subprocess.call(args_string_list, stdout=fd, stderr=fd) if status > 0: lptlog.error("执行 %s 发生Error:" % " ".join(args_string_list)) raise RunShellError() if file: fd.close()
def run_shell2(cmd, args_list=[], file=None): ''' 采用subprocess.call执行测试 ''' args_list.insert(0, cmd) args_string_list = map(str, args_list) lptlog.info("执行命令: %s" % " ".join(args_string_list)) if file: fd = open(file, 'w') else: fd=None status = subprocess.call(args_string_list, stdout=fd, stderr=fd) if status > 0: lptlog.error("执行 %s 发生Error:" % " ".join(args_string_list)) raise RunShellError() if file: fd.close()
def hash_file(filename, size=None, method="md5"): """ Calculate the hash of filename. If size is not None, limit to first size bytes. Throw exception if something is wrong with filename. Can be also implemented with bash one-liner (assuming size%1024==0): dd if=filename bs=1024 count=size/1024 | sha1sum - :param filename: Path of the file that will have its hash calculated. :param method: Method used to calculate the hash. Supported methods: * md5 * sha1 :return: Hash of the file, if something goes wrong, return None. """ chunksize = 4096 fsize = os.path.getsize(filename) if not size or size > fsize: size = fsize f = open(filename, "rb") try: hash = hash_method(method) except ValueError: lptlog.error("Unknown hash type %s, returning None" % method) while size > 0: if chunksize > size: chunksize = size data = f.read(chunksize) if len(data) == 0: lptlog.debug("Nothing left to read but size=%d" % size) break hash.update(data) size -= len(data) f.close() return hash.hexdigest()
def hash_file(filename, size=None, method="md5"): """ Calculate the hash of filename. If size is not None, limit to first size bytes. Throw exception if something is wrong with filename. Can be also implemented with bash one-liner (assuming size%1024==0): dd if=filename bs=1024 count=size/1024 | sha1sum - :param filename: Path of the file that will have its hash calculated. :param method: Method used to calculate the hash. Supported methods: * md5 * sha1 :return: Hash of the file, if something goes wrong, return None. """ chunksize = 4096 fsize = os.path.getsize(filename) if not size or size > fsize: size = fsize f = open(filename, 'rb') try: hash = hash_method(method) except ValueError: lptlog.error("Unknown hash type %s, returning None" % method) while size > 0: if chunksize > size: chunksize = size data = f.read(chunksize) if len(data) == 0: lptlog.debug("Nothing left to read but size=%d" % size) break hash.update(data) size -= len(data) f.close() return hash.hexdigest()
def parser_opts(self, argv=sys.argv): opts = self.parser(argv) #检查是否root用户 # self.check_root() #设定log格式 if opts.verbose: lptlog.update_logger(quiet=opts.verbose) # if opts.loglevel: lptlog.update_logger(level=opts.loglevel) if opts.parameter: if os.path.isfile(opts.parameter): parameterConfig = opts.parameter else: parameterConfig = defaultParameter TOOLS_LIST = readconfig.para_conf( config=parameterConfig).get_sections() #获取工具列表 if opts.tools_list: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_list)) self.tools_list.extend( [tool for tool in opts.tools_list if tool in TOOLS_LIST]) if opts.tools_group: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_group.split(','))) self.tools_list.extend([ tool for tool in opts.tools_group.split(',') if tool in TOOLS_LIST ]) if self.tools_list: self.tools_list = {}.fromkeys(self.tools_list).keys() #lptlog.info("工具集合: %s" % ",".join(self.tools_list )) #jobs_xml self.jobs_xml = os.path.realpath(opts.jobs_xml) try: #创建job,可以指定jobs_xml,指定测试工具,指定job名称 if opts.mode == 0: if opts.JobName: self.jobName = opts.JobName jobs.add_job(self.tools_list, jobs_xml=self.jobs_xml, parameter=parameterConfig, job_attrib={'name': '%s' % self.jobName}) #定义执行任务的方法 elif opts.mode == 1: #开始测试 lptlog.info(START_MSG) if not os.path.abspath(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") raise optparse.OptionValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" else: Jobrun.run(job_id=opts.job_id, tools_list=self.tools_list, jobs_xml=self.jobs_xml, format='txt', clean=opts.clean) lptlog.info(STOP_MSG) elif opts.mode == 2: if not opts.resultdb or not os.path.abspath(opts.resultdb): #lptlog.warning("请指定result databases(xml)") raise optparse.OptionValueError, "请指定result databases(xml)" if not os.path.isdir(opts.reportdir): lptlog.warning("%s 不是有效的目录" % opts.reportdir) os.makedirs(opts.reportdir, mode=0777) Testreport.report(os.path.realpath(opts.resultdb), opts.reportdir, tools_list=self.tools_list, reportname=opts.reportname, format=opts.format, chart=opts.genchart) elif opts.mode == 3: if opts.compareFiles: xmls_list = [ os.path.realpath(str(xml)) for xml in opts.compareFiles.split(',') if os.path.abspath(xml) ] else: xmls_list = [] if opts.compareNames: names_list = [ str(name).strip() for name in opts.compareNames.split(',') ] else: names_list = [] compare.compare(xmls_list, resultDir=opts.reportdir, reportFile=opts.reportname, names=names_list, tools=self.tools_list, reportType=opts.format, chart=opts.genchart) else: if opts.jobs_list: #检查是否存在jobs xml文件 if not os.path.isfile(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") #raise NameError("") #raise ValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" pass else: self.list_jobs(self.jobs_xml) #else: # lptlog.warning("-h or --help show help message...") except KeyboardInterrupt: lptlog.warning("按下CTRL+C,将停止测试程序") sys.exit() except optparse.OptionValueError, e: lptlog.error("Bad option or value: %s" % e)
def parser_opts(self, argv=sys.argv): opts = self.parser(argv) #检查是否root用户 # self.check_root() #设定log格式 if opts.verbose: lptlog.update_logger(quiet=opts.verbose) # if opts.loglevel: lptlog.update_logger(level=opts.loglevel) if opts.parameter: if os.path.isfile(opts.parameter): parameterConfig = opts.parameter else: parameterConfig = defaultParameter TOOLS_LIST = readconfig.para_conf(config=parameterConfig).get_sections() #获取工具列表 if opts.tools_list: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_list)) self.tools_list.extend([ tool for tool in opts.tools_list if tool in TOOLS_LIST]) if opts.tools_group: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_group.split(','))) self.tools_list.extend([ tool for tool in opts.tools_group.split(',') if tool in TOOLS_LIST]) if self.tools_list: self.tools_list = {}.fromkeys(self.tools_list).keys() #lptlog.info("工具集合: %s" % ",".join(self.tools_list )) #jobs_xml self.jobs_xml = os.path.realpath(opts.jobs_xml) try: #创建job,可以指定jobs_xml,指定测试工具,指定job名称 if opts.mode == 0: if opts.JobName: self.jobName = opts.JobName jobs.add_job(self.tools_list, jobs_xml=self.jobs_xml, parameter=parameterConfig, job_attrib={'name':'%s' % self.jobName}) #定义执行任务的方法 elif opts.mode == 1: #开始测试 lptlog.info(START_MSG) if not os.path.abspath(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") raise optparse.OptionValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" else: Jobrun.run(job_id=opts.job_id, tools_list=self.tools_list, jobs_xml=self.jobs_xml, format='txt', clean=opts.clean) lptlog.info(STOP_MSG) elif opts.mode == 2: if not opts.resultdb or not os.path.abspath(opts.resultdb): #lptlog.warning("请指定result databases(xml)") raise optparse.OptionValueError, "请指定result databases(xml)" if not os.path.isdir(opts.reportdir): lptlog.warning("%s 不是有效的目录" % opts.reportdir) os.makedirs(opts.reportdir, mode=777) Testreport.report(os.path.realpath(opts.resultdb), opts.reportdir, tools_list=self.tools_list, reportname=opts.reportname, format=opts.format, chart=opts.genchart) elif opts.mode == 3: if opts.compareFiles: xmls_list = [ os.path.realpath(str(xml)) for xml in opts.compareFiles.split(',') if os.path.abspath(xml)] else: xmls_list = [] if opts.compareNames: names_list = [ str(name).strip() for name in opts.compareNames.split(',')] else: names_list = [] compare.compare(xmls_list, resultDir=opts.reportdir ,reportFile=opts.reportname, names=names_list, tools=self.tools_list, reportType=opts.format, chart=opts.genchart) else: if opts.jobs_list: #检查是否存在jobs xml文件 if not os.path.isfile(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") #raise NameError("") raise ValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" else: self.list_jobs(self.jobs_xml) #else: # lptlog.warning("-h or --help show help message...") except KeyboardInterrupt: lptlog.warning("按下CTRL+C,将停止测试程序") sys.exit() except optparse.OptionValueError, e: lptlog.error("Bad option or value: %s" % e)
def has_gcc(): if os.path.isfile('/usr/bin/gcc') or os.path.isfile('/bin/gcc') or os.path.isfile('/sbin/gcc'): lptlog.info("gcc 检查:PASS") else: lptlog.error("gcc 检查:FAIL") raise DespendException, "gcc"
def main(): global TEST global RESULT_DB global RESULT_FILE getopts() if TEST is None: lptlog.critical("请指定测试工具") usage() if RESULT_DB is None: lptlog.critical("请指定result Databases") usage() if RESULT_FILE is None: lptlog.critical("请指定report Name") usage() lptlog.info('\n指定工具:%s\n报告文件:%s' % (TEST, RESULT_FILE)) lptreport.save_result(TEST, RESULT_FILE, RESULT_DB) if __name__ == "__main__": try: main() except Exception: #lptlog.exception('生成测试报告:FAIL') lptlog.error('生成测试报告:FAIL')
if not test_tools: #lptlog.warning('指定运行的测试工具已经全部执行完毕, 请重新创建任务') raise TestOK, '指定运行的测试工具已经全部执行完毕, 请重新创建任务' else: tools_string = " ".join(test_tools) lptlog.debug("尚未执行完毕的测试工具集:%s" % tools_string) for tool in test_tools: lptlog.info(__BEGIN_MSG % tool) try: control.run(tool, jobs_xml, job_node, clean=clean) except Exception, e: lptlog.debug(e) lptlog.error(''' ---------------------------------- + %s 测试:FAIL + ---------------------------------- ''' % tool) lptlog.info(__END_MSG % tool) #lptlog.exception("") if test_tools[-1] == tool: raise TestOK, "Test Over, but Some Case FAIL" else: continue else: #python 2.7 #jobs.set_tool_status(job_node.find("tool[@id='%s']" % tool), 'ok') #python 2.6 tool_node = filter(lambda x:x.get("id")==tool, jobs.get_tools_nodes(job_node))[0] jobs.set_tool_status(tool_node, 'ok') jobs.save_file()
def has_gcc(): if os.path.isfile("/usr/bin/gcc") or os.path.isfile("/bin/gcc") or os.path.isfile("/sbin/gcc"): lptlog.info("gcc 检查:PASS") else: lptlog.error("gcc 检查:FAIL") raise DespendException, "gcc"
def run(job_id=None, tools_list=None, jobs_xml=JOBS_XML, format='txt', clean=False, REBOOT=False): jobs = lptxml.Jobs(jobs_xml) if job_id is None: try: job_node = jobs.get_new_job() except IndexError as e: lptlog.debug("job任务数为0, 期望非0") job_node = None else: #python 2.7 #job_node = jobs.search_job_node("job[@id='%s']" % job_id) #python 2.6 job_nodes = jobs.search_job_nodes("job") if job_nodes is None: lptlog.debug("job任务数为0, 期望非0") job_node = None else: job_filter_nodes = [ x for x in job_nodes if x.get("id") == str(job_id) ] if job_filter_nodes: job_node = job_filter_nodes[0] else: lptlog.debug("%s id不存在,请核对JOB ID" % job_id) job_node = None if job_node is None: #lptlog.error() raise MissXML("没有找到对应的job任务, 请核对jobs.xml或者重新创建测试任务") #判断所有工具是否已经全部执行完毕 no_exec_tools_nodes_list = jobs.get_noexec_tools_nodes(job_node) if not no_exec_tools_nodes_list: #lptlog.warning('任务中所有工具状态都已正确执行, 请重新创建测试任务') raise TestOK("任务中所有工具状态都已正确执行, 请重新创建测试任务") else: no_exec_tools = list(map(jobs.get_tool_name, no_exec_tools_nodes_list)) if not tools_list: lptlog.debug("未指定测试工具,将默认执行job中未执行成功的测试工具") test_tools = list(map(jobs.get_tool_name, no_exec_tools_nodes_list)) else: #python 2.7 #tools = filter(lambda x:job_node.find("tool[@id='%s']" % x).get('status') == "no", tools_list) #python 2.6 #no_exec_tools = map(lambda y:y.get('id'), jobs.get_noexec_tools_nodes(job_node)) #tools = filter(lambda x:no_exec_tools.count(x)>0, tools_list) test_tools = [tool for tool in no_exec_tools if tool in tools_list] if not test_tools: #lptlog.warning('指定运行的测试工具已经全部执行完毕, 请重新创建任务') raise TestOK('指定运行的测试工具已经全部执行完毕, 请重新创建任务') else: tools_string = " ".join(test_tools) lptlog.debug("尚未执行完毕的测试工具集:%s" % tools_string) for tool in test_tools: lptlog.info(__BEGIN_MSG % tool) try: control.run(tool, jobs_xml, job_node, clean=clean) except Exception as e: lptlog.debug(e) lptlog.error(''' ---------------------------------- + %s 测试:FAIL + ---------------------------------- ''' % tool) lptlog.info(__END_MSG % tool) #lptlog.exception("") if test_tools[-1] == tool: raise TestOK("Test Over, but Some Case FAIL") else: continue else: #python 2.7 #jobs.set_tool_status(job_node.find("tool[@id='%s']" % tool), 'ok') #python 2.6 tool_node = [ x for x in jobs.get_tools_nodes(job_node) if x.get("id") == tool ][0] jobs.set_tool_status(tool_node, 'ok') jobs.save_file() lptlog.info(''' ---------------------------------- + %s 测试:PASS + ---------------------------------- ''' % tool) lptlog.info(__END_MSG % tool) if REBOOT: break
class Lpt: ''' Options: --version show program's version number and exit -h, --help show this help message and exit -v, --verbose Print log message. -q, --quite No print log message -L LEVEL, --LEVEL=LEVEL Log Level:debug,info,warning,error,critical -t TOOL, --tool=TOOL Test Tool -g TOOLS, --group=TOOLS Test Tools, example:unixbench,stream Job: --create create job use tools of you give by -t or by -g option,default use all tools in parameter.conf. -n JobName, --name=JobName set job name -f JobsDB, --file=JobsDB jobs databases file of xml -i JobID, --id=JobID job id for run or report -l, --list list all jobs Run: --run Run job by use job id, default last .You can use tool of you give by -t option, default run all tools that not execute in job tasks --clean clean all temporary file after testing Report: -F FORMAT set report format:txt、execl、doc or pdf -r NAME set report name -d DIR set report dir --report create report,with result databases file of xml -R XML get result databases of xml --compare performance compare -X resultsXml, --XML=resultsXml Result databases of xmls, separate tags with commas -N names, --Names=names point Test Objects, separate tags with commas ''' def __init__(self): self.tools_list = [] self.jobs_xml = None self.jobName = "lpt_%s" % utils.gen_random_strs() def set_jobName(self, name): pass def parser(self, argv): usage = "usage: %prog [options]" parser = OptionParser(usage=usage, version="%prog 3.0.0") parser.add_option('-v', '--verbose', action='store_false', dest='verbose', default=False, help='Print log message.') parser.add_option('-q', '--quite', action='store_true', dest='verbose', help='No print log message') parser.add_option('-L', '--LEVEL', action='store', metavar="LEVEL", dest='loglevel', choices=("info", "debug", 'warning', "error", "critical"), help='Log Level:debug,info,warning,error,critical') parser.add_option('-t', '--tool', action='append', dest="tools_list", metavar="TOOL", help="Test Tool") parser.add_option('-g', '--group', action='store', dest="tools_group", metavar="TOOLS", help="Test Tools, example:unixbench,stream") job_group = OptionGroup(parser, "Job") job_group.add_option( '--create', action='store_const', const=0, dest='mode', help= "create job use tools of you give by -t or by -g option,default use all tools in parameter.conf." ) job_group.add_option('-n', '--name', action='store', dest='JobName', metavar="JobName", help="set job name") job_group.add_option('-p', '--parameter', action='store', dest='parameter', metavar="conf", help="parameter config file") job_group.add_option('-f', '--file', action='store', dest='jobs_xml', metavar="JobsDB", default=JOBS_XML, help='jobs databases file of xml') job_group.add_option('-i', '--id', action="store", dest='job_id', metavar="JobID", help="job id for run or report") job_group.add_option('-l', '--list', action='store_true', dest='jobs_list', help='list all jobs') parser.add_option_group(job_group) run_group = OptionGroup(parser, "Run") run_group.add_option( '--run', action="store_const", const=1, dest='mode', help= "Run job by use job id, default last .You can use tool of you give by -t option, default run all tools that not execute in job tasks" ) run_group.add_option('--clean', action='store_true', dest='clean', default=False, help='clean all temporary file after testing') parser.add_option_group(run_group) report_group = OptionGroup(parser, "Report") report_group.add_option('-F', action="store", dest="format", choices=('txt', 'xls', 'doc', 'pdf'), metavar="FORMAT", default='xls', help="set report format:txt、execl、doc or pdf") report_group.add_option('-r', action="store", dest="reportname", metavar="NAME", help="set report name") report_group.add_option('-d', action="store", dest="reportdir", metavar="DIR", default=RESULTS_DIR, help="set report dir") report_group.add_option("--chart", action="store_true", dest="genchart", default=False, help="generate chart, default False") report_group.add_option( '--report', action='store_const', const=2, dest="mode", help="create report,with result databases file of xml") report_group.add_option('-R', action='store', dest="resultdb", metavar="XML", help="get result databases of xml") report_group.add_option('--compare', action="store_const", const=3, dest="mode", help="performance compare") report_group.add_option( '-X', '--XML', action="store", dest="compareFiles", metavar="resultsXml", help="Result databases of xmls, separate tags with commas") report_group.add_option( '-N', '--Names', action="store", dest="compareNames", metavar="names", help="point Test Objects, separate tags with commas") parser.add_option_group(report_group) opts, args = parser.parse_args(argv) return opts def check_root(self): if os.getuid() <> 0: lptlog.warning("请使用root用户执行测试用例") sys.exit() #raise UnRootError("请使用root用户执行测试用例") def _print_tools(self, tool_list, tools_nodes, jobs_object): status_tools = [ "%s:'%s'" % (tool, jobs_object.get_tool_status(tools_nodes, tool)) for tool in tool_list ] return "|".join(status_tools) def list_jobs(self, jobs_xml): print "-" * 90 print "%12s%18s%30s%30s" % ("JOBID", "JOBNAME", "resultsDB", "STATUS") print "-" * 90 jobs_object = lptxml.Jobs(jobs_xml) #jobs_nodes = lptxml.search_job_nodes('job', xml_file=jobs_xml) jobs_nodes = jobs_object.search_job_nodes('job') if jobs_nodes: for job_node in jobs_nodes: #resultsdb = lptxml.get_job_text("resultsDB", xml_file=jobs_xml, job_node=job_node) resultsdb = jobs_object.get_job_text(job_node, "resultsDB") #tool_list = map(lambda x:x.get('id'), lptxml.get_tools_nodes(job_node)) tools_nodes = jobs_object.get_tools_nodes(job_node) tool_list = map(lambda x: x.get('id'), tools_nodes) if len(tool_list) < 3: tools_string = self._print_tools(tool_list, tools_nodes, jobs_object) print "%12s%18s%30s%30s" % (job_node.get('id'), job_node.get('name'), resultsdb, tools_string) else: tools_string = self._print_tools(tool_list[0:2], tools_nodes, jobs_object) print "%12s%18s%30s%30s" % (job_node.get('id'), job_node.get('name'), resultsdb, tools_string) n = 2 while True: if len(tool_list[n:]) > 2: tools_string = self._print_tools( tool_list[n:n + 2], tools_nodes, jobs_object) print "%90s" % tools_string n = n + 2 continue else: tools_string = self._print_tools( tool_list[n:], tools_nodes, jobs_object) print "%90s" % tools_string break print "-" * 90 def parser_opts(self, argv=sys.argv): opts = self.parser(argv) #检查是否root用户 # self.check_root() #设定log格式 if opts.verbose: lptlog.update_logger(quiet=opts.verbose) # if opts.loglevel: lptlog.update_logger(level=opts.loglevel) if opts.parameter: if os.path.isfile(opts.parameter): parameterConfig = opts.parameter else: parameterConfig = defaultParameter TOOLS_LIST = readconfig.para_conf( config=parameterConfig).get_sections() #获取工具列表 if opts.tools_list: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_list)) self.tools_list.extend( [tool for tool in opts.tools_list if tool in TOOLS_LIST]) if opts.tools_group: #self.tools_list.extend(filter(lambda x: TOOLS_LIST.count(x)>0, opts.tools_group.split(','))) self.tools_list.extend([ tool for tool in opts.tools_group.split(',') if tool in TOOLS_LIST ]) if self.tools_list: self.tools_list = {}.fromkeys(self.tools_list).keys() #lptlog.info("工具集合: %s" % ",".join(self.tools_list )) #jobs_xml self.jobs_xml = os.path.realpath(opts.jobs_xml) try: #创建job,可以指定jobs_xml,指定测试工具,指定job名称 if opts.mode == 0: if opts.JobName: self.jobName = opts.JobName jobs.add_job(self.tools_list, jobs_xml=self.jobs_xml, parameter=parameterConfig, job_attrib={'name': '%s' % self.jobName}) #定义执行任务的方法 elif opts.mode == 1: #开始测试 lptlog.info(START_MSG) if not os.path.abspath(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") raise optparse.OptionValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" else: Jobrun.run(job_id=opts.job_id, tools_list=self.tools_list, jobs_xml=self.jobs_xml, format='txt', clean=opts.clean) lptlog.info(STOP_MSG) elif opts.mode == 2: if not opts.resultdb or not os.path.abspath(opts.resultdb): #lptlog.warning("请指定result databases(xml)") raise optparse.OptionValueError, "请指定result databases(xml)" if not os.path.isdir(opts.reportdir): lptlog.warning("%s 不是有效的目录" % opts.reportdir) os.makedirs(opts.reportdir, mode=0777) Testreport.report(os.path.realpath(opts.resultdb), opts.reportdir, tools_list=self.tools_list, reportname=opts.reportname, format=opts.format, chart=opts.genchart) elif opts.mode == 3: if opts.compareFiles: xmls_list = [ os.path.realpath(str(xml)) for xml in opts.compareFiles.split(',') if os.path.abspath(xml) ] else: xmls_list = [] if opts.compareNames: names_list = [ str(name).strip() for name in opts.compareNames.split(',') ] else: names_list = [] compare.compare(xmls_list, resultDir=opts.reportdir, reportFile=opts.reportname, names=names_list, tools=self.tools_list, reportType=opts.format, chart=opts.genchart) else: if opts.jobs_list: #检查是否存在jobs xml文件 if not os.path.isfile(self.jobs_xml): #lptlog.warning("缺失jobs文件,请核对jobs文件或者重新创建job") #raise NameError("") #raise ValueError, "缺失jobs文件,请核对jobs文件或者重新创建job" pass else: self.list_jobs(self.jobs_xml) #else: # lptlog.warning("-h or --help show help message...") except KeyboardInterrupt: lptlog.warning("按下CTRL+C,将停止测试程序") sys.exit() except optparse.OptionValueError, e: lptlog.error("Bad option or value: %s" % e) except MissXML, e: lptlog.error(e)