一学就会的接口自动化工具-HttpRunner

当当当!好久没更新了,是不是特别想念,哈哈,下面为大家带来一篇超级简单的接口自动化工具文章~

这篇文章出处不属于我,这边只是拿来共同分享下,比较简单,适合初学者,我本人觉得整体的逻辑和JMeter还是很类似的,只是它的脚本维护比JMeter方便很多,也更加轻便。

运行环境

HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS、Linux、Windows 系统平台上。HttpRunner 支持 Python 2.7 和 Python 3.3 以上的所有版本。

安装方式
  1. 解压提供的安装包(下载链接:https://pan.baidu.com/s/1yPglfEVGrRKS-Td6OyJ7kg)
  2. 进入目录下运行安装。image
  3. 运行如下命令,若正常显示版本号,则说明 HttpRunner 安装成功。image
录制生成用例

为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能,对应的转换工具为一个独立的项目:har2case。

获取 HAR 数据包

在转换生成测试用例之前,需要先将抓取得到的数据包导出为 HAR 格式的文件。在fiddler中的操作方式为,选中需要转换的接口(可多选或全选),点击菜单栏file-Export Sessions-Selected Sessions(选中HTTPArchive v1.1)-next,保存该har格式文件

转换生成测试用例

image 由于我们公司接口加密,生成的测试用例需要自己稍微修改

运行测试

image

可以在Report文件中查看测试报告
用例编写语法介绍
- config:
    name: BaseServer
    parameters:
        - type: ["gold", ""]
    request:
        base_url: https://base.sojex.net
        headers:
            Content-Type: application/json

- test:
    name: GetETFList
    request:
        url: /BaseServer/FinanceBaseApi/GetETFList
        method: GET
        params:
            type: $type
    validate:
    - eq: [status_code, 200]
    - type_match: [status_code, int]
    - eq: [content.status, 1000]
    - eq: [content.desc, "OK"]
    - contains: [content.data.list,{"as":"29112014.13","d":"823.87000","dat":"2019-01-30","v":"34624068366.41","ud":"8.23"}]
  • config:作为整个测试用例的全局配置项,作用域为整个测试用例
  • test:测试步骤的变量空间(context)会继承或覆盖 config 中定义的内容
    • 若某变量在 config 中定义了,在某 test 中没有定义,则该 test 会继承该变量
    • 若某变量在 config 和某 test 中都定义了,则该 test 中使用自己定义的变量值
  • name: 测试用例名称
  • request
    • base_url:测试用例请求url的公共host
  • validate:结果断言
    | comparator | Description | A(check), B(expect) | examples |
    | -- | -- | -- | -- |
    | `eq`, `==` | value is equal | A == B | 9 eq 9 |
    | `lt` | less than | A < B | 7 lt 8 |
    | `le` | less than or equals | A <= B | 7 le 8, 8 le 8 |
    | `gt` | greater than | A > B | 8 gt 7 |
    | `ge` | greater than or equals | A >= B | 8 ge 7, 8 ge 8 |
    | `ne` | not equals | A != B | 6 ne 9 |
    | `str_eq` | string equals | str(A) == str(B) | 123 str_eq '123' |
    | `len_eq`, `count_eq` | length or count equals | len(A) == B | 'abc' len_eq 3, [1,2] len_eq 2 |
    | `len_gt`, `count_gt` | length greater than | len(A) > B | 'abc' len_gt 2, [1,2,3] len_gt 2 |
    | `len_ge`, `count_ge` | length greater than or equals | len(A) >= B | 'abc' len_ge 3, [1,2,3] len_gt 3 |
    | `len_lt`, `count_lt` | length less than | len(A) < B | 'abc' len_lt 4, [1,2,3] len_lt 4 |
    | `len_le`, `count_le` | length less than or equals | len(A) <= B | 'abc' len_le 3, [1,2,3] len_le 3 |
    | `contains` | contains | [1, 2] contains 1 | 'abc' contains 'a', [1,2,3] len_lt 4 |
    | `contained_by` | contained by | A in B | 'a' contained_by 'abc', 1 contained_by [1,2] |
    | `type_match` | A is instance of B | isinstance(A, B) | 123 type_match 'int' |
    | `regex_match` | regex matches | re.match(B, A) | 'abcdef' regex 'a\w+d' |
    | `startswith` | starts with | A.startswith(B) is True | 'abc' startswith 'ab' |
    | `endswith` | ends with | A.endswith(B) is True | 'abc' endswith 'bc' |
    
  • 参数化
    • 直接指定参数列表
    • 引用csv数据文件
      • 文件需放置在与测试用例文件相同的目录中;
      • CSV 文件中的第一行必须为参数名称,从第二行开始为参数值,每个(组)值占一行;
      • 若同一个csv文件中具有多个参数,则参数名称和数值的间隔符需实用英文逗号。
```
    - config:
        name: BaseServer
        parameters:
            - type: ${parameterize(ETF.csv)}
            - type: ${P(ETF.csv)}  # 简写方式
        request:
            base_url: https://base.sojex.net
            headers:
                Content-Type: application/json
    
    - test:
        name: GetETFList
        request:
            url: /BaseServer/FinanceBaseApi/GetETFList
            method: GET
            params:
                type: $type
        validate:
        - eq: [status_code, 200]
        - type_match: [status_code, int]
        - eq: [content.status, 1000]
        - eq: [content.desc, "OK"]
    ```
  • 自定义函数生成参数列表

对于没有现成参数列表,或者需要更灵活的方式动态生成参数的情况,可以通过在debugtalk.py中自定义函数生成参数列表,并在用例引用自定义函数的方式。

- config:
    parameters:
        - username-password: ${get_account(10)}
  • 参数关联
- config:
    name: testcase description
    variables: {}

- test:
    name: /api/get-token
    request:
        headers:
            Content-Type: application/json
        json:
            sign:9c0c7e51c91ae963c833a4ccbab8d683c4a90c98
        method: POST
        url: http://127.0.0.1:5000/api/get-token
    extract:
        token: content.token
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.success, true]

