`

pycul写的对url地址的性能测试脚本

阅读更多
性能测试的脚本说明:

这个是对常规的url做性能测试用的.

例子:
Python testtype1.py www.tudou.com 3 2 result.log


第一个参数可以是一个url  最好不要带&符号…如果url要带&符号 请用~amp; 代替
第二个参数 是 几秒后开始
第三个参数是 并发 个数(根据我在做当时直播服务器时测试的感觉,这个参数最大值在1500至2500中,一旦太大就脚本自己会crash,所以要实现更多的线程并发只能通过到多台机器上跑这个脚本,这也是那个性能测试工具做的事.)
第四个参数是日志文件地址

一般情况下这个脚本启动后,你不去kill进程200秒后会自己退出,当然如果你想延长时间可以自己该脚本中run_time这个值.你可以开2个终端到脚本的当前目录,一个用来启动脚本,一个用来 tail –f result.log(日志名),看数据如下:

创建2个线程 3秒后访问 tudou.com 日志会写到result.log中  每3秒写一次
日志的形式:
Transactions:0,Availability:0.0,Elapsed_time:2.001,Data_transferred:0.0,Response_time:0.0,Transaction_rate:0.0,Throughput:0.0,Concurrency:0.0,Successful_transactions:0,Failed_transactions:0,Longest_transaction:0.0,Shortest_transaction:100000.0

Transactions:49246,Availability:95.2,Elapsed_time:8.017,Data_transferred:11.532,Response_time:6.635,Transaction_rate:150.727,Throughput:0.04,Concurrency:200.0,Successful_transactions:46875,Failed_transactions:0,Longest_transaction:0.19,Shortest_transaction:0.36

Transactions:98630,Availability:93.7,Elapsed_time:14.025,Data_transferred:23.303,Response_time:7.036,Transaction_rate:142.126,Throughput:0.04,Concurrency:200.0,Successful_transactions:92410,Failed_transactions:0,Longest_transaction:0.2,Shortest_transaction:0.36
对应的日志数据含义:
#执行次数
#成功率
#总耗时
#数据量(MB)
#响应时间(ms)
#执行率(t/s)
#吞吐速度(mb/s)
#并发个数
#成功次数
#失败次数
#最长响应时间
#最短响应时间
                      )艾丝凡答复
这个脚本需要装下pycurl就可以跑了,linux,windows都可以跑

#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: zeal
import pycurl,time,threading,random,StringIO
import sys,socket
socket.setdefaulttimeout(60)

Longest_transaction = 0
Shortest_transaction = 100.0
error_amount = 0
pass_amount = 0


total_amount = 0
total_time = 0
downloaded = 0


threads_dict = {}
threads_amount = 0
run_time = 200

begin_time = time.time()

last_line="Transactions:%s,Availability:%s,Elapsed_time:%s,Data_transferred:%s,Response_time:%s,Transaction_rate:%s,Throughput:%s,Concurrency:%s,Successful_transactions:%s,Failed_transactions:%s,Longest_transaction:%s,Shortest_transaction:%s"
print last_line
#print 'last_linelen',len(last_line.split(',')),last_line.split(',')
def write_data(filehandle):
"""
计算数据,往日志文档写日志数据
"""
    Concurrency = threading.activeCount()-2
    haveruntime = time.time() - begin_time
    try :
        Availability = ( pass_amount*1.0/total_amount )
        Response_time = ( total_time/pass_amount )
        Transaction_rate = ( pass_amount/haveruntime )
        Throughput = ( downloaded/total_time )/(1024*1024)
    except Exception, e:
        print 'write data error%s'%e
        Availability = 0
        Response_time = 0
        Transaction_rate = 0
        Throughput = 0
        
    Concurrency = threading.activeCount()-2
    haveruntime = time.time() - begin_time
    print 'haveruntime=',haveruntime
    data= (int(total_amount),#执行次数
                  round(Availability*100.0,1),#成功率
                  round(haveruntime,3),#总耗时
                  round(downloaded/(1048576.0),3 ),#数据量(MB)
                  round(Response_time*1000,3),#响应时间(ms)
                  round(Transaction_rate,3),#执行率(t/s)
                  round(Throughput,2),#吞吐速度(mb/s)
                  round(Concurrency,3),#并发个数
                  int(pass_amount),#成功次数
                  int(total_amount-pass_amount),#失败次数
                  round(Longest_transaction,2),#最长响应时间
                  round(Shortest_transaction*1000,2)#最短响应时间
                      )

    print 'format data =',data
    result = last_line%data
    
    tmp=[e.split(":")[1] for e in result.strip().split(",")]
    print 'tmp=',tmp
    print time.ctime(),'result =',result
    filehandle.write(result+'\n')
    filehandle.flush()



class Test(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name = 'thread_'+str(name)
        self.data = StringIO.StringIO()
        self.curl = pycurl.Curl()
        self.total_time = 0.0
        self.downloaded = 0.0
        self.pass_amount  = 0.0
        self.total_amount = 0.0
        self.curl.setopt(pycurl.NOPROGRESS, 1)
        self.curl.setopt(pycurl.WRITEFUNCTION, self.data.write)
        self.curl.setopt(pycurl.MAXREDIRS, 5)
        self.curl.setopt(pycurl.USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.2)")
        self.curl.setopt(pycurl.NOSIGNAL, 1)  
        self.info = {
                     'Transactions':0,
                     'Availability':0.0,
                     'Elapsed_time':0,
                     'Data_transferred':0,
                     'Response_time':0,
                     'Transaction_rate':0,
                     'Throughput':0,
                     'Concurrency':1,             
                     }

    def run (self):
"""
主程序,对单个url做不断的请求,直到规定时间到,自动结束生命周期
"""
        while True:
            try:
                    global error_amount,Longest_transaction,Shortest_transaction,pass_amount,total_amount,downloaded,total_time
"""
控制单个线程的生命时间
"""
                    if time.time()-begin_time>run_time:
                        break

                    url = random.choice(urllist)
                    print url,'name',self.name
#                    c = pycurl.Curl()
                    self.curl.setopt(pycurl.URL, url)      
                    self.curl.perform()

                    self.total_time += self.curl.getinfo(pycurl.TOTAL_TIME)
                    total_time += self.curl.getinfo(pycurl.TOTAL_TIME)
                    self.downloaded += self.curl.getinfo(pycurl.SIZE_DOWNLOAD)
                    downloaded+= self.curl.getinfo(pycurl.SIZE_DOWNLOAD)
"""
获取最小响应时间和最长响应时间,不断的替换这2个全局变量
"""                 
                    if self.curl.getinfo(pycurl.TOTAL_TIME) > Longest_transaction:
                        Longest_transaction = self.curl.getinfo(pycurl.TOTAL_TIME)
                    if self.curl.getinfo(pycurl.TOTAL_TIME) < Shortest_transaction :
                        Shortest_transaction = self.curl.getinfo(pycurl.TOTAL_TIME)
"""
计算成功和总执行次数
"""                    
                    self.pass_amount += 1
                    pass_amount =pass_amount + 1
                    self.total_amount +=1
                    total_amount =total_amount + 1
"""
每个线程的数据
"""                    
                    if self.total_time and self.pass_amount:
                        self.info = {
                             'Transactions':self.total_amount,
                             'Concurrency':1,
                             'Successful_transactions':self.pass_amount,          
                             'Elapsed_time':self.total_time,
                             'Data_transferred':self.downloaded,
                             
                             'Availability':self.pass_amount/self.total_amount,
                             'Response_time':self.total_time/self.pass_amount,
                             'Transaction_rate':self.pass_amount/self.total_time,
                             'Throughput':self.downloaded/self.total_time
                             }
            except Exception, e:
                error_amount +=1
                self.total_amount +=1
                total_amount =total_amount + 1
                self.curl = pycurl.Curl()
                print "self.curl.perform() Exception : %s"%e
        self.curl.close()
    def progress(self,download_t, downloaded, upload_total, uploaded):
#        print 'progress=',download_t,downloaded,upload_total,uploaded
        pass


class Collector(threading.Thread):
"""
收集每个线程的数据来汇总结果,每6秒往日志文档写一次数据
"""
    def __init__(self,path = 'result.log'):
        threading.Thread.__init__(self)
        self.log_path = path
        self.name = 'collector'

    def run (self):
#        try:
        log = open(log_path,'a')      
        while True:
#            global error_amount,Longest_transaction,Shortest_transaction,pass_amount,threads_dict,total_amount,downloaded,total_time
            
            write_data(log)
            time.sleep(6)
            if time.time()-begin_time>run_time+4:
                write_data(log)
                time.sleep(3)
                break
        write_data(log)
#        except Exception, e:
#            print "Collector Exception : %s"%e
        log.close()
        
if __name__=='__main__':
"""
获取输入参数
"""
    if len(sys.argv)>2 :
        print 'sys.argv=',sys.argv
        cmd = str(sys.argv[-4]).replace('~amp;','&')#url地址
        sleep_time = int(sys.argv[-3])#-time.time()#过几秒后开始执行,这个参数是配合分布式,多台机器一起跑脚本时用到,单个执行不是很重要
        threads_amount = int(sys.argv[-2])#并发量,创建多少线程
        log_path=str(sys.argv[-1])  #日志文件地址
    else:
"""
无输入参数时的默认参数
"""
        cmd = 'www.baidu.com'
        sleep_time = 3
        threads_amount = 2
        log_path = 'result.log'
        
    r_file = open(log_path,'a')   
    init = last_line%(0,0,0,0,0,0,0,0,0,0,0,0)
    r_file.write(init+'\n')
    r_file.close()
    
    if sleep_time>0:
        print 'will sleep %d s'%sleep_time
        time.sleep(sleep_time)
        print 'start work~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
             
    urls = cmd.split('@')
    
    c = Collector(log_path)
    collector = [c]
    c.setDaemon(1)
    c.start()
    
    urllist = urls
    print 'urllist=',urllist

    
    for i in range(threads_amount):
        t = Test(i)
        threads_dict[t.name] = t
        
    print 'threads_dict',threads_dict
    
    for t in threads_dict.values():
        t.setDaemon(1)
        t.start()
        print t.name,'have started'

    for th in threads_dict.values():             
        th.join()
        print 'name=',th.name,'info=',th.info
        print th.name,'have dead'
        
    for th in collector:
        th.join()
        f = open(log_path,'a')
        
    
    print 'Longest_transaction=',Longest_transaction,
    print 'Shortest_transaction=',Shortest_transaction,
    print 'error_amount=',error_amount
    print 'pass_amount=',pass_amount
    print 'total_amount=',total_amount
    print 'Availability=',(pass_amount/total_amount)*100.0
    print 'total_time=',total_time
    

    print 'over'

分享到:
评论

相关推荐

    JMeter性能测试脚本

    最后,"JMeter性能测试-day07-all"可能涉及高级话题,如脚本录制与回放、JMeter插件的使用,以及性能测试的最佳实践。JMeter的代理服务器功能可以方便地录制用户操作,生成测试脚本。而丰富的插件库则扩展了JMeter的...

    jmeter mysql 性能测试脚本

    自己整理的mysql性能测试脚本,需要的同学,可以下载使用

    socket性能测试脚本

    Socket性能测试脚本是用于评估网络通信中Socket接口性能的重要工具。在IT行业中,尤其是在服务器开发、网络编程或系统优化领域,对Socket性能的理解和测试是至关重要的。Socket是网络编程的基础,它允许两个应用程序...

    网络性能测试脚本

    本文将深入探讨如何使用netperf工具来执行网络性能测试,并通过编写脚本来实现n*n并发测试服务器网络性能。netperf是一款开源的网络性能测量工具,它可以进行TCP和UDP的带宽、延迟以及吞吐量等多种性能指标的测试。 ...

    浏览器性能测试JavaScript脚本

    "浏览器性能测试JavaScript脚本"是一个专门用于评估JavaScript引擎性能的工具,由Google开发,它可以帮助开发者了解不同浏览器在运行特定JS任务时的性能差异。 这个工具包含了一系列基准测试脚本,比如`earley-...

    Linux 系统内存性能测试shell脚本

    本文将详细解析一个基于shell脚本的内存性能测试方法,该脚本利用`dd`命令和`/proc/sys/vm/drop_caches`文件进行测试。 首先,让我们了解一下`dd`命令。`dd`是一个在Unix和类Unix系统中广泛使用的工具,用于转换和...

    loadrunner性能测试(原理、接口测试实例、性能测试实例)、脚本编写、结果分析)

    本文将详细介绍LoadRunner的性能测试原理、接口测试实例、脚本编写及结果分析。 1. **性能测试原理** 性能测试旨在确定系统在高负载下的性能表现,包括响应时间、吞吐量和资源利用率等关键指标。LoadRunner通过虚拟...

    Loadrunner测试数据库性能测试SQL语句性能的脚本例子.pdf

    Loadrunner 测试数据库性能测试 SQL 语句性能的脚本例子 Loadrunner 是一款性能测试工具,用于测试软件应用程序的性能和可扩展性。该工具可以模拟大量用户同时访问应用程序,从而测试应用程序的性能和可靠性。 ...

    性能测试脚本

    本文档提供性能测试脚本技术,及相关理论知识的介绍及讲解,希望能够给大家带来些帮助。

    XXX 金融项目性能测试脚本开发

    《XXX 金融项目性能测试脚本开发》 性能测试是金融行业中确保系统稳定性和效率的重要环节,对于XXX金融项目的性能测试脚本开发,其目的是验证系统在高并发情况下的响应速度、吞吐量以及资源利用率,确保在真实环境...

    性能测试 负载测试 压力测试 性能测试工作原理及应用角度,模型。测试脚本开发与测试执行,测试分析技巧

    性能测试定义 性能测试概念 负载测试 压力测试 性能测试工作原理及应用角度,模型。测试管理流程,测试人员安排,测试工作产品,性能测试的过程,周期,系统需求应用配置需求用户手册需求,测试计划,加案例说明。 ...

    JMeter编写录制HTTPS性能测试脚本.pdf

    Apache JMeter 是一款强大的性能测试工具,...了解其基本概念、安装配置以及脚本录制方法,是进行有效性能测试的关键。通过实践和深入学习,测试人员可以充分利用JMeter的功能,为系统的优化和性能保障提供有力支持。

    DDR自动化测试脚本工具

    DDR自动化测试脚本工具就是为了确保这种内存设备的性能和稳定性而设计的,特别是在大规模生产和质量控制过程中。 DDR测试通常包括以下几个关键方面: 1. **读写速度测试**:DDR内存的速度通常以MHz或GB/s为单位...

    UDS测试脚本工具

    3. **测试脚本创建**:工具允许用户编写和编辑UDS测试脚本,这些脚本可以定义一系列诊断任务,自动化执行对ECU的测试。脚本语言可能基于特定的语法和指令集,使得用户能够定制化诊断流程。 4. **生成测试报告**:...

    loadrunner性能测试脚本准备资料整理

    《LoadRunner性能测试脚本准备全面解析》 LoadRunner,作为业界知名的压力和负载测试工具,是企业级软件性能测试的首选。它以其强大的功能、广泛的协议支持和易用性,帮助测试人员模拟大量用户并发行为,从而评估...

    自动化测试脚本

    也可以是性能测试脚本,用于检查系统在高负载下的表现;还可以是安全性测试脚本,确保系统的安全防护能力。 二、完备性在自动化测试脚本中的体现 “完备”这个标签暗示了自动化测试脚本应该覆盖所有关键的测试场景...

    loardrunner性能测试测试方案

    - **Virtual User Generator(VUG)**:这是用于生成性能测试脚本的工具,它提供了基于录制的可视化界面,使得创建和修改脚本变得简单直观。通过VUG,测试人员可以选择协议,创建脚本,并应用参数化、事务、集合点和...

    wifi cmwrun自动测试脚本

    通过分析和执行这些脚本,测试人员可以对Wi-Fi设备的发射机(Tx)和接收机(Rx)性能进行详尽的评估,例如信道占用率、吞吐量、连接稳定性、多用户并发能力等。此外,测试过程中的异常情况,如丢包、干扰、漫游等,也...

    软件测试、测试脚本、测试报告

    软件测试PPT,有需要的来下载使用,包括软件的测试用例、测试脚本、测试报告等软件测试PPT,有需要的来下载使用,包括软件的测试用例、测试脚本、测试报告等软件测试PPT,有需要的来下载使用,包括软件的测试用例、...

Global site tag (gtag.js) - Google Analytics