YONGFEIUALL

izheyi.com


  • Home

  • Archives

  • Categories

  • Tags

  • About

  • Search

Load Runner - 响应时间VS事务时间

Posted on 2016-08-10 | In Load Runner |

响应时间

响应时间是通过记录用户请求的开始时间和服务器返回内容到用户的时间差值来计算用户操作响应时间的。

  • 网络时间: N1…N6
  • Web服务器时间: WT
  • App服务器时间: AT
  • DB服务器时间: DT
    在现实中,Web Server,App Server,Database Server一般都放在一个高速的局域网中,所以它们之间的网络时间s可以忽略。

事务时间

事务的官方定义:事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容(脚本section)。
对于一个事务时间来说,一般由4个部分组成:
[Tr = RT + Tt + Wasted Time]

  • 响应时间

  • Think Time
    Think Time是为了更加真实的模拟用户场景。

    1
    2
    3
    4
    5
    6
    7
    Action()
    {
    lr_start_transaction("自身时间");
    lr_think_time(3);
    lr_end_transaction("自身时间", LR_AUTO);
    return 0;
    }

    要在Run-time Settings中设置Think Time,启用Replay Think Time。Replay Log:

    1
    2
    3
    4
    5
    6
    7
    Starting iteration 1.
    Starting action Action.
    Action.c(3): Notify: Transaction "自身时间" started.
    Action.c(4): lr_think_time: 3.00 seconds.
    Action.c(5): Notify: Transaction "自身时间" ended with "Pass" status (Duration: 3.0053 Think Time: 2.9992).
    Ending action Action.
    Ending iteration 1.
  • 事务自身时间

    1
    2
    3
    4
    5
    6
    Action()
    {
    lr_start_transaction("自身时间");
    lr_end_transaction("自身时间", LR_AUTO);
    return 0;
    }

    Replay Log:

    1
    2
    3
    4
    5
    6
    Starting iteration 1.
    Starting action Action.
    Action.c(3): Notify: Transaction "自身时间" started.
    Action.c(5): Notify: Transaction "自身时间" ended with "Pass" status (Duration: 0.0016).
    Ending action Action.
    Ending iteration 1.

    事务中哪怕没有操作,也是需要时间的,不过这个时间一般都非常少,所以可以忽略。

  • Wasted Time
    在默认情况下,LoadRunner会将自身脚本运行浪费的时间自动记录Wasted Time,例如执行关联,检查点等函数的时间。

    1
    2
    3
    4
    5
    6
    7
     Action()
    {
    lr_start_transaction("waste time");
    web_url("baidu", "URL=http://baidu.com/", LAST);
    lr_end_transaction("waste time", LR_AUTO);
    return 0;
    }

    Replay Log:

    1
    2
    3
    4
    5
    6
    7
    Action.c(3): Notify: Transaction "waste time" started.
    Action.c(4): Detected non-resource "http://www.baidu.com/" in "http://baidu.com/" [MsgId: MMSG-26574]
    Action.c(4): Found resource "http://www.baidu.com/img/bd_logo1.png" in HTML "http://www.baidu.com/" [MsgId: MMSG-26659]
    Action.c(4): Found resource "http://www.baidu.com/img/baidu_jgylogo3.gif" in HTML "http://www.baidu.com/" [MsgId: MMSG-26659]
    Action.c(4): Found resource "http://s1.bdstatic.com/r/www/cache/static/jquery/jquery-1.10.2.min_f2fb5194.js" in HTML "http://www.baidu.com/" [MsgId: MMSG-26659]
    Action.c(4): web_url("baidu") was successful, 69095 body bytes, 2403 header bytes, 13 chunking overhead bytes [MsgId: MMSG-26385]
    Action.c(5): Notify: Transaction "waste time" ended with "Pass" status (Duration: 9.6275 Wasted Time: 0.3107).

    某些时候外部接口进行处理所消耗的时间也会影响事务的时间,这个时间LoadRunner无法处理。比如对用户的加密/解密。就需要计算这些时间开销,并且将这个开销的时间记入Wasted Time中:

    1
    2
    3
    4
    //use timers to collect wasted time, and the use lr_wasted_time to remove that wasted time from the transactions. 
    timer = lr_start_timer();

    wasteTime = lr_end_timer(timer);
    lr_wasted_time(wasteTime);

    注:在做删除的时候要看好了,别忘了加上LoadRunner自身的时间。

