• 案例背景

组件性能测试过程中,要导入大量自定义的数据。

  • 案例分析

本案例中采用python的pandas库,模拟了生成导入csv文件,模拟在页面点击导入csv,使文件导入更高效。

  • 实现方案

1、在前端页面解析内部接口参数

典型的导入流程至少包含上传文件和确认上传。

  1. 上传文件

在浏览器中打开F12,进入Network,点击文件上传并选择填好的文件,可以采集到请求过程中的参数如下:

内部接口地址Request URL:

http://10.1.1.18/ui/person/import

请求头Request Headers中:

Accept-Encoding: gzip, deflate

Content-Type: multipart/form-data;

Cookie: JSESSIONID=B1E48114C18B15DA7064E55D0706AC30; CASTGC=TGT-4-mfFXZJr9k2VPxsbBinEqgOliUqecTeQWNPekXdHPcUEtryXaJ7-cas

请求参数:

organizationId: 1

language: zh_cn

file: (binary)

2、确认上传

待导入文件校验完成后,点击导入,可以采集到确认上传的参数如下:

内部接口地址Request URL:

http://ip/ui/person/save

请求头Request Headers中:

Accept-Encoding: gzip, deflate

Content-Type: application/json;charset=UTF-8;

Cookie: JSESSIONID=B1E48114C18B15DA7064E55D0706AC30; CASTGC=TGT-4-mfFXZJr9k2VPxsbBinEqgOliUqecTeQWNPekXdHPcUEtryXaJ7-cas

请求参数:

code: "f82bf0f1-9005-491c-a58b-631d8552f3c8"

flag: 1

orgCode: ""

其中code表示/person/import接口的返回参数校验任务Id

2、用脚本模拟导入过程

文件导入的校验中有数据库的唯一性校验,字段校验,用python脚本可以方便的构造需要格式的csv

1、构造csv

生成随机的身份证号,大概率唯一。

引入pandas计算库,构造DataFrame数据类型,并保证到csv文件中,csv文件需要以gbk格式写入。

def to_csv():

    personList=[]

    personList.append(["姓名:1~32个字符;不能包含 ' / \: * ? "" < > | 这些特殊字符。"])

    for i in range(10001):        code=str(random.randint(100000,999999))+str(random.randint(1950,1999))+'0'+str(random.randint(0,9))+'0'\

             +str(random.randint(0,9))+str(100000+i)

        personList.append(["测试_"+str(i),"1","默认组织","111",code,code,13165867896])

    print(personList)

    data1 = pd.DataFrame(personList)

    path=r'peson.csv'

    file=open(path, 'w+', encoding='utf-8')

    data1.to_csv(sep=',', encoding='gbk',index=False, header=False,path_or_buf=path)

2、上传文件

前后端交互采用的是接口模式,在Header中加入Cookie即可模拟登录,不会被单点登录拦截。

将上一步生成的csv文件打开,作为/ui/person/import接口的file参数传入,请post方式请求。

def importPersonFromCsv():

    global code

    url = '=/ui/person/import'

    param = ''

    user_url = 'http://' + ip + url+param

    print(user_url)

    # 我们操作文件上传的时候,把目标文件以open打开,PersonImport.csv

    files = [('file', ('peson.csv',open('peson.csv', 'rb'),'application/vnd.ms-excel'))]

    data = {"organizationId": "1", "language": "zh_cn"}
headers = {'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Cookie': cookie}

    r = requests.post(user_url,data,files=files,headers=headers)

    print(r.text)

    code = r.json().get('data')

    print(code)

    return code

3、确认导入

待文件上传完成、校验完成后,才能调用确认导入接口,否则会报错。请求头中Content-Type需要为application/json;charset=UTF-8,传入有效cookie,保证不会被拦截。

def saveImportPerson():

    url = '/ui/person/'

    param = ''

    user_url = 'http://' + ip + url+param

    print(user_url)

    data = json.dumps({"flag": 1,"code": code,"orgCode":""})

    headers = {'Accept-Encoding': 'gzip, deflate',

               'Content-Type': 'application/json;charset=UTF-8',

              'Cookie': cookie}

    r = requests.post(user_url,data=data,headers=headers)

    print(r.text)
  • 结束语

1、文件校验是异步过程,上传文件接口返回数据不能保证校验完成,可以等待若干秒后,确认导入必须在校验完成后调用。