工作背景

  性能测试工程师,主要测试工具--loadrunner,主要是接口测试。

实现功能

  loadrunner对报文格式的转换存在问题,部分报文无法转换,故使用Python编写脚本自动将soap协议报文转换为loadrunner默认的格式。

转换步骤

soap协议原报文如下:

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="URL">
  2. <soapenv:Header/>
  3. <soapenv:Body>
  4. <ser:queryRiskPolicyCaseInfo>
  5. <!--Zero or more repetitions:-->
  6. <arg0>
  7. <!--Optional:-->
  8. <clientInfo>
  9. <!--Optional:-->
  10. <batchNo>?</batchNo>
  11. <!--Optional:-->
  12. <size>?</size>
  13. </clientInfo>
  14. <!--Optional:-->
  15. <riskPolicyCaseSubDto>
  16. <!--Optional:-->
  17. <riskPolicyCaseRequestInfo>
  18. <!--Optional:-->
  19. <companyCode>?</companyCode>
  20. <!--Optional:-->
  21. <currentPage>?</currentPage>
  22. <!--Optional:-->
  23. <districtCode>?</districtCode>
  24. <!--Optional:-->
  25. <districtLevel>?</districtLevel>
  26. <!--Optional:-->
  27. <endDate>?</endDate>
  28. <!--Optional:-->
  29. <pageSize>?</pageSize>
  30. <!--Optional一页多少条:-->
  31. <riskCode>?</riskCode>
  32. <!--Optional风险等级:-->
  33. <riskRuleCode>?</riskRuleCode>
  34. <!--Optional:-->
  35. <ruleType>?</ruleType>
  36. <!--Optional:-->
  37. <startDate>?</startDate>
  38. </riskPolicyCaseRequestInfo>
  39. </riskPolicyCaseSubDto>
  40. </arg0>
  41. </ser:queryRiskPolicyCaseInfo>
  42. </soapenv:Body>
  43. </soapenv:Envelope>

代码如下:

  1. import re
  2. """
  3. 将soap格式的报文修改为loadrunner格式
  4. """
  5. file = r"C:\\Users\\zg\\Desktop\\报文转换\\报文.txt"
  6. file_out = r"C:\\Users\\zg\\Desktop\\报文转换\\转换后的报文.txt"
  7. #报文头部
  8. header = 'soap_request("StepName=google", \n"ExpectedResponse=AnySoap", \n'+'"URL=www.baidu.com'+'"'\
  9. +', \n"SOAPEnvelope= "\n"<?xml version=\\"1.0\\" encoding=\\"utf-8\\"?>"'
  10. #报文尾部
  11. last = '"Snapshot=t1.inf",\n"ResponseParam=result",\nLAST );'
  12. with open(file_out,'w') as f_clear:
  13. #写文件前清空文件
  14. f_clear.truncate()
  15. f_clear.write(header+'\n')
  16. #确定line_num
  17. line_num = 1
  18. #确定文件的行数
  19. numbers = len(open(file,'r').readlines())
  20. #编辑原报文
  21. with open(file) as f_in:
  22. for line in f_in.readlines():
  23. #判断是否为空行
  24. if len(line.strip()) > 0:
  25. # 找出每行第一个非空字符的位置(正则表达式)
  26. num = re.search(r'\S', line).span()[0]
  27. #判断是否为最后一行
  28. if line_num < numbers:
  29. # 对每行进行拼接
  30. line = line[:num] + '"' + line[num:].replace('"', r'\"').rstrip() + '"'
  31. line_num += 1
  32. else:
  33. line = line[:num] + '"' + line[num:].replace('"', r'\"').rstrip() + '"' + ','
  34. #在最后一行行尾添加逗号‘,’
  35. else:
  36. line = '\r\t\n'
  37. line_num += 1
  38. #将修改后的内容写入新的文件
  39. with open(file_out,'a') as f_out:
  40. f_out.write(line + "\n")
  41. #追加报文尾部
  42. with open(file_out,'a') as f_out:
  43. f_out.write(last)

运行代码,转换后的报文如下:

  1. soap_request("StepName=google",
  2. "ExpectedResponse=AnySoap",
  3. "URL=www.baidu.com",
  4. "SOAPEnvelope= "
  5. "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  6. "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"URL\">"
  7. "<soapenv:Header/>"
  8. "<soapenv:Body>"
  9. "<ser:queryRiskPolicyCaseInfo>"
  10. "<!--Zero or more repetitions:-->"
  11. "<arg0>"
  12. "<!--Optional:-->"
  13. "<clientInfo>"
  14. "<!--Optional:-->"
  15. "<batchNo>?</batchNo>"
  16. "<!--Optional:-->"
  17. "<size>?</size>"
  18. "</clientInfo>"
  19. "<!--Optional:-->"
  20. "<riskPolicyCaseSubDto>"
  21. "<!--Optional:-->"
  22. "<riskPolicyCaseRequestInfo>"
  23. "<!--Optional:-->"
  24. "<companyCode>?</companyCode>"
  25. "<!--Optional:-->"
  26. "<currentPage>?</currentPage>"
  27. "<!--Optional:-->"
  28. "<districtCode>?</districtCode>"
  29. "<!--Optional:-->"
  30. "<districtLevel>?</districtLevel>"
  31. "<!--Optional:-->"
  32. "<endDate>?</endDate>"
  33. "<!--Optional:-->"
  34. "<pageSize>?</pageSize>"
  35. "<!--Optional一页多少条:-->"
  36. "<riskCode>?</riskCode>"
  37. "<!--Optional风险等级:-->"
  38. "<riskRuleCode>?</riskRuleCode>"
  39. "<!--Optional:-->"
  40. "<ruleType>?</ruleType>"
  41. "<!--Optional:-->"
  42. "<startDate>?</startDate>"
  43. "</riskPolicyCaseRequestInfo>"
  44. "</riskPolicyCaseSubDto>"
  45. "</arg0>"
  46. "</ser:queryRiskPolicyCaseInfo>"
  47. "</soapenv:Body>"
  48. "</soapenv:Envelope>",
  49. "Snapshot=t1.inf",
  50. "ResponseParam=result",
  51. LAST );

  后期会使用Tkinter模块实现其图形界面化,代码中用到正则表达式模块re,以后会有专门的文章对其进行描述,本人为Python入门菜鸟,大神请绕过,不喜勿喷!

