【Django】【六】【接口测试工具】【JMeter&Robot Framework】

9.2 JMeter

9.2.1 安装JMeter

http://jmeter.apache.org/

JMeter由Java语言开发的,最新的JMeter3.0 运行需要Java7 或以上版本的环境

JMeter下载完成后,将apache-jmeter-3.0.zip 文件解压,进入解压目录.../apache-jmeter-3.0/bin/ 双击ApacheJMeter.jar文件启动JMeter

 

 

 

 

9.2.2 创建测试任务

创建线程组,一个线程组可以看作一个测试任务。添加线程组, 右击测试计划,在快捷键菜单中单击“添加”-> “Threads(Users)”-> 线程组

设置线程组。线程组主要包含三个参数: 线程数 Ramp-UP Period(in saconds)  循环次数

 

 

线程数: 设置虚拟用户数。一个虚拟用户占用一个进程或线程。线程数就相当于虚拟用户数。

Ramp-UP Period(in secondes): 设置的线程数的启动时长, 单位为秒。如果线程数为100,准备时长为20(秒),那么需要20秒启动100个线程,平均每秒启动5个线程。

循环次数:每个线程发送请求的个数。如果线程数为100,循环此时2,那么每个线程发送2次请求。总请求数100*2=200次。 如果勾选了“永远”复选框,那么所有线程会循环发送请求,

直到手动单击工具栏上的停止按钮,或者设置的线程运行时间结束才会停止运行。

 因为我们要做的是接口测试,所以将各个参数都设置成1,表示1个线程,1秒启动,运行1次。

 添加HTTP请求。右击“线程组”,在快捷菜单中单击“添加”->Sampler->HTTP请求。

 

 

HTTP请求设置主要包含以下选项:

  • 名称:本属性用于标识一个HTTP请求的取样器,建议使用一个有意义的名称。
  • 注释:对于测试没有任何影响,仅用于注释当前HTTP请求的说明。
  • 服务器名称或IP:HTTP请求发送的目标服务器名称或IP地址。
  • 端口号:目标服务器的端口号,默认值80
  • 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者HTTPS 默认不填为HTTP
  • 方法:发送HTTP请求的方法,可用方法包括GET POST HEAD PUT OPTIONS TRACE DELETE等
  • Content encoding: 内容的编码方式,默认ios8859
  • 路径:目标URL路径(不包括服务器地址和端口)
  • 自动重定向:如果选中该选项,那么发送HTTP请求后得到的响应就是302/301时,JMeter自动重定向到新的页面
  • Use Keep Alive: 当选中,JMeter 和目标服务器之间使用Keep-Alive方式进行HTTP通信,默认选中
  • Use multipart/form-data for HTTP POST: 当发送HTTP的POST请求时,使用Use multipart/form-data方式发送,默认不选中
  • 同请求一起发送参数:在请求中发送URL参数,对于带参数的URL,JMeter提供了一个简单的参数化方法。用户可以将URL中的所有参数都设置在该表格中,表格的每一行是一个参数值。

添加查看结果树, 右击“线程组” -> 添加 -> 监听器 -> 查看结果树

 

9.2.3 添加接口测试

添加嘉宾信息

 选项 参数
名称 查询嘉宾信息
服务器名称或IP 127.0.0.1
端口 8000
方法 GET
路径 /api/get_guest_list/
Parameters

eid: 1

phone: 13800110011

 

再次添加”HTTP请求“取样器,用于添加嘉宾信息,填写选项

 选项 参数
名称 添加嘉宾信息
服务器名称或IP 127.0.0.1
端口 8000
方法 POST
路径 /api/add_guest/
Parameters

eid: 11

realname:david

phone: 13122002200

email:david@mail.com

 

执行接口测试,单击工具栏绿色“启动”按钮,并查看结果树,

8.2.4 添加断言

右击“查询嘉宾信息” -> 添加 -> 断言 -> 响应断言

 

 

 

  • 要测试的响应字段:包括响应文本、Document(text)、 URL样本、响应信息、Response Headers、Lgnore Status 选项。虽然当前测试接口返回的是JSON格式的数据,但对于JMeter来说,返回数据可以作为文本,所以,勾选“响应文本”
  • 模式匹配规则:提供了包括、匹配、Equals、 Substring等选项,输入要断言的数据。
  • 要测试的模式:其实就是要断言的数据。单击“添加”按钮,输入要断言的数据。

对于查询嘉宾接口的断言,可以添加模糊匹配“200” “success" 以及嘉宾手机号等信息

 

9.3 Robot Framework 测试框架

Robot Framework是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD) 它具有易于使用的表格来组织测试过程和测试数据。

我们可以像编写程序一样编写Robot Framework脚本。