- test:
    name: /api/users/1000
    request:
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
            device_sn: FwgRiO7CNA50DSU
            token: $token
        json:
            name: user1
            password: '123456'
        method: POST
        url: http://127.0.0.1:5000/api/users/1000
    validate:
        - eq: [status_code, 201]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.success, true]
        - eq: [content.msg, user created successfully.]

常用adb命令及monkey命令详解

基于这篇文章,给大家再深入一下。

传送门:https://jianjiexuan.com/tools/android-sdk/293.html

我将有一段时间进行人生的思考,所以,这边插播一下我的微信,文章可能暂时停停。

一、常用adb命令

1、adb devices:查看已连接的设备

2、adb version:查看adb的版本序列号

3、adb -s <设备名字>:指定某设备做什么(设备名字用1的方法可以查看)

4、adb install <安装包.apk>:安装应用(写清楚apk的完整路径)

adb -s <设备名字> install <安装包.apk>:指定设备安装应用

5、adb shell:通过远程shell命令来控制模拟器/设备

6、exit:退出shell远程连接,回到原路径。(Ctrl+d,退出shell,回到默认路径)

7、adb pull <设备端路径> <pc端路径>:将指定的文件从设备/模拟器上拷贝到pc端(后面的pc端路径可以不指定,默认存储在当前路径下)。例:

  adb pull /sdcard/log.txt c:/monkey

8、adb push <pc端路径> <设备端路径>:将指定的文件从pc端拷贝到设备/模拟器上

9、adb shell pm list packages:列出电脑端所有apk的包名

10、adb shell pm path packages:获取包名对应的apk路径

11、adb shell ps :查看已链接设备上所有进程

12、adb logcat:查看pc端的日志输出。

adb shell界面只需输入logcat,查看设备端日志输出(退出Ctrl+c)

13、adb reboot:重启设备,强制停止monkey时可以使用此命令,简单粗暴。

二、Monkey命令扩展

1、最简单的monkey执行语句:

(adb shell)monkey –p com.jianjiexuan.na –v 500  (对com.jianjiexuan.na 这个程序包单独进行一次500次的monkey测试)

名词解释

-p:用于约束限制,用此参数指定一个或多个包。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。

