创建测试脚本时,首先选择HTTP协议并设置测试脚本名称,然后进行事务管理。事务管理即为事务添加请求,各请求间可设置请求间隔。添加请求后,为保证测试脚本能在测试时正常执行,在保存测试脚本前还需验证脚本。
事务管理
压测宝支持手动添加请求和通过导入脚本来添加请求,目前支持导入Postman脚本(目前只支持Postman V1格式)和Jmeter脚本(目前只支持Jmeter jmx脚本)。
点击<添加新请求>按钮为事务添加请求,设置请求名称后,需要设置基本信息、断言和变量。
点击<导入脚本>按钮选择脚本类型并导入脚本,自动生成请求,可手动修改请求信息。
基本信息
在“基本信息”中,可以根据需要设置目标URL、认证、URL参数和HTTP头,详细说明见下表。
此外,压测宝支持Cookie的自动获取,即如果测试脚本中某个请求执行了登录等操作,后续相同的host请求可自动携带包括已登录信息的Cookie信息。
设置项 | 说明 |
目标URL | 选择请求方式并填写目标URL,目前支持的请求方式包括:GET、POST、PUT、DELETE、HEAD和OPTIONS。 目标URL中支持添加变量,可通过变量搭配出更复杂的请求URL。例如要测试同一网站下的不同模块,可设置如下格式的URL: www.abc.com/${module} |
认证 | 目前支持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”。响应时间的目标值单位为毫秒(ms)。
设置的断言的为:在_JSON Body中,id的属性值等于1001。依此判断请求的正确性: JSON Body中,id的属性值等于1001时,请求正确性为“是”,否则为“否”。
变量
在“变量”中,可以设置动态提取变量,即动态地提取变量值并赋给初始化变量,有关初始化变量的设置方法请参考“设置初始化变量”中的说明。
点击<提取变量值>按钮,设置变量获取位置、属性名并选择初始化变量。变量获取位置可以是Json Body、XML Body、Text Body、Response Headers、状态码。
Text Body支持提取字符串赋值给变量,点击<选择>按钮设置之前和之后的字符串,提取想要获取的字符串。
批量替换
您可以批量替换请求中的指定内容,直接输入被替换文本和替换文本即可。
添加请求间隔
一个事务中添加多个请求时,为控制请求的发送时间,可以在请求间添加请求间隔。
请求间隔指发起两个API请求的间隔时间,用于模拟真实的业务操作间的停顿时间,此时间内不对服务器产生压力。 |
点击<添加请求间隔>按钮添加请求间隔,选择间隔时间即可,目前支持1秒、2秒、3秒、5秒、10秒。例如选择“5”,则发送一条请求后,等待5秒后再发送下一条请求。
调整请求或请求间隔的显示顺序
将鼠标悬停在已添加的请求或请求间隔上,按住鼠标可拖动对应的请求或请求间隔,拖拽到合适的位置后松开鼠标即可。
删除请求或间隔
将鼠标悬停在已添加的请求或请求间隔上,点击右上方的<>图标可删除请求或间隔。
此外,选择多个请求,点击事务列表上方的<>按钮可批量删除多个请求。
验证脚本
添加请求后,为保证测试脚本能在测试时正常执行,需验证脚本。点击<验证脚本>按钮来测试事务的可用性和正确性并查看测试结果,如下图所示。
测试结果说明
测试结果中,第一行为整个事务的测试结果,下面为事务中每个请求的测试结果,包括响应时间、可用性和正确性。
根据可用性和正确性,测试结果分为以下三种状态:
绿色:事务或请求可用且正确
黄色:事务或请求可用但不正确
红色:事务或请求不可用
请求成功即可用,所有请求都可用时事务的可用性为“是”,否则为“否”。
添加断言时才能测试请求的正确性,所有请求的断言都正确时事务的正确性为“是”,否则为“否”。
查看请求的测试结果详情
点击<展开>按钮可以查看单个请求的测试结果详情,包括参数信息、变量与断言、请求报文和返回结果,帮助测试人员快速调试测试脚本。
返回结果中,背景为红色的字符是不符合预期的返回结果。
设置初始化变量
使用变量时需要提前设置初始化变量,即为变量赋默认值。点击<初始变量>按钮添加自定义变量并查看系统变量。
自定义变量
使用“自定义变量”前,需初始化变量,即为变量赋默认值。点击“设置初始化变量 -> 添加自定义变量”按钮添加自定义变量。
变量名称必须以$符号开头,并且由纯字母组成。
您可利用自定义变量来存储值,并在多个请求之间动态地传递数据和状态。
例如,在请求1中,设置$a动态提取Response Header中的Date值;然后在添加请求2时,将$a作为断言的目标值。
变量支持拼接,可以与其它变量或字符串拼接出更为复杂的字符串。例如需要13位的随机数,可拼接变量:$random(0,99999999)$random(0,99999)。
测试脚本中的以下位置支持输入变量:目标URL、BasicAuth认证、URL参数、HTTP头、表单参数、断言。
举例说明:
定义初始化变量,以$开头如下图所示:
使用初始化变量,需要${},如下图所示:
系统变量
系统变量可直接使用(无需初始化),并返回相应格式的数据。点击“设置初始化变量 -> 查看系统变量”查看可用的系统变量。
变量 | 使用方式 | 输出说明 |
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 |
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子元素。