Robot Framework 脚本
${a} Set variable 59    
run keyword if ${a}>=90 log 优秀  
... ELSE IF ${a}>=70 log 良好
... ELSE IF ${a}>=60 log 及格
... ELSE log 不及格  

Robot Framework 特点

  • 使用简单
  • 有非常丰富的库
  • 可以像编程一样写测试用例
  • 支持开发系统关键字

9.3.1 环境搭建

Robot Framework 基于Python语言开发,目前Robot Framework 3.0已经支持python3,但是基于该框架的大多Library尚未完全支持Python3,好在用来做借口测试的RequestLibrary已经对python3做了支持,所以,基于当前需求,我们可以在Python3下使用Robot Framework运行接口自动化测试。

1 安装Robot Framework 框架

本身并不提供任何类型的测试,它只是提供了作为自动化测试框架的基本功能,如用例的批量执行、测试报告的生成等,当然它也包含了一些基础库,用于脚本基本语法的编写

PyPI地址: https://pypi.python.org/pypi/robotframework

问题:Mac上已安装robot framework,但是在命令行敲pybot提示:

command not found: pybot

解决:高版本弃用了pybot
第一种方法:换robot即可
第二种方法:卸载高版本,换成低版本

pip3 uninstall robotframework

pip3 install robotframework==3.0

2 安装Requests库

Requests库基于Python语言 用于模拟发送HTTP请求。roboframework-requests的运行基于Requests,所以,需要先安装Requests

PyPI地址: https://pypi.python.org/pypi/requests

3 安装robotframework-requests库

robotframework-requests即为RequestsLibrary库,基于Robot Framework 和 Requests 提供的HTTP接口测试

PyPI地址: https://pypi.python.org/pypi/robotframework-requests

接下来练习如何编写Robot Framework脚本。用什么IDE来编写脚本呢?RobotFramework-RIDE 可以,然而他的角色只是一款IDE,不使用它一样可以编写和运行Robot Framework脚本。这里之所以没有介绍RIDE的安装,主要原因是因为它目前尚未支持Python3。原因是RIDE是基于wxPython(该库是Python下非常有名的GUI库)开发的,而wxPython目前不支持Python3,所以,RIDE想支持Python3就变得比较困难。

 除了RIDE,还可以选择Sublime Text3 安装Package Control以及安装插件 https://github.com/andriyko/sublime-robot-framework-assistant  【备注】Sublime Text3环境配置参考 https://www.cnblogs.com/suren2017/p/13218885.html

在 Sublime Text3菜单栏单击view-> Syntax -> Robot Framework syntax highlighting ,选择 Robot Framework 语法高亮。

 

9.3.2 基本概念及用法

 Robot Framework框架中,一般将测试项目分为三层:Test Project , Test Suit , Test Case

  • Test Project : 既可以创建成目录,也可以创建成文件。若创建成目录,则可以在它下面创建子Test Suit.若创建成文件, 则只能在它下面创建 Test Case. 
  • Test Suit: 既可以创建成目录,也可以创建成文件。若创建成目录,则可以下面创建子Test Suit 。若创建成文件的话,则只能在它下面创建Test Case. 子Test Suit 同样可以又分为目录或文件
  • Test Case: 只能创建在文件中

一般情况下,可以将Test Project和 Test Suit 分别对应一个测试目录和一个测试文件。Test Case就是测试文件中的一条用例。

Robot Framework 脚本一般以.robot 或 .txt为后缀名,也可以使用 .tsv 或 .html的后缀名。

接下来练习一下Robot Framework用例的编写与运行。

首先,创建测试目录rf_test/ 在该目录下创建test.robot文件。 通过Sublime Text3打开文件,编写一个简单的Robot Framework脚本。

 

*** Settings ***

*** Test Cases ***
testcase
    log     robot framework

 

  • *** Settings ***  部分用于引用Library, 当前没有引用,默认为空
  • *** Test Cases *** 部分用于编写测试用例
  • testcase 顶格写,表示用例的名称
  • log robot framework: log 前面四个空格,表示该行属于testcase用例的一行语句,‘log’为打印关键字,与Python语言的print()方法作用类似,'robot framework'为打印的字符串,关键字与字符串之间的间距为四个空格。

安装好Robot Framework框架后,在/Library/Framework/Python.framework/Versions/3.7/bin 下会多出一个pybot.bat文件,并且确保python环境变量已经添加好。接下来,打开cmd.exe 在任意目录下输入‘pybot -h‘回车。

如果出现帮助信息,则说明此命令可用,如果提示'pybot 不是内部或外部命令‘ 请检查目录是否添加环境变量path。

运行测试。