指定多个包:monkey -p <packagename1> –p <packagename2>  -p <packagename3> -v 500

-v:用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:

  • 日志级别 Level 0

monkey –p com.jianjiexuan.na –v 500

说明:缺省值,仅提供启动提示、测试完成和最终结果等少量信息

  • 日志级别 Level 1

monkey –p com.jianjiexuan.na –v -v 500

说明:提供较为详细的日志,包括每个发送到Activity的事件信息

  • 日志级别 Level 2

monkey –p com.jianjiexuan.na –v -v -v 500

说明:最详细的日志,包括了测试中选中/未选中的Activity信息

2、延时及固定序列

(adb shell)monkey -s 100 -p com.jianjiexuan.na – -throttle 1000 -v 500 (每次执行一次有效的事件后休眠1000毫秒

(adb shell)monkey -p com.jianjiexuan.na – -throttle 1000 – -randomize-throttle -v 500 (每次执行一次有效事件后随机延时0-200毫秒

名词解释

-s:用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。出现问题下次可以重复同样的系列进行排错

–throttle固定延时,用于指定用户操作(即事件)间的时延,单位是毫秒;

–randomize-throttle随机延时,用于指定用户操作(即事件)间的时延,单位是毫秒。

3、保存monkey运行结果

1)保存在PC中

adb shell monkey –p com.jianjiexuan.na –v 500 > d:\monkey\log.txt   

2)保存在手机中

手机端进入shell模式:adb shell

 monkey –p com.jianjiexuan.na –v 500 > /mnt/sdcard/monkey/log.txt

4、monkey事件百分比的调整

(adb shell)monkey -p com.jianjiexuan.na -v – -pct-anyevent 100 500

指定多个类型事件的百分比:

monkey -p com.jianjiexuan.na -v –pct-anyevent 50 –pct-appswitch 20 500

名词解释

–pct-****:设置某个事件的百分比。后面接数字(0-100),100即100%的概率执行该事件

monkeygai01

注意:各事件类型的百分比总数不能超过100%。如果不进行设置则显示默认百分比。

5、正在运行的monkey如何终止

如在命令窗口端直接打印结果,想要停止monkey的运行,除去重启设备的粗暴方式停止monkey的运行,也可以这样:再打开一个cmd命令窗口

查看monkey的进程:adb shell ps | find “monkey”

monkeygai02kill掉该进程就可以

adb shell kill + 进程编号 ,即adb shell kill 5182

关于其他的细化的,后续会继续更新中。。。

Android App压力测试-Monkey(真机)

昨天一个朋友说自己工作了好几年,但是依然只是会一些功能测试(手工),问有没有什么工具。其实工具永远都是辅助,首先要确定你要往哪个方向发展,然后由这个方向自会引申出很多工具,你再去专研工具,边专研边对这块方向深入,到时候,你就是前辈了,一通百通。

好了,下面来点干货,前两年在新浪博客里写过Monkey在模拟器上如何执行,今天从头到尾讲下在真机上如何运行。我的目的就是,你看了我的东西,是真的能够学会我所说的,不仅仅是知识的硬塞入。

首先,Monkey主要用于移动端的压力测试,在adb shell中,生成用户或系统的伪随机事件。做压力测试的目的就是提高产品的稳定性及留存率。

 什么时候用Monkey测试比较合适?

1)测试节点最好安排在功能系统测试通过,路径上没有问题的时候

2)测试时间最好安排在下班后的夜间进行,不占用上班时间,节约时间成本

Monkey测试涉及的核心:

1)ADB:Android Debug Bridge,安卓调试桥

2)MonkeyScript:一组可被Monkey识别的命令集合,可以完成重复固定的操作
当当当,下面进入正题

一、搭建Monkey的环境

1、下载安装sdk环境,不需要下载开发的api部分。

下载传送门:http://pan.baidu.com/s/1o80il2U

下载之后解压。

2、配置环境变量

在path变量值里加入Android-sdk中platform-tools和tools的目录路径,记得分号隔开。

3、验证是否配置成功

打开cmd命令行窗口,输入adb,出现下面的内容即为环境配置成功

