微信号:grzlwx

介绍:光荣之路官方资讯

用python提高测试效率,我行你也行!

2018-11-06 08:30 夜鸣猪

新书

速递

吴老的java版《selenium webdriver 实战宝典》和python版《selenium Webdriver 3.0 自动化测试框架实战指南》出版了,代码拿来就能用。

文 |  夜鸣猪

前几天在用csv文件给jmeter做参数化时碰到了一个场景:将研发给我的5万条数据依照数量平均分成五份,再分别用jmeter跑一次流程。

按照我以往的工作方式,我大概会新建好5个文件,然后分别给这5个文件依次拷贝1万条数据。这样做既费精力又伤眼睛,相信很多人都有这种体会。庆幸的是吴老师上一节课正好讲过用python读写文件的方法,我这次正好用上,这里做一个小分享。

首先,理一下完成目标的思路:从源文件中读取数据写入另一个文件中,每个文件满1万行,就换一个文件。这里我想到的两种实现方式:

1)读取数据存到列表中,将列表中数据存到文件中,每写入1万条数据便换一个文件

2)每读出一条数据便写入到新的文件中,每个文件满1万条数据就换一个文件写。

接着,开始编写代码:
1)读一条写一条:
startTime =time.time() #程序运行开始时间
with open(r"E:\工作\1010同时做任务\源数据.csv",'r') as fp:
 
    for i in range(5):
        count=0#给文件中写入数据计数,每换一个文件就将数据量重置为0
        while count<10000:#每个文件写入1万条数据就写入另一个文件
            data = fp.readline().strip()#按行读取数据时会有换行符,用strip()方法去掉
            with open(r"E:\工作\1010同时做任务\测试数据"+str(i+1)+".csv",'a+') as fq: #目标路径不存在时,则自动创建文件。
               fq.write(data+"\n")#将数据写入文件时,默认没有换行符,需要在每条数据后面加上“\n”
            count+=1#给每个文件写入的数据计数,超过1万条跳出循环往下一个文件写入
                           
        print("已创建第%s个文件"%str(i+1))#程序运行结束时间

endTime  = time.time()
print("共花费%s秒"%str(int(endTime-startTime)))

2)每读出一条数据便写入到新的文件中,每个文件满1万条数据就换一个文件写:
import  time
startTime =time.time()
#encoding=utf-8

with open(r"E:\工作\1010同时做任务\源数据.csv",'r') as fp:
    data=[]#定义一个列表用来装数据
    while 1:
        data.append(fp.readline().strip())
        if len(data)>=50000:#读取5万条数据
            break
            
for i in range(0,5):  #将5万条数据分5次写入到不同文件中
    with open(r"E:\工作\1010同时做任务\测试数据"+str(i+6)+".csv",'w') as fp:
        startNum =  i*10000        
        for j in data[startNum:startNum+10000:]:#每次从列表中取1万条数据写入文件
            fp.write(j+"\n")
    print("已创建第%s个文件"%str(i+1))

endTime  = time.time()
print("共花费%s秒"%str(endTime-startTime))

运行结果如下图1,图2所示:


图1 方法一(读一行写一行)

图2 方法二(读取所有需要的数据到列表中,分批写入)

两次程序运行生成的文件如图3,图4所示:

图3 各生成5个文件

图4 每个文件写入1万条数据

由上面的结果图可以看出:第一种方式是牺牲时间换空间的方式,运行时占用内存很小,但是弊端在于需要频繁打开文件写入数据,速度较慢;第二种方式速度很快,在电脑内存资源吃紧的时候可以减少每次中转的数据量。本人电脑内存远超这些数据大小,此场景选择第二种方式,大家可根据需求选择不同的读写方式。

结束语:

很简单的几行代码,写完加调试,一共也就几分钟,回过头来看,这几行代码任然有改进的空间,比如对源文件每一行的数据进行校验。这是本人第一次在工作中主动用编程来实现自己的想法,实际上也是节约了不少的精力和时间。相信随着学习深入,我会写更多的小脚本来提升自己或其他人的工作效率。

完整代码如下:
1)方法一(读一行写一行):
#encoding=utf-8
import  time
startTime =time.time()
with open(r"E:\工作\1010同时做任务\源数据.csv",'r') as fp:
    
    for i in range(5):
        count=0
        while count<10000:#每个文件写入1万条数据就写入另一个文件
            data = fp.readline().strip()
            with open(r"E:\工作\1010同时做任务\测试数据"+str(i+1)+".csv",'a+') as fq:
               fq.write(data+"\n")
            count+=1
                           
        print("已创建第%s个文件"%str(i+1))

endTime  = time.time()
print("共花费%s秒"%str(int(endTime-startTime)))

2)方法二(读取所有需要的数据到列表中,分批写入)
#encoding=utf-8
import  time
startTime =time.time()
#encoding=utf-8

with open(r"E:\工作\1010同时做任务\源数据.csv",'r') as fp:
    data=[]
    while 1:
        data.append(fp.readline().strip())
        if len(data)>=50000:
            break
           
for i in range(0,5):  
    with open(r"E:\工作\1010同时做任务\测试数据"+str(i+6)+".csv",'w') as fp:
        startNum =  i*10000
        for j in data[startNum:startNum+10000:]:

            #每次读1万条
            fp.write(j+"\n")
    print("已创建第%s个文件"%str(i+1))

endTime  = time.time()
print("共花费%s秒"%str(endTime-startTime))

实战:微信小程序+appium测试实例

实战:微信公众号+appium测试实例

使用LR编写windows sockets协议xml报文格式脚本

Python实战:file tell()返回的指针怎么就不一样?

互联网架构的演变

草根在测试行业如何杀出一条血路(3)

2018web测试开发培训一年期周六班!

喜马拉雅app搜索并收听“光荣之路”电台
光荣之路
招聘|征稿|合作 |QQ群
735821166@qq.com
python群:457561756
性能群:415987441
招聘群:203715128
感谢认真阅读的你!
 
光荣之路 更多文章 【第103讲】如何学好编程和算法+循环知识和随机算法的设计 免费送书 | 《京东质量团队转型实战》 草根在测试行业如何杀出一条血路(4)- 新入职十三步 说说“功能正确”和“测试找bug”的“矛盾” 内推:京东 | 测试开发工程师
猜您喜欢 关于PHP程序员解决问题的能力 程序员的绩效之谜 活动连连看 | 5月28日、29日【成都】【武汉】【西安】 离线安装hadoop最新发行版本hdp2.4 Postman 如何处理上一个接口返回值作为下一个接口入参?