读书真的无用吗?

Posted on 2016-07-25 | In 随想 |

上世纪末以来,特别是进入21世纪,在经济大潮冲击下,金钱成为衡量人的价值的标准,加上大学生难就业,工资低等多种因素,就又有了这种讨论。

刚大学毕业拿不到高工资才是正常的呀,毕业后的前三年,工资的涨幅也不会太大,而三年之后大多会成倍增长。

人生本就短短几十年,一定要长远来看待,不要只看眼前的利益。所谓的读书无用,我还没有看到这个,倒是看见很多后悔没有上学读书,后悔没有拿到本科文凭的人。

小A在我们老家那算是干啥啥不会,弄啥啥不中,要是当时不读书,都说在老家待着就饿死了。

小A成绩一直都很一般,高考也没考上本科,但是只要想上,老爸砸锅卖铁也支持,村里的人就不这么认为了,专科又不是好学校,上了再找不到工作,白花钱;邻居拿自家儿子做比较,高中毕业去打工一年挣4万,你这上学一年花2万,几年下来差几万,你毕业了工资也不见得比打工高。十年后的今天我想现在请问一下,你35岁了还靠出力打工吗?现在的经济下,你还能那么好挣钱吗?可是小A因为读书增长了见识,因为读书有了梦想和目标,因为读书留在了你们所不屑的大城市(蜗居,节奏快),因为读书有了不会被饿死的稳定工作,因为读书可以跟你侃一天都不带重样的(内向,从小到大都没跟邻居说过话)……

有的孩子,父母是研究生学历,早早就让孩子看书看电影,学英语练舞蹈。这样家庭出身的孩子,一旦选择努力,那么他们拥有的视野和从小养成的习惯,会帮助他们看得很远很远。所以对于大多数像我们这样的农村孩子来说,就要更加努力,读书对我们来说就是唯一的出路。

陪小曦姐姐暑假游玩

Posted on 2016-07-20 | In 丁丁 |

直接上图好了,不想说太多话,这段时间两个孩子在一块,感触很多,父母的陪伴永远也替代不了小朋友之间的相处,或许是真的要好好想一下闺女一直说的想要一个小弟弟/妹妹的想法。

话说你是来打酱油的?还是来抢镜的?







Read more »

Load Runner - VuGen参数化高阶说明

Posted on 2016-07-11 | In Load Runner |

前面我们说了为什么要做参数化,以及参数化的具体实现,其实说到底就是要实现数据驱动,其实不管是做性能还是功能自动化,都是相通的,是个要考虑的问题,我们这里拿Load Runner做个说明。

1. 录制/编写基本脚本

通过录制/编写来实现基本的业务流程,这种情况下,数据是Hard Code在脚本中的,在并发性能的时候,这种数据是很不真实的场景。

2. 实现参数化(数据驱动)

为了模拟更真实的场景,保证业务功能的正确性,我们要做数据的参数化,具体请参考 LR参数化实现

3. 实现动态参数化

参数化把数据和脚本分离开来,但是有时候会有问题。比如下面这个购物场景,我想随机进入一个商品品类中再选择一件商品,对品类进行参数化,即把所有品类都放到外部数据文件中,那万一品类有增加/减少了,都得再回去修改数据文件,这也是一个很头疼的工作。
理想的状态下,应该是在选择品类之前,先从页面上动态获取当前所有的品类,然后再进行品类选择,这样不管在什么情况下,业务的正确性都是能够保证的。
在Load Runner中,我们就要用到关联了:

  1. 获取所有的商品品类

    1
    2
    3
    4
    5
    web_reg_save_param("categorties",
    "LB=cat=",
    "RB=\">",
    "Ord=All",
    LAST);
  2. 获取随机的商品品类

    1
    lr_save_string(lr_paramarr_random("categorties"), "category");
  3. 进行后续的操作

    1
    2
    3
    web_url("Homepage", 
    "URL=http://xxx.com/list.html?cat={category}",
    LAST);