monkey01

二、连接设备

1、首先通过USB线连上手机和电脑,确保手机的调试模式打开

2、cmd命令行窗口输入,adb devices,查看已连接的设备,如下图所示

注:可能是驱动的原因,有时候需要先打开手机助手(豌豆荚),连上手机。与adb.exe冲突,结束adb.exe进程。

monkey02其中,98AFBNM24J7R为已连接设备的名字。

3、指定设备安装测试包

adb -s 98AFBNM24J7R install ***.apk(写清楚apk的完整路径)

如图所示

monkey03

:有的人会出现以下问题:

monkey04这个是为什么呢,看看你连接的手机,因为安装的时候手机要允许。

三、执行Monkey

1、查看该包的packagename

aapt dump badging ***.apk(写清楚apk的完整路径),如图所示

 http://blog.jianjiexuan.com/tools/android-sdk/82.html

monkey05

2、最简单的monkey执行语句

adb -s 98AFBNM24J7R shell monkey -p <packagename>(即上一步查询的东西) -v 1000

这时的执行结果在命令行端显示

monkey06

具体想扩展的直接百度就可以,我这里只给大家一个准确简单的完整流程。

3、存储结果在手机端

进入该设备的shell界面

adb -s 98AFBNM24J7R shell

monkey08

执行:

 monkey -p <packagename>(即上一步查询的东西) -v 1000 > /mnt/sdcard/monkey.txt

