在创建测试任务之前,首先需要准备测试脚本。测试脚本,即Testing script,一般指一个特定测试的一系列指令,这些指令可以被自动化测试工具执行。为了提高测试脚本的可维护性和可复用性,必须在执行测试脚本之前对它们进行构建,测试脚本是自动执行测试过程(或部分测试过程)的计算机可读指令。
目前,压测宝主要提供面向移动互联网API后端接口的性能测试,一个测试脚本可以理解为一个事务,一个事务可以包含一个或一系列请求。
创建测试脚本时,需要设置测试脚本名称并进行事务管理。事务管理即为事务添加请求,各请求间可设置请求间隔。添加请求后,为保证测试脚本能在测试时正常执行,在保存测试脚本前还需验证脚本。
事务管理
点击<添加新请求>按钮为事务添加请求,需要设置基本信息、断言和变量。
基本信息
在“基本信息”中,可以根据需要设置目标URL、认证、URL参数和HTTP头,详细说明见下表。
设置项 | 说明 |
目标URL | 选择请求方式并填写目标URL,目前支持的请求方式包括:GET、POST、PUT、DELETE、HEAD和OPTIONS。 |
认证 | 目前支持Basic Auth认证方式,点击<Basic Auth>按钮添加身份认证信息,包括用户名和密码。 |
URL参数 | 点击<添加URL参数>按钮添加URL参数,定义需要传递的参数,包括参数名和对应的值。 设置的URL中已经包含了参数时,直接点击<参数自动解析>按钮获取参数即可,您也可以重新编辑或删除参数。 URL参数可以通过变量的方式进行传递,此时需要设置初始化变量,详细说明请参考“设置初始化变量”。 |
HTTP头 | 点击<添加HTTP头>按钮添加HTTP请求头,定义请求需要获取的内容,包括请求头名称及对应的值。 |
表单参数 | 目标URL的请求方式选择为POST、PUT或DELETE时,还可以设置表单参数。
|
断言
在“断言”中,可以为请求添加断言,添加断言后才能检查请求获取内容是否与预期内容相匹配,从而判断请求的正确性。
点击<添加断言>按钮添加断言,设置断言的属性名、比较条件和目标值,详细说明如下。
位置:目前支持的获取位置包括:JSON Body、XML Body、Text Body、Response Headers和状态码,例如选择“JSON Body”。
属性名:设置要检查的属性名,例如输入“id”。
比较条件:设置目标值与获取内容的比较条件,包括为空、不为空、等于、不等于、包含、不包含、是数字、数值等于、小于、小于等于、大于、大于等于等条件,例如选择“等于”。
目标值:设置判断获取内容是否正确的一个标准值,例如输入“1001”。
设置的断言的为:在JSON Body中,id的属性值等于1001。依此判断请求的正确性: JSON Body中,id的属性值等于1001时,请求正确性为“是”,否则为“否”。
变量
在“变量”中,可以设置动态提取变量,即动态地提取变量值并赋给初始化变量,有关初始化变量的设置方法请参考“设置初始化变量”中的说明。
点击<提取变量值>按钮,设置变量获取位置、属性名并选择初始化变量。变量获取位置可以是Json Body、XML Body、Text Body、Response Headers、状态码。
添加请求间隔
一个事务中添加多个请求时,为控制请求的发送时间,可以在请求间添加请求间隔。
请求间隔指发起两个API请求的间隔时间,用于模拟真实的业务操作间的停顿时间,此时间内不对服务器产生压力。 |
点击<添加请求间隔>按钮添加请求间隔,选择间隔时间即可,目前支持1秒、2秒、3秒、5秒、10秒。例如选择“5”,则发送一条请求后,等待5秒后再发送下一条请求。
调整请求或请求间隔的显示顺序
将鼠标悬停在已添加的请求或请求间隔上,点击右上方的<>图标并按住鼠标可将对应的请求或请求间隔移动到合适的位置,松开鼠标即可。
删除请求或间隔
将鼠标悬停在已添加的请求或请求间隔上,点击右上方的<>图标可删除请求或间隔。
验证脚本
添加请求后,为保证测试脚本能在测试时正常执行,需验证脚本。点击<验证脚本>按钮来测试事务的可用性和正确性并查看测试结果,如下图所示。
测试结果说明
测试结果中,第一行为整个事务的测试结果,下面为事务中每个请求的测试结果,包括响应时间、可用性和正确性。
根据可用性和正确性,测试结果分为以下三种状态:
绿色:事务或请求可用且正确
黄色:事务或请求可用但不正确
红色:事务或请求不可用
请求成功即可用,所有请求都可用时事务的可用性为“是”,否则为“否”。
添加断言时才能测试请求的正确性,所有请求的断言都正确时事务的正确性为“是”,否则为“否”。
查看请求的测试结果详情
点击<展开>按钮可以查看单个请求的测试结果详情,包括参数信息、变量与断言和返回结果。
返回结果中,背景为红色的字符是不符合预期的返回结果。
设置初始化变量
使用变量时需要提前设置初始化变量,即为变量赋默认值。点击<初始变量>按钮添加自定义变量并查看系统变量。
自定义变量
点击<添加初始化变量>按钮添加一个变量,设置变量名称和变量值。变量名称必须以$符号开头,并且是纯字母组成。
系统变量
除自定义变量外,您可以使用系统变量,系统变量可用于所有监控项目的API请求,点击<查看系统函数>按钮查看可用的系统变量,详细说明见下表。
变量 | 使用方式 | 输出说明 |
timestamp | ${timestamp()} ${timestamp(s)} ${timestamp(ms)} | Unix时间戳,例如对应的输出结果为: 20160222121928 1456113541 1456113598686 |
random | ${random(1,100)} | 随机数,例如1到100之间的一个数。 |
uuid | ${uuid} | 通用唯一识别码 (Universally Unique Identifier),例如: 99386c08-6da7-4833-bb31-e70ce747c921。 |
base64 | ${base64($username)} | base64编码值(可以是变量),例如5L2O5aOw6K+0。 |
md5 | ${md5($pwd)} | MD5加密值(可以是变量),例如: 50b7fe4da64720232c25bc7c6d66f6c5 |
初始化变量后,您可利用变量来存储值,动态地提取HTTP响应数据,并在多个请求之间动态地传递数据和状态。
例如,添加请求1时,可通过设置变量$a来动态提取Response Header中的Date值;然后在添加请求2时,使用变量$a作为断言的目标值。
JsonPath说明
JsonPath对于JSON来说相当于XPATH对于 XML。这是一个简单的从文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Java, Python和PHP。
下面是一组Json值:
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "isbn": "0-553-21311-3" } ], "bicycle": { "color": "red", "price": 19.95 } } }
读取方式(这里用Java语言做测试)
获取所有的有authors的值:
List<String> authors = JsonPath.read(json, "$.store.book[*].author")
获取store的第一个book的author值:
String author = JsonPath.read(json, "$.store.book[1].author")
获取所有book的category = "reference"的这一组json:
List<Object> books = JsonPath.read(json, "$.store.book[?(@.category == 'reference')]")
所有的book的price大于10的这一组json:
List<Object> books = JsonPath.read(json, "$.store.book[?(@.price > 10)]")
在所有book里有isbn的这一组json:
List<Object> books = JsonPath.read(json, "$.store.book[?(@.isbn)]")
下面举个例子
获取store里的book里面的category="reference"的author的值:
String authors = JsonPath.read(s, "$.store.book[?(@.category == 'reference')][0].author").toString()
XPath说明
XPath是一门在XML文档中查找信息的语言,XPath可用来在XML文档中对元素和属性进行遍历。XPath是W3C XSLT标准的主要元素,并且XQuery和XPointer都构建于XPath 表达之上,因此对XPath的理解是很多高级XML应用的基础。
下面是一组XPath格式:
<!--?xml version="1.0" encoding="ISO-8859-1"?--> <bookstore> <book> <title>Harry Potter</title> <price>29.99</price> </book> <book> <title>Learning XML</title> <price>39.95</price> </book> </bookstore>
[例1]
bookstore : 选取bookstore元素的所有子节点。
[例2]
/bookstore : 选取根节点bookstore,这是绝对路径写法。
[例3]
bookstore/book : 选取所有属于bookstore的子元素的book元素,这是相对路径写法。
[例4]
//book : 选择所有book子元素,而不管它们在文档中的位置。
[例5]
bookstore//book : 选择所有属于bookstore元素的后代的book元素,而不管它们位于 bookstore之下的什么位置。
[例6]
//@lang : 选取所有名为lang的属性。
[例7]
/bookstore/book[1] : 表示选择bookstore的第一个book子元素。
[例8]
/bookstore/book[last()] : 表示选择bookstore的最后一个book子元素。
[例9]
/bookstore/book[last()-1] : 表示选择bookstore的倒数第二个book子元素。
[例10]
/bookstore/book[position()<3] : 表示选择bookstore的前两个book子元素。
[例11]
//title[@lang] : 表示选择所有具有lang属性的title节点。
[例12]
//title[@lang='eng'] : 表示选择所有lang属性的值等于"eng"的title节点。
[例13]
/bookstore/book[price] : 表示选择bookstore的book子元素,且被选中的book元素必须带有price子元素。
[例14]
/bookstore/book[price>35.00] : 表示选择bookstore的book子元素,且被选中的book元素的price子元素值必须大于35。
[例15]
/bookstore/book[price>35.00]/title : 表示在例14结果集中,选择title子元素。
[例16]
/bookstore/book/price[.>35.00] : 表示选择值大于35的 "/bookstore/book" 的price子元素。