软件测试的一些思考

Posted on 2016-06-29 | In 测试管理 |

从毕业后一直都算是混在测试圈,确切的说,从大三的时候就开始学习软件测试相关的知识,目前来看,没有入错行,从自身等各方面考量,我的选择还是正确的。

一路走来,感慨良多,很幸运自己实习的时候就进了个好公司,也很幸运这一路走来领导的信任和朋友的支持。从一个只知道黑盒功能测试的小白,全靠自己摸索,从功能到自动化,再到性能,进化到稍微有一点自己的知识体系的测试人。咱不能跟测试界的大牛比,比起多年前的自己,现在是好了很多,足矣。

列一些大体的知识框架(个人观点),大家共勉:

测试的目的

一说这个,首先反应出来的就是找Bug,验证RQMT,如果更高层次的来看待这个问题,测试是不是可以用来评估软件的质量;是不是用来预防Bug。

测试的本质

说到底,就是: 数据 + 执行 + 验证。

测试人员的素质

一说这个,好多人都会说一些基本的素质,如什么‘三心二意’了,==。 做久了就会发现,其实是有更多更高的能力需要我们慢慢培养的:快速学习的能力,问题分析定位能力,编码的能力,探索测试,等等。。

测试的工作效率

工作效率到底取决于什么:你的测试技术高?你的编码能力强?大家可以思考总结一下。

测试的价值

不管在什么行业,做什么工作,得体现出自身的价值,才能得到公司的认可,也能满足自身更高层次的需求。可以从以下角度思考一下:

  1. 公司角度
  2. 项目角度
  3. 自身角度

测试的影响力

This world is not for silence people,提高自身影响力,才能更好的更容易的做事,得到大家的认可,从而实现自己的价值。 可以做以下几点思考:

  1. 测试的流程制定和把控
  2. 测试相关工作组件的相互支撑的体系
  3. 专业化的体现
  4. 其他组合作

测试的现状

目前讨论比较多的

  1. 0和-1的游戏
  2. 测试这个行业会不会消失
  3. 自动化的重要性

只是对测试的整体的一个总结,详细具体的相关Item,请参见Blog其他文章。同时欢迎拍砖,共同探讨。

端午节十渡游玩

Posted on 2016-06-11 | In 丁丁 |

端午节和小朋友一块去了十渡玩了两天,景色还是不错的,毕竟在山里,有山有水,玩的很开心。不过有一点,人太多了,碰到节假日还是不要出去的好。

玻璃栈道和高山漂流

玻璃栈道倒真没觉得有啥害怕的,也很短,很没意思。
一直期待能玩一次漂流,感觉这是这次最有意思的项目了,遗憾的是人太多了,从下面下来也就不过两分钟,光排队就用了2个半小时,小朋友还有点害怕了,中间的台阶就提前下来了:(






Read more »

Robot Framework-Establish Customize Library Through Implement Send Email Function

Posted on 2016-06-08 | In Robot Framework |

When using Robot Framework, yes, it’s fast and easy to use, but for some special scenario, Robot Framework didn’t provide relevant library and keyword, such as send email.
We can implement this through keyword Evaluate, but it’s maybe not appropriate way. so it’s better for us to encapsulate system level library and keyword.

Implementation

Here we implement this by sending mail:

  1. In python Lib\site-packages folder(e.g.,C:\Python27\Lib\site-packages ), create folder ‘GmailLibrary’.
  2. Design send mail library ‘sendmail.py’

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import smtplib
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email.MIMEText import MIMEText
    from email import Encoders
    import os

    class SendEmailUtility(object):

    ROBOT_LIBRARY_SCOPE = 'Global'

    def __init__(self):
    print 'send email utility'

    def send_mail_no_attachment(self,from_user,from_password,to, subject, text):
    msg = MIMEMultipart()

    msg['From'] = from_user
    msg['To'] = to
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    mailServer = smtplib.SMTP('outlook.office365.com')
    mailServer.ehlo()
    mailServer.starttls()
    mailServer.ehlo()
    mailServer.login(from_user, from_password)
    mailServer.sendmail(from_user, to, msg.as_string())
    mailServer.close()
  3. Design ‘init.py’

    1
    2
    3
    4
    5
    from sendemail import SendEmailUtility
    __version__ = '1.0'

    class EmailLibrary(SendEmailUtility):
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
  4. Import the library ‘MailLibrary’ in Robot Framework

  5. Check keyword in ‘Keyword List’
  6. Create case to send mail
  7. Mail send result

Postscript

We can implement everything from this way, but the important thing is you need to know python, even a little:)