加强综合版:有了这个基本可以说自己会monkey了(如果你看到这,可以加我微信了:jianjiexuan520

monkey -p ***** –ignore-crashes –ignore-timeouts –ignore-security-exceptions –monitor-native-crashes –pct-touch 50 –pct-motion 10 –pct-nav 10 –pct-majornav 10 –pct-appswitch 10 –pct-anyevent 10 –pct-syskeys 0 -v -v -v -s 123 –throttle 300 360000 2>/sdcard/yymonkey.log &

fuck,明明打的两个杠杠,显示出来的都是一个,为了避免误导大家,我顺便截个图,你们自己记得修改

命令说明:(具体详细解释可以看另一篇文章)

-p 包名:运行该程序

–ignore-crashes:当应用程序崩溃或发生任何失控异常时,Monkey将继续向系统发送事件,直到计数完成。

–ignore-timeouts :当应用程序发生任何超时错误,Monkey将继续向系统发送事件,直到计数完成。

–ignore-security-exceptions:当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将继续向系统发送事件,直到计数完成。

–monitor-native-crashes:监视并报告Android系统中本地代码的崩溃事件。

–pct-anyevent 10等:设定启动activity的百分比为10%(调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。)

-v -v –v:提供更加详细的信息。一个V为较少信息;二个为较详细信息;三个提示很详细信息。

-s 123:伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。(再次测试需要输入不同的数字,不然结果是一样的)

–throttle 300:在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度,如这里输入300就是为300ms,一般情况下是设置1000,为了发现更多的问题,我们加大了压力

360000:事件数设定为360000,大概可以保证晚上安心下班,明早看结果了。

0>(自定义路径):输入所有LOG记录

1>(自定义路径):输出所有LOG记录

2>(自定义路径) :输出错误LOG记录

:可以拔掉数据线再换个手机了~

四、结果分析

1、调取手机端执行结果到电脑上

adb pull 文件名 (写清楚文件在手机端的完整路径)  要储存在pc端的路径

例:

adb pull /sdcard/monkey.txt d:/  (注意这边的斜杠,反斜杠是不行,Unix使用/作为路径分隔符)

monkey07

2、查看结果

开发人员结合monkey打印的日志和系统打印的日志,结合测试中出现的问题。

  • CRASH:即崩溃,应用程序在使用过程中,非正常退出。(Exception)
  • ANR:Application Not Responding,等待时间过长,程序无响应
  • oom:out of memory 超出内存(一般来说是图片过大或内存泄漏引起的,大部分情况是图片问题)

一个完整的基本流程已经结束了,如果还想深入的小伙伴可以继续研究,可参看其他文档。

 

JMeter之获取某页面所有链接并再次请求

  今天主要讲下JMeter逻辑控制器和正则的联合使用,以jmeter获取某页面所有的链接,然后通过这些链接再次发出请求为列。

  首先我们知道,凡是输入一个地址,点击回车,通过F12查看,请求并不止一个,而如果放入jmeter中,如果不加其他设置,那我们测试的结果与实际是不符的。所以我们一般会在高级设置中勾选“从HTML文件获取所有内含的资源”,如图下所示:

当然还是眼见为实,举例,我们只是请求https://www.taobao.com,做基础的请求操作,点击运行,结果只有一条,而如果我勾选,则下方还会获取其他请求,如图所示:

但是,这些还不够!

下面我们一起来实战下,获取一个网页所有的链接并进行再次请求。

1、首先,你要打开jmeter,创建一个线程组,添加一个http请求,我们还是以淘宝为例,输入服务器名称:www.taobao.com,协议输入https,方法为GET请求。

2、在1的http请求下加上后置处理器-正则表达式提取器,关于正则的具体用法可以百度或者谷歌,我这边就直接给结果了,概念性的东西可能以后会单独出篇文章讲解。如图所示:

3、线程组下添加一个逻辑控制器-ForEach控制器(ForEach控制器会循环遍历一系列相关变量),关于逻辑控制器,到时候我会单独开篇文章去讲解,这边主要是实现目的。

 

4、在ForEach控制器下添加一个http请求,填写路径,路径为foreach中填写的输出变量名称,如图所示,注意jmeter元件作用域与执行关系,这个可以看文章:http://blog.jianjiexuan.com/tools/jmeter/213.html

如图所示:

5、添加监听器-察看结果树,保存计划,点击运行,就可以查看淘宝里所有链接的二次请求了。大功告成!

对Web应用进行静态性能的评估

概念:开发Web应用时,基于一系列Web应用页面性能优化的最佳实践对Web应用的页面进行静态分析,被给出评估结果的性能分析方法。即通过分析页面的代码来评估页面的情况

工具:YSlow(雅虎)、PageSpeed(谷歌)

 

以chrom为列

1、打开chrom浏览器

2、打开扩展程序

3、在扩展程序中进行搜索这两款软件,或下载插件导入

4、chrom-工具-打开yslow,点击runtest按钮,就会进行网页的静态性能分析,并给出分数和级别

以Firefox为列

1、打开Firefox浏览器

2、打开扩展程序

3、在扩展程序中进行搜索yslow,或下载插件导入

4、在扩展程序中进行搜索firebug,或下载插件导入

5​、F12-打开firebug-切换到yslow,点击runtest按钮,就会进行网页的静态性能分析,并给出分数和级别

分数和级别的解释

ABCDEF A为最好,依次分数降低 评估标准有23条,解释如下:

1)尽量减少http的请求  Make fewer HTTP requests

2)页面有没有CDN,内容分发网络  Use a Content Delivery Network(CDN)

3)避免空的src和href这样的编码,渲染的时候会有影响  Avoid empty src or href

4)为文件头指定过期标签  Add Expires headers

5)有没有使用gzip对内容进行压缩  Compress components with gzip

6)将css样式表尽量放在页面代码的顶部 Put CSS at top

7)将JS脚本放在底部,这样用户在访问的时候能够尽早的呈现内容 Put JavaScript at bottom

8)使用CSS样式表的时候尽量避免CSS表达式的使用   Avoid CSS expressions

9)使用JS和CSS样式表的时候尽量使用外部文件,这样可以进行缓存  Make JavaScript and CSS external

10)减少DNS的查找次数  Reduce DNS lookups

11)精简JS和CSS样式表  Minify JavaScript and CSS

12)避免URL的跳转  Avoid URL redirects

13)删除重复的JS和CSS脚本  Remove duplicate JavaScript and CSS

14)配置Etags,使用此技术可以提升性能  Configure entity tags(ETags)

15)使AJAX可以缓存,加快响应  Make AJAX cacheable

16)使用GET完成AJAX请求  Use GET for AJAX requests

17)减少DOM元素的数量  Reduce the number of DOM elements

18)避免404错误  Avoid HTTP 404(NOT Found)error