Python对文本文件的简单操作(一)的更多相关文章

  1. python对mysql进行简单操作

    python 连接MySQL数据库,进行简单操作 一.连接MySQL数据库,关闭连接 import pymysql db = pymysql.connect(host="xxx.xxx.x. ...

  2. python中通过selenium简单操作及xpath元素定位&轴定位

    浏览器的简单操作 # 导入webdriver模块 # 创建driver对象,指定Chrome浏览器 driver = webdriver.Chrome() # 窗口最大化 driver.maximiz ...

  3. python+mysql数据库的简单操作

    最近接了一个任务,测试某项类似于收益情况报表的功能,因计算公式复杂,单纯手算过于复杂,所以想到写成脚本 根据python的分治原则,先整了几个函数用于实现计算逻辑,后发现数据输入过于繁琐,所以决定使用 ...

  4. Python第一天——入门Python(2)字符串的简单操作

    数据的操作 字符串的一些常用操作: 1 1 #!/usr/bin/env python 2 # #coding=utf-8 3 # 4 # test='hello world' 5 # print(t ...

  5. Python学习笔记_03:简单操作MongoDB数据库

    目录 1. 插入文档 2. 查询文档 3. 更新文档 4. 删除文档   1. 插入文档 # -*- coding: UTF-8 -*- import datetime from pymongo im ...

  6. python redis基本概念简单操作

    转自:http://www.cnblogs.com/melonjiang/p/5342383.html 一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储 ...

  7. 【转】python win32api win32gui win32con 简单操作教程(窗口句柄 发送消息 常用方法 键盘输入)

    作者:https://blog.csdn.net/qq_16234613/article/details/79155632 附:https://www.programcreek.com/python/ ...

  8. python 对mongdb的简单操作

    准备工作:1.选择安装合适的mongodb到本地电脑,2.创建mongodb实例,3,开启mongodb实例,4,下载pymongo第三方库,5.下载pycharm对mongodb可视化支持的插件mo ...

  9. python中文件的基础操作

    打开文件的三种方式: open(r'E:\学习日记\python\code\文件的简单操作.py') open('E:\\学习日记\\python\\code\\文件的简单操作.py') open(' ...

随机推荐

  1. JAVA时间加工类

    /** * 当天凌晨 */ public static Calendar startOfDay(Calendar c) { if (c == null) { return c; } c.set(Cal ...

  2. Samuraiwtf-的确是很好的渗透学习平台

    有人问我要渗透测试平台学习,我想到了Samurai ,记得里面带有很多的,这里来推广一下. Samurai Web 测试框架很多人说是live CD测试环境,但是现在似乎不是了,至少目前最新版的只有这 ...

  3. NopCommerce 3.80框架研究(二) MVC 表示层与数据验证

    表示层框架结构 /Views/Shared/_Root.Head.cshtml /Views/Shared/_Root.cshtml /Views/Shared/_ColumnsOne.cshtml ...

  4. mac上Apache修改目录浏览权限

    sudo vim /etc/apache2/httpd.conf <Directory "/Library/WebServer/Documents"> # # Poss ...

  5. 文件系统 - Linux 支持的文件系统类型

    NAME 文件系统 - Linux 支持的文件系统类型:minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sy ...

  6. OO2019第四单元作业总结

    一.本单元两次作业的架构设计  1.第一次作业 第一次作业由于时间仓促,没有过多的架构设计,就直接补全了所给的MyUmlInteraction类,导致整个程序的代码风格和效率都不高,在强测中也因此失掉 ...

  7. Java控制语句例题,for循环语句,if条件语句等,Scanner类与Random类,Math.max()方法

    例题:编写程序,生成5个1至10之间的随机整数,并打印结果到控制台 import java.util.Random;class demo09 { public static void main(Str ...

  8. IDEA注释模板设置

    1. 文件注释 1.1 Java类文件注释 Setting -> Editor -> File and Code Templates -> Includes -> File H ...

  9. JS时间格式和时间戳的相互转换

    时间戳转化为日期的方式 ; var newDate = new Date(); newDate.setTime(timestamp * ); // Mon May 28 2018 console.lo ...

  10. Qt之QThread随记

    这是一篇随记,排版什么的就没有那么好了:) 首先要知道,一个线程在资源分配完之后是以某段代码为起点开始执行的,例如STL内的std::thread,POSIX下的pthread等,都是以函数加其参数之 ...