# -*- coding:utf-8 -*- #Author: lonelylizard #Date: 2020-05-14 09:16:36 #LastEditTime: 2020-05-15 08:58:38 #LastEditors: Please set LastEditors #Description: jmx构建器,适用于jenkins #FilePath: \myfruitsd:\jmeter_test\JMeterAndJenkinsTest\const_JMeter.py # D:/apache-jmeter-5.1.1/bin/ApacheJMeter.jar -n -t D:\jmeter_test\JMeterAndJenkinsTest\xmysql.jmx import argparse import os from bs4 import BeautifulSoup import sys parser = argparse.ArgumentParser() # 获取项目工作空间:%WORKSPACE% parser.add_argument("-ws",required=True) #获取jenkins路径:%JENKINS_HOME% parser.add_argument("-jk",required=True) #获取项目名称:%JOB_NAME% parser.add_argument("-pname",required=True) #获取构建id:%BUILD_ID% parser.add_argument("-bid",required=True) args = parser.parse_args() projectWorkpace = args.ws # projectWorkpace = "D:\\jenkins\\workspace\\JenkinsAndJMeter" #jenkins-CLI绝对路径 JMeter_path = "D:\\apache-jmeter-5.1.1\\bin\\ApacheJMeter.jar" #这里还需要获取到jenkins的路径,用来创建result文件夹存放测试结果文件 jenkinsPath = args.jk # jenkinsPath = "D:\\jenkins" #这里需要获取到项目名称,作为result的子文件夹来归类 projectName = args.pname # projectName = "JenkinsAndJMeter" #获取本次构建的id来作为result文件夹下面的结果文件夹 buildId = args.bid # buildId = "67" #断言文件路径,jmx文件数量 global wpath global jmxNum global rsNum #执行接口测试用例 def file_name(): global jmxNum filesArr = [] for root, dirs, files in os.walk(projectWorkpace): for file in files: #print file.decode('gbk') #文件名中有中文字符时转码 if os.path.splitext(file)[1] == '.jmx': print(file) filesArr.append(root+"\\"+file) jmxNum = len(filesArr) return filesArr def runJmx(filesArr): i = 1 for file in filesArr: print("正在执行第",i,"个测试计划") print("测试计划名称:",file) i+=1 print("执行命令:",JMeter_path+" -n -t "+file+" -JbuildId="+buildId+" -Jjenkins_home="+jenkinsPath+" -JprojectName="+projectName) if os.system(JMeter_path+" -n -t "+file+" -JbuildId="+buildId+" -Jjenkins_home="+jenkinsPath+" -JprojectName="+projectName) == 0: print("执行成功") else: print("执行测试计划错误,可能是批处理命令错误,或者测试计划路径名称错误等") # filesArr = file_name() # runJmx(filesArr) #该方法最先执行 #检查和构建输出文件的路径 def checkRsPath(): global wpath if os.path.exists(jenkinsPath+"\\result") != True: os.mkdir(jenkinsPath+"\\result") print("result目录创建成功") else: print("result目录存在,跳过创建") if os.path.exists(jenkinsPath+"\\result\\"+projectName) !=True: os.mkdir(jenkinsPath+"\\result\\"+projectName) if os.path.exists(jenkinsPath+"\\result\\"+projectName+"\\"+buildId) != True: os.mkdir(jenkinsPath+"\\result\\"+projectName+"\\"+buildId) else: print("result文件夹下面存在名称为"+buildId+"的子文件,这不应该存在,请检查") wpath = jenkinsPath+"\\result\\"+projectName+"\\"+buildId #检查断言文件是否存在断言失败 def rsIdentity(): global wpath global rsNum global jmxNum countNum = 0 flag = 0 rsArr = [] errorArr = [] errorArr2 = [] for root, dirs, files in os.walk(wpath): for file in files: #print file.decode('gbk') #文件名中有中文字符时转码 if os.path.splitext(file)[1] == '.xml': rsArr.append(root+"\\"+file) # print(rsArr) rsNum = len(rsArr) for rsFile in rsArr: f = open(rsFile,"r",encoding="utf-8") soup = BeautifulSoup(f,"lxml") # print("匹配到的文本:",soup.find_all("failure")) #匹配xml中标签True,有说明断言失败 for keyword in soup.find_all("error"): if keyword.string == "true": print("发现断言错误的文件,请检查断言语法等是否错误:",rsFile) flag = 1 for keyword in soup.find_all("failure"): if keyword.string == "true": countNum+=1 errorArr.append(rsFile) # print(keyword.string) flag = 1 if (rsNum == 0): print("注意:本次构建没有找到测试计划jmx文件!") sys.exit(2) elif (rsNum != jmxNum): print("测试结果文件:",jmxNum) print("断言结果文件数:",rsNum) print("请检查你的测试计划:每个测试计划有且只有一个输出文件(格式为xml)") sys.exit(3) elif (flag==1): print("总共有",countNum,"处断言失败!") for errorFile in errorArr: if errorFile not in errorArr2: errorArr2.append(errorFile) print("以下文件断言失败:") for a in errorArr2: print(a) else: print("构建成功!") # print("=====一次遍历完毕====") sys.exit(flag) checkRsPath() runJmx(file_name()) rsIdentity()