19)减少cookie大小  Reduce cookie size

20)使用没有cookie的域 Use cookie-free domains

21)避免滤镜的使用(低版本IE中会导致大的性能问题)  Avoid AIphaImageLoader filter

22)HTML里面不要使用缩放图片的方式来处理我们的图片  Do not scale images in HTML

23)小图标尽量使它的文件大小变小,而且文件是可以缓存的 Make favicon small and cacheable

PageSpeed与YSlow的功能差不多,通过这样的静态分析,我们可以知道web应用的基本性能情况。Goodbye~~

iOS抓包工具—Charles简介及安装

Charles是一个HTTP代理服务器、HTTP监视器、反转代理服务器。它可以查看所有连接互联网的HTTP通信。这些包括request, response现HTTP headers (包含cookies与caching信息)。移动端的话,这款工具更加适用于苹果设备,安卓的话有点反应缓慢。

一、下载安装Charles

1、下载地址:

https://www.charlesproxy.com/

2、安装Charles

下载完成后直接进行安装即可,如果不注册每次只能使用30分钟,关于如何注册破解,可以网上下载jar包替换。

 

二、使用Charles

1、打开charles

2、录制pc端

默认打开就开始录制了,直接将Proxy-Windows Proxy勾选,此时在pc端任意链接互联网的http通信都能抓包。

3、录制移动端

本篇文章即主要针对如何对iOS移动设备进行抓包

1)查看本机的IP,win+R,输入cmd,命令输入ipconfig即可查看

或打开Charles的Help-Local IP Address

2)查看Charles的HTTP Proxy的Port,在Proxy-proxy setting中,如下图所示

3)手机端连接无线网(与pc连接同一网段),在无线网详情中选择HTTP代理-手动模式,如下图所示

输入服务器ip,即你步骤1当中查询的本机ip;

输入端口,即你步骤2中查询的端口号;

填写完成之后点击返回即可

4)确保Charles录制按钮已经打开,即红色圆点的按钮

5)在手机端进行操作,charles即可进行抓包

 

最基本抓包功能就这样了,还是很简单的,关于其他的分析以及扩展使用,可以在其他文章中查看。

JMeter元件作用域与执行顺序

在复杂的脚本中,会涉及到jmeter的多个元件,而元件之间的作用域和执行顺序这时候就很重要了,放错位置不仅会造成数据获取不正确,严重还会无法执行,下面即为大家介绍一下元件作用域与执行顺序。

1、元件的作用域

  • 配置元件(config elements):会影响其作用范围内的所有元件(同级别或父级起作用)
  • 前置处理程序(Per-processors):在起作用范围内的每一个sample元件之前执行
  • 定时器(timers):对其作用范围内的每一个sampler有效(同级别或父级起作用)
  • 后置处理程序(Post-processors):在其作用范围内的每一个sampler元件之后执行(同级别或父级起作用)
  • 断言(Assertions):对其所用范围内的每一个sampler元件执行后的结果执行校验
  • 监听器(Listerners):收集其作用范围的每一个samoler元件的信息并出现(同级别或父级起作用)
  • sampler元件不和其他元件相互作用,因此不存在作用域的问题

2、元件的执行顺序

  • 配置元件
  • 前置处理器
  • 定时器(首次也是定时器先执行再执行sampler)
  • Sampler
  • 后置处理器(只在有结果可用情况下执行)
  • 断言(只在有结果可用情况下执行)
  • 监听器(只在有结果可用情况下执行)

如果在同一作用域内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行

备注:如果两个相同配置元件作用于同一个采样器,那么这两个配置元件会进行合并,完全一样的取排序靠近的配置元件(如父子级关系)

例1:zuoyongyu1则执行结果是:one显示网页b的地址加上了a的参数(HTTP默认请求都有网页,必须取其一,那么取就近的地址,参数不受影响)。

例2:

zuoyongyu2

后置处理器debug,作用域里按照顺序执行,无就近原则。

3、元件的部分概念

  • 断言:可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。
  • 前置处理器及后置处理器:负责在生成请求之前完成工作。前置处理器常常用来修改请求的设置。
  • 后置处理器:负责在生成请求之后完成工作。后置处理器常常用来处理响应的数据,我们主要在动态关联中用到后置处理器的正则表达式提取器

