import os
import shutil
from openpyxl import load_workbook
def read_file(read_path):
'''
该函数读取一个Excel文件的内容,提取其中特定的交易信息,并将交易信息以列表的形式返回。
交易信息包括交易名称、URL和请求体。
函数会跳过交易名称以"业务场景"开头的交易信息。
最终返回一个包含所有交易信息的列表。
'''
workbook = load_workbook(read_path)
booksheet = workbook.active
rows = booksheet.rows
# columns = booksheet.columns
# print("columns=",columns)
result = []
count_result = []
# i = 0
# 迭代所有的行
for row in rows:
line = [col.value for col in row]
# print(line)
# cell_data_1 = booksheet.cell(row=i, column=2).value # 获取第i行1 列的数据
# print(cell_data_1, cell_data_2, cell_data_3, cell_data_4, cell_data_5)
transaction = line[2] # 获取第i行3 列的数据
uurl = line[3] # 获取第i行4 列的数据
# body = str(line[4]).replace('"', '\\"')
body = str(line[4])
# res1 = line[5]
# if str(res1).find('"code"')==False:
# print(transaction+'交易响应报文不存在code参数')
# 判断如果transaction不是以'业务场景'开头的,则将读取到的[transaction, uurl, body]追加到result中,
# 再将每次的result追加到count_result,每次在循环的最后置空result
if str(transaction).startswith('业务场景') == False:
result.append([transaction, uurl, body])
count_result.append(result)
result = []
# if i > 3:
# break
return count_result
def mik_dir(folder_path):
'''
该函数用于复制文件。首先创建一个文件夹,然后读取源文件夹内的文件名称,并循环遍历这些文件,
将它们从源路径复制到目标路径中创建的文件夹里。
'''
# 创建文件夹
os.makedirs(folder_path)
# 读取源文件夹内文件名称
list1 = ['default.cfg', 'default.usp', 'globals.h', 'vuser_end.c', 'vuser_init.c']
# 要复制的源文件夹路径
src_file_path = r"C:\Users\Administrator\Desktop\shiyan"
# 目标路径
#dst_file_path = folder_path + "\\" + res1[i][0][0]
# 复制文件
for m in list1:
shutil.copy2(src_file_path + "\\" + m, folder_path +"\\"+ m)
def creatAction(filepath,filename,fileBody):
"""
这个函数用于创建一个文件,并将指定的内容写入该文件中。
函数接受三个参数:文件路径、文件名和文件内容。
函数使用'with'语句打开文件,将内容写入文件,并在操作完成后关闭文件
"""
with open(filepath+'\\'+filename, 'w+') as f:
f.write(fileBody)
f.close()
def 加工Usr(P_transaction):
"""
加工.usr文件
"""
P_usr =('[General]\n'
'Type=Multi\n'
'AdditionalTypes=QTWeb\n'
'ActiveTypes=QTWeb\n'
'GenerateTypes=QTWeb\n'
'RecordedProtocols=\n'
'DefaultCfg=default.cfg\n'
'AppName=\n'
'BuildTarget=\n'
'ParamRightBrace=}\n'
'ParamLeftBrace={\n'
'NewFunctionHeader=1\n'
'LastActiveAction=Action\n'
'CorrInfoReportDir=\n'
'LastResultDir=\n'
'DevelopTool=Vugen\n'
'ActionLogicExt=action_logic\n'
'MajorVersion=11\n'
'MinorVersion=0\n'
'ParameterFile=\n'
'GlobalParameterFile=\n'
'RunType=cci\n'
'LastModifyVer=11.0.0.0\n'
'[TransactionsOrder]\n'
'Order="'+P_transaction+'"\n'
'[ExtraFiles]\n'
'globals.h=\n'
'[Actions]\n'
'vuser_init=vuser_init.c\n'
'Action=Action.c\n'
'vuser_end=vuser_end.c\n'
'[Recorded Actions]\n'
'vuser_init=0\n'
'Action=0\n'
'vuser_end=0\n'
'[Replayed Actions]\n'
'vuser_init=0\n'
'Action=0\n'
'vuser_end=0\n'
'[Modified Actions]\n'
'vuser_init=0\n'
'Action=1\n'
'vuser_end=0\n'
'[ProtocolsVersion]\n'
'QTWeb=11.0.0.0\n'
'[RunLogicFiles]\n'
'Default Profile=default.usp\n'
'[StateManagement]\n'
'1=1\n'
'7=0\n'
'8=0\n'
'9=0\n'
'10=0\n'
'11=0\n'
'12=0\n'
'13=0\n'
'17=0\n'
'18=0\n'
'20=0\n'
'21=0\n'
'CurrentState=1\n'
'VuserStateHistory= 0\n'
'LastReplayStatus=0\n'
'[Transactions]\n'
''+P_transaction+'=\n')
return P_usr
def 加工Action(P_url,P_Body,P_transaction):
"""
加工Action.c文件
"""
actionB=('Action(){\n'
'\tlr_start_transaction("'+P_transaction+'");\n'
'\tweb_add_auto_header("Authorization","Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsibWVyY3VyeS1hcHAiXSwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwidXNlcl9uYW1lIjoiMTIzNDU2Nzg5OTkiLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwidXNlclR5cGUiOiIxIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9DVVNUT01FUiJdLCJqdGkiOiIzZjBhZmRhZS1mNzhiLTQxNjUtOTI1OC1mNTVjMTg2ZTViOTkiLCJjbGllbnRfaWQiOiJhcHAiLCJ1c2VybmFtZSI6IjEyMzQ1Njc4OTk5In0.ELc9KTPe9biZjcib0uHWkoSplefQvyjiJjUjOn81118");\n'
'\t//web_set_sockets_option("SSL_VERSION","2&3");\n'
'\t// "code": 0, "msg": "操作成功"\n'
'\tweb_reg_save_param("P_status",\n'
'\t\t"LB=\\"code\\":",\n'
'\t\t"RB=,",\n'
'\t\t"NotFound=WARNING",\n'
'\t\t"Search=Body",\n'
'\t\tLAST);\n'
'\tweb_reg_save_param("E_errMsg",\n'
'\t\t"LB=\\"msg\\":\\"",\n'
'\t\t"RB=\\"",\n'
'\t\t"NotFound=WARNING",\n'
'\t\t"Search=Body",\n'
'\t\tLAST);\n'
'\tweb_custom_request("'+P_url[P_url.rfind('/')+1:]+'",\n'
# '\t\t"URL=http://{P_IP}'+P_url+'",\n'
'\t\t"URL=https://xxxxxxxx.cn'+P_url+'",\n'
'\t\t"Method=POST",\n'
'\t\t"TargetFrame=",\n'
'\t\t"Resource=0",\n'
'\t\t"Referer=",\n'
'\t\t"Mode=HTTP",\n'
'\t\t"snapshot=t123.inf",\n'
'\t\t"EncType=application/json",\n'
'\t\t"Body='+P_Body+'",\n'
'\t\tLAST);\n'
'\tif (strcmp(lr_eval_string("<P_status>"), "0") == 0) {\n'
'\t\tlr_end_transaction("'+P_transaction+'", LR_PASS);\n'
'\t}else{\n'
'\t\tlr_end_transaction("'+P_transaction+'", LR_FAIL);\n'
'\t\tlr_convert_string_encoding(lr_eval_string("<E_errMsg>"),"UTF-8",NULL,"E_errMsg");\n'
'\t\tlr_save_string(lr_eval_string("<E_errMsg>"),"E_errMsg");\n'
'\t\tlr_error_message("'+P_transaction+'失败:%s",lr_eval_string("<E_errMsg>"));\n'
'\t}\n'
'\treturn 0;\n'
'}')
return actionB
if __name__ == '__main__':
# 获取read_file()返回的count_result
canshu = read_file(r'C:\Users\Administrator\Desktop\input\jiekou.xlsx')
# 遍历每一行
for i in range(0, len(canshu)):
# 获取XXX.usr
P_title = str(canshu[i][0][0]).replace(' ', '')
# 获取url
P_url = str(canshu[i][0][1])
# 获取请求报文并加工:去除换行,双引号转义,去除空格
P_Body = str(canshu[i][0][2]).replace('\n', '').replace('"', '\\"').replace(' ', '')
# 获取加工Action(P_url,P_Body,P_transaction)返回的actionB
act = 加工Action(P_url, P_Body, str(i).zfill(2)+'_'+P_title)
# 获取加工Usr(P_transaction)返回的P_usr
usr_act = 加工Usr(P_title)
# mik_dir(r'C:\Users\Administrator\Desktop\shishi')
# print(act)
# 生成每一个文件夹,以两位数字+'-'+P_title命名
mik_dir('C:\\Users\\Administrator\\Desktop\\shishi\\'+str(i).zfill(2)+'_'+P_title)
# 创建好文件夹后,开始写入有改动的Action.c和XXX.usr文件
# name为'Action.c'时,body的值是act,name为P_title+'.usr'时,body的值是usr_act。
# 注意字典在for循环的用法!键值对!
for name, body in {'Action.c': act, P_title+'.usr': usr_act}.items():
creatAction('C:\\Users\\Administrator\\Desktop\\shishi\\'+str(i).zfill(2)+'_'+P_title, name, body)
源文件夹样式
接口excel表样式
最后生成的样例
其他内容自己改!