python一键生成批量接口性能测试脚本-loadrunner

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表样式
在这里插入图片描述
最后生成的样例
在这里插入图片描述
在这里插入图片描述
其他内容自己改!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值