JMeter录制手机端操作

这只算一个小技能,并没有什么难度,大家可以体验一下:

1、首先打开jmeter,在测试计划下,右击添加“线程组”

2、在工作台下,右击添加“非测试元件—HTTP代理服务器”

1)输入端口号,可以自定义,如9887

2)输入HTTPS Domains(域名):输入自己主机的ip,查询:cmd输入ipconfig即可查看,如:192.168.1.1

3)目标控制器,选择上面的线程组

4)HTTP sampler settings中的Type选择“HttpClient4”

5)配置完手机端(下面的第3步),点击【启动】

shouji1

ps:关于HTTP代理服务器的一些扩展

如图所示,分组选择每个类型的含义:(颜色标出的是比较常用的方式)

shouji2

  • 不对样本分组(Do not group samplers):所有请求全部罗列
  • 在组间添加分隔(Add separators between groups):加入一个虚拟的以分割线命名的动作,运行同“不对样本分组”,无实际意义
  • 每个组放入一个新的控制器(Put each group in a new controller):执行时按控制器给输出结果
  • 只存储每个组的第一个样本(Store 1st sampler of each group only):对于一次url请求,实际很多次http请求的情况,这个选项很好用,因为我们常常是不关心后面的那些请求的。(当选择这个进行录制后,获取的http请求,可以选中图下模式)

shouji3

 

 

3、配置手机端

1)打开设置-无线网-详情,选择HTTP代理—手动

2)输入服务器ip:即为你上面填写在jmeter中的ip,即主机ip

3)输入端口:即为上面自定义的端口,9887

4、操作手机,按着需要录制的东西操作

5、录制完成后,点击HTTP代理服务器的停止按钮,然后删除掉不必要的请求,添加监听器,即可按着刚刚的操作运行查看结果。(有问题可调试解决)

备注:

工作台默认不保存在脚本里,如果需要保存,需要勾选图下内容:(一般情况下我们不需要保存工作台下面的内容)

shouji4

JMeter与ant的结合使用

JMeter与ant的结合使用使得运行结果更丰富、图表化,可以直接浏览器查看。

默认你已经安装了jmeter且配置好了jdk环境变量,如有不懂的,可以先看这篇文章

传送门:http://blog.jianjiexuan.com/tools/jmeter/178.html

1、首先需要安装ant,

  下载地址:http://ant.apache.org/bindownload.cgi

  下载好了之后解压即可

2、配置环境变量

path           D:/apache-ant-1.9.1/bin

classpath        D:/apache-ant-1.9.1/lib

3、验证是否安装成功

    命令行运行:ant -version

ant         出现这个原因是因为Ant需要用到jre\lib目录下的tools.jar,我们把jdk\lib下的tools.jar拖过去就可以

重新输入命令:ant -version,成功

ant1

4、将jmeter的extras目录中ant-jmeter-1.0.9.jar包拷贝至ant安装目录下的lib目录中

5、修改Jmeter的bin目录下jmeter.properties文件的配置jmeter.save.saveservice.output_format=xml

6、编写脚本,build.xml,想要深入了解的可以自己去翻资料摸透,只是想实现效果的,可以直接将下方的代码拿去即可

♥注某些地方需要根据自己的实际情况进行修改

<?xml version=”1.0″ encoding=”UTF-8″?>

<project name=”ant-jmeter-test” default=”all” basedir=”.”>

    <tstamp>

   <format property=”time” pattern=”yyyyMMddhhmm” />

    </tstamp>

    <!– 需要改成自己本地的 Jmeter 目录–>

<property name=”jmeter.home” value=”D:\apache-jmeter-2.6” />

<!– jmeter生成jtl格式的结果报告的路径–>

<property name=”jmeter.result.jtl.dir” value=”D:\resultLog\jtl” />

<!– jmeter生成html格式的结果报告的路径–>

<property name=”jmeter.result.html.dir” value=”D:\resultLog\html” />

<!– 生成的报告的前缀–>