B0178RQ2019070018:rf_test wangxue$ pybot test.robot
==============================================================================
Test
==============================================================================
| FAIL |
Test case name cannot be empty.
------------------------------------------------------------------------------
Test | FAIL |
1 critical test, 0 passed, 1 failed
1 test total, 0 passed, 1 failed
==============================================================================
Output: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/output.xml
Log: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/log.html
Report: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/report.html
B0178RQ2019070018:rf_test wangxue$ pybot test.robot
==============================================================================
Test
==============================================================================
testcase | PASS |
------------------------------------------------------------------------------
Test | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/output.xml
Log: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/log.html
Report: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/report.html

 

除了 脚本运行过程中的打印信息外,Robot Framework还生成了三个文件,分别为output.xml log.html report.html

output.xml 是以XML格式记录测试结果,阅读起来不太直观。我们可以使用不同的语言读取XML文件中的测试结果,生成定制化的测试报告。

log.html report.html相对来说美观的多,log.html偏向于测试日志,记录脚本的每一步执行情况。

 

 

最后,介绍几种pybot命令的运行测试用例的策略

cmd.exe

.../rf_test> pybot test.robot # 运行指定文件

.../rf_test> pybot *.robot     #运行当前目录下以.robot为后缀的测试文件 

.../rf_test> pybot test_a      #运行当前test_a目录下的所有用例

.../rf_test> pybot ./             #运行当前目录下的所有的测试文件

 

9.3.3 接口测试

Robot Framework是一个通用型自动化测试框架,它本身只提供基础的测试功能。例如,测试用例的组织、运行、测试报告的生成以及一些标准库,如 Builtin String Screenshot DataTime Process等

在标准库Builtin中提供了最基本的关键字来实现打印,如变量定义、if语句、for循环等。Screenshot库中提供了截图关键字; DataTime库提供了关于时间操作的关键字。

当我们想要完成不同类型的测试时,只需安装不同的扩展Library就可以了。Robot Framework提供了非常丰富的Library.

  • Web自动化测试:SeleniumLibrary, Selenium2Library, Selenium2Library for Java, watir-robot等
  • Windows GUI 测试:AutoItLibrary
  • 移动测试:Android library, IOS library, AppiumLibrary
  • 数据库测试:Database Library(Java), Database Library(Python), MongoDB library
  • 文件对比测试:Diff Library
  • HTTP测试:HTTP library(livetest), HTTP library(Requests)

前面已经安装好了 robotframework-requests(RequestsLibrary) 接下来使用该库所提供的关键字来进行接口测试。

首先编写GET请求的查询发布会接口测试用例 【注意】 四个空格 下面是文本 不过要以再下方的截图为准

*** settings ***
Library RequestsLibrary
Library Collections

*** Test Cases ***
test_get_event_list
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r} Get Request event /get_event_list/ params=${payload}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#断言结果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}

 

 

下面来解释每一行的意义

首先,引用RequestsLibrary库和Collections库。RequestsLibrary就是安装的robotframework-requests, 提供接口操作相关的关键字。而Collections库是用来操作字典的,因为接口的返回数据是JSON格式,所以必须转化成字典才能进行断言。

test_get_event_list  定义测试用例名字,测试获取发布会信息接口

---------------------

${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r} Get Request event /get_event_list/ params=${payload}

------------------------

  • 通过Create Dictionary关键字定义字典变量 ${payload} ,字典有一个键值eid=1 该字典将会作为接口的参数
  • Create Session 关键字用来创建一个HTTP会话服务器。通过event 指定http://127.0.0.1:8000/api为该会话的基础URL
  • Get Request关键字用来发起一个GET请求,接口URL为event+/get_event_list/,接口参数为 ${payload} .左后将接口返回数据赋值给变量${r}

----------------------------

Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}

----------------------------

  • 通过${r.status_code}可以得到请求的HTTP状态码,通过Should Be Equal As Strings关键字判断其是否为200
  • 通过${r.json()}可以将JSON格式的数据转化为字典,并通过log关键字打印。

----------------------------

${dict} Set variable ${r.json()}
#断言结果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}

----------------------------

  •  将 ${r.json()} 通过Set Variable关键字赋值给变量${dict}
  • Get From Dictionary关键字由前面引入的Collections库提供,可以取到字典中key对应的value. 这里获取message对应的值给变量${msg}
  • Should Be Equal关键字用于比较${msg}是否等于success

接下来以同样的方式获取到字典status对应的状态码,可以得到状态200是整数类型。然而,在Robot Framework中直接编写的内容为字符串。所以,这里借助强大的Evaluate关键字,他可以直接调用Python语言提供的方法。例如,这里调用int() 把一个‘200’字符串转为整数类型,并与字典中取出来的整数200进行比较。

 

接下来再编写一个POST请求的嘉宾签到接口测试用例

 

posted @ 2020-06-30 15:13  素人渔芙2017  阅读(855)  评论(0编辑  收藏  举报