Use the tool, but not subject to the tool.

Robot Framework-External Variable File

Posted on 2016-06-03 | In Robot Framework |

在Robot Framework中,变量的设置有很多种形式,为了统一的管理,或者以便后续的来做数据驱动,还是要把数据分离出去,最终实现业务逻辑和数据的分离。

简单例子

这里只做一个简单的描述:

  1. 在C:盘下建数据文件,只能是.py文件
  2. 在RF中引用

进阶

为了工程的统一管理,我们可以在Test Project Root下创建Test Data文件夹,把数据分类管理于此。

  1. 数据
    每一个Test Suite有一个数据文件,每一个用例用一行数据来实现,用例里多个数据用List方式存储。
  • 数据文件名就是Test Suite名字
  • 数据变量名就是Test Case名字
  1. 调用
    都基于Built-in变量来实现,动态管理。

高级

抛砖引玉,只是捋一下思路:

  1. 通过Test Case的Test Template来设计
  2. 一个用例一个数据文件,数据多的话从理解的角度要好一些
  3. 通过csv、Excel、DB的方式来存储数据

六一儿童节汇演

Posted on 2016-06-01 | In 丁丁 |

小丁的表现还是可圈可点,加油!!

幼儿舞蹈 - 十一点半

仅做一留念,其他的学业汇报就不列了,开心就好。

Robot Framework-MongoDB: ISODate

Posted on 2016-05-26 | In Robot Framework |

上篇也提到了这个问题,现在挤点时间出来又研究了一下。Robot Framework 在操作的过程中是传的是String,我们在decode时需要从Json String中decode datetime。

JSON-DateTime

在Github发现有人做了这些,就直接拿出来用好了,使用说明请参考JSON-DateTime

  1. 基本使用
    安装完成后,就可以直接用下边方式来调用:

    1
    2
    3
    4
    >>> import simplejson as json
    >>> a ='{"createdDate" : "Thu, 1 Mar 2012 10:00:49 UTC"}'
    >>> json.loads(a)
    {'createdDate': datetime.datetime(2012, 3, 1, 10, 0, 49)}
  2. 说明
    这种日期格式是它默认的格式,但是看起来和用起来都有点不太好,我们需要重新定义一个自己的格式,如下:

    1
    2
    3
    >>> a ='{"createdDate" : "2012-5-1 10:00:49"}'
    >>> json.loads(a, datetime_format='%Y-%m-%d %H:%M:%S')
    {'createdDate': datetime.datetime(2012, 5, 1, 10, 0, 49)}

RF集成

我们这里需要修改一下‘mongoquery.py’的引用,把import json修改成import simplejson as json。
还有就是默认日期格式的修改,我们可以在‘mongoquery.py’或‘jsondatetime.py’里修改,这里因为我们本来就对‘mongoquery.py’做了修改,所以统一也在这里修改了。

1
recordJSON = json.loads(recordJSON, datetime_format='%Y-%m-%d %H:%M:%S')

  1. 引用
  2. 结果
    1
    2
    3
    4
    5
    6
    {
    "_id" : 11,
    "name" : "insert",
    "type" : "calendar",
    "createdDate" : ISODate("2012-02-03T10:00:49Z"),
    }
1…222324…40
唐胡璐

唐胡璐

i just wanna live while i am alive

393 posts
42 categories
74 tags
RSS
LinkedIn Weibo GitHub E-Mail
Creative Commons
© 2022 唐胡璐
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4