<property name=”ReportName” value=”TestReport” />

<property name=”jmeter.result.jtlName” value=”${jmeter.result.jtl.dir}/${ReportName}${time}.jtl” />

<property name=”jmeter.result.htmlName” value=”${jmeter.result.html.dir}/${ReportName}${time}.html” />

<target name=”all”>

<antcall target=”test” />

<antcall target=”report” />

    </target>

<target name=”test”>

        <taskdef name=”jmeter” classname=”org.programmerplanet.ant.taskdefs.jmeter.JMeterTask” />

        <jmeter jmeterhome=”${jmeter.home}” resultlog=”${jmeter.result.jtlName}”>

        <!– 声明要运行的脚本。”*.jmx”指包含此目录下的所有jmeter脚本–>

               <testplans dir=”D:\testcase” includes=”*.jmx” />

<property name=”jmeter.save.saveservice.output_format” value=”xml”/>

               </jmeter>

</target>

    <path id=”xslt.classpath”>

   <fileset dir=”${jmeter.home}/lib” includes=”xalan*.jar”/>

          <fileset dir=”${jmeter.home}/lib” includes=”serializer*.jar”/>

            </path>

<target name=”report”>

<xslt classpathref=”xslt.classpath”

force=”true”

  in=”${jmeter.result.jtlName}”

              out=”${jmeter.result.htmlName}”

style=”${jmeter.home}/extras/jmeter-results-detail-report_21.xsl” />

  <param name=”dateReport” expression=”${report.datestamp}”/>

        <!– 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 –>

<copy todir=”${jmeter.result.html.dir}”>

<fileset dir=”${jmeter.home}/extras”>

<include name=”collapse.png” />

<include name=”expand.png” />

</fileset>

</copy>

</target>

</project>

7、命令行,进入放build.xml脚本的目录下,运行 ant,如图所示

ant2

8、运行结束后,打开对应路径下的html文件查看结果,如下图所示

ant3

所有的都结束啦,这个图表的作用也没那么大,主要是通过自己写build脚本,可以让执行变得多样化,也可以同时执行多个脚本。

非GUI模式运行JMeter脚本

使用非GUI模式,即命令行模式运行JMeter测试脚本,这样能够大大缩减所需要的系统资源。

命令需要在jmeter的bin目录下执行

命令:jmeter -n -t <testplan filename> -l <listener filename>

如:jmeter -n -t testplan.jmx -l log.jtl

停止运行:ctrl+c       停止后台运行:ctrl+z

解释:

  • -h帮助 → 打印出有用的信息并退出
  • -n非GUI模式 → 在非GUI模式下运行Jmeter
  • -t测试文件 → 要运行的JMeter测试脚本文件
  • -l日志文件 → 记录结果的文件
  • -r远程执行 → 启动远程服务
  • -H代理主机 → 设置JMeter使用的代理主机
  • -P代理端口 → 设置JMeter使用的代理主机的端口号

如:jmeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080

服务器GUI模式(分布式测试):jmeter -server -H 192.168.1.1 -P 8080

备注

1、执行命令前要检查当前目录是否是%Jmeter_Home%\bin目录,如果不是,需要指定完整的路径;如果要把执行的结果保存在其他地方也要指定完整的路径。

2、执行结果可以使用GUI模式下的聚合报告查看。打开Jmeter GUI界面 →测试计划 →添加线程组 →添加聚合报告 →点击“所有数据写入一个文件”下的“浏览”,找到之前生成的.jtl文件即可。

3、命令行实时查看运行结果,需修改jmeter.properties,打开以下内容:

summariser.name=summary

summariser.interval=30  //这个表示统计频率

summariser.out=true //是否将统计结果输出到控制台

4、使用编辑器直接打开jtl文件

buchong1

名词解释:

属性 内容
httpSample 取样节点名字
t 用时(ms)
lt 延时(ms)-不是所有的取样器支持这个
ts 时间标志
s 是否成功
lb 标签
rc 响应代码
rm 响应消息
tn 线程名
dt 数据类型
by 字节数
de 数据编码
ng 在这个线程组中活跃的线程数
na 所有线程组中的活跃线程数