51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4289|回复: 0
打印 上一主题 下一主题

[原创] Python助力性能测试——报文批量生成

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-3-3 10:45:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    当前,我国金融体系内交易量持续增长,业务场景日趋复杂。系统交易量的增加,临时产生的集中业务需求,都会使服务器面临考验,因此,需要对系统进行性能测试。在金融系统中,报文处理是必不可少的。各大金融机构间通过报文的交换进行信息流的传递,从而最终实现资金的跨机构流转。在对金融系统的性能测试中,自然也少不了与报文打交道,而性能测试往往伴随着大量数据准备。那么,如何高效地生成大量报文呢?
      试想这样一种场景:某金融机构需在特定时间内进行一波资金划转,该业务是新增交易,且交易数量较大,需要准备大量报文对服务器进行性能测试。数据的准备有很多方法,其中Python由于易上手且兼具灵活性而逐渐受到测试工程师们的青睐。今天,我们就来介绍一下如何通过Python批量生成测试报文。
      1.批量报文准备
      上述例子中提到的报文一般可分为单交易报文和批量交易报文两种。单交易报文的获取是非常容易的,而批量交易报文则可通过单交易报文生成,Python中的pyperclip模块为实现这一功能提供了便捷的支持。pyperclip中的copy和paste方法分别可实现向剪切板发送文本和从剪切板读取文本。下面的代码实现了读取单交易信息,并生成指定数量批量交易的功能:
    import pyperclip
    # 交易数量
    dealNum = 2
    # 读取单交易信息并复制到剪贴板
    with open(r'test.txt', encoding='utf-8') as f:
        txt = f.read()
    pyperclip.copy(txt)
    # 生成批量交易
    res = ''
    dealInfo = pyperclip.paste()
    for i in range(dealNum):
        res = '{}\n{}'.format(res, dealInfo)
    print(res)


      当交易数量为2时,生成报文示例如下:
    <tag>测试报文</tag>
    <tag>测试报文</tag>


      2.交易号生成
      在一笔交易中,往往包含标志交易唯一性的定长交易号。从上一步中,我们得到了拥有相同信息的若干笔交易,但由于交易号相同,直接发送上述交易报文会因重复编号导致记账失败。我们很容易想到,可以通过random函数生成随机数来模拟不同交易,但如何确保编号的唯一性呢?random模块中包含一个名为sample的方法,通过它,可以生成不重复的随机数。例如,通过以下代码可得到5个不重复的8位随机数:
    import random

    # 随机生成8位交易号
    traNo = random.sample(range(10**7, 10**8), 5)
    print(traNo)


      返回生成的随机数列表,如下:
    [69244291, 71447069, 95104116, 91919619, 50861438]

      3.交易号替换,目标报文生成
      在前面步骤均已完成的前提下,下一步就可以进行编号的替换了。报文中的交易号一般形式为“<标签>编号</标签>”,对于此类数据的替换,正则表达式是非常有效的手段。Python中的re模块可通过正则表达式进行字符串的匹配,下面的代码通过查找交易标签,对其中的交易编号进行了替换:
    import re

    # file:待替换文件
    # numberList:随机交易号列表
    def alter_file(file, numberList):
        fileData = ''
        i = 0
        with open(file, 'r', encoding='utf-8') as f:
            for line in f:
                if '<tag>' in line:
                    newStr = '<tag>{}</tag>'.format(numberList)
                    i += 1
                    line = re.sub(r'<tag>\d+</tag>', newStr, line)
                fileData += line
        with open('result.txt', 'w', encoding='utf-8') as f:
            f.write(fileData)


      在以下示例中,原有的编号已被替换成为了不重复随机数。



      实际测试中,结合以上方法,即使上万条交易报文也能轻松准备,为性能测试的开展提供了有力的支持。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 13:52 , Processed in 0.063095 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表