创建测试脚本时,首先选择HTTP协议设置测试脚本名称,然后进行事务管理。事务管理即为事务添加请求,各请求间可设置请求间隔。添加请求后,为保证测试脚本能在测试时正常执行,在保存测试脚本前还需验证脚本。

事务管理

验证脚本

设置初始化变量

JsonPath说明

XPath说明

事务管理

压测宝支持手动添加请求和通过导入脚本来添加请求,目前支持导入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时,还可以设置表单参数。

  • 点击<form参数>按钮可以上传键值对,需要输入参数名和对应的值。

  • 点击<x-www-form-urlencoded>按钮可以将表单内的数据转换为键值对,需要输入参数名和对应的值。

  • 点击<raw>按钮可以选择上传Text、JSON、XML或HTML格式的文本,需要输入对应的代码。

断言

在“断言”中,可以为请求添加断言,添加断言后才能检查请求获取内容是否与预期内容相匹配,从而判断请求的正确性。

点击<添加断言>按钮添加断言,设置断言的属性名、比较条件和目标值,详细说明如下。

  • 位置:目前支持的获取位置包括: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支持提取字符串赋值给变量,点击<选择>按钮设置之前和之后的字符串,提取想要获取的字符串。

1491036886344953.png

批量替换

您可以批量替换请求中的指定内容,直接输入被替换文本和替换文本即可。

1495765463934214.png

添加请求间隔

一个事务中添加多个请求时,为控制请求的发送时间,可以在请求间添加请求间隔。

 请求间隔指发起两个API请求的间隔时间,用于模拟真实的业务操作间的停顿时间,此时间内不对服务器产生压力。

点击<添加请求间隔>按钮添加请求间隔,选择间隔时间即可,目前支持1秒、2秒、3秒、5秒、10秒。例如选择“5”,则发送一条请求后,等待5秒后再发送下一条请求。

1495765507279496.png

调整请求或请求间隔的显示顺序

将鼠标悬停在已添加的请求或请求间隔上,按住鼠标可拖动对应的请求或请求间隔,拖拽到合适的位置后松开鼠标即可。       

删除请求或间隔

将鼠标悬停在已添加的请求或请求间隔上,点击右上方的<1463022370662104.png>图标可删除请求或间隔。

此外,选择多个请求,点击事务列表上方的<1495765772276101.png>按钮可批量删除多个请求。

验证脚本

添加请求后,为保证测试脚本能在测试时正常执行,需验证脚本。点击<验证脚本>按钮来测试事务的可用性和正确性并查看测试结果,如下图所示。

1468401099802791.png

测试结果说明

测试结果中,第一行为整个事务的测试结果,下面为事务中每个请求的测试结果,包括响应时间、可用性和正确性。

根据可用性和正确性,测试结果分为以下三种状态:

  • 绿色:事务或请求可用且正确

  • 黄色:事务或请求可用但不正确

  • 红色:事务或请求不可用

请求成功即可用,所有请求都可用时事务的可用性为“是”,否则为“否”。

添加断言时才能测试请求的正确性,所有请求的断言都正确时事务的正确性为“是”,否则为“否”。

查看请求的测试结果详情

点击<展开>按钮可以查看单个请求的测试结果详情,包括参数信息、变量与断言、请求报文和返回结果,帮助测试人员快速调试测试脚本。

1491037736497900.png

返回结果中,背景为红色的字符是不符合预期的返回结果。

设置初始化变量

使用变量时需要提前设置初始化变量,即为变量赋默认值。点击<初始变量>按钮添加自定义变量并查看系统变量。

自定义变量

使用“自定义变量”前,需初始化变量,即为变量赋默认值。点击“设置初始化变量 -> 添加自定义变量”按钮添加自定义变量。

  • 变量名称必须以$符号开头,并且由纯字母组成。

  • 您可利用自定义变量来存储值,并在多个请求之间动态地传递数据和状态。

    例如,在请求1中,设置$a动态提取Response Header中的Date值;然后在添加请求2时,将$a作为断言的目标值。

  • 变量支持拼接,可以与其它变量或字符串拼接出更为复杂的字符串。例如需要13位的随机数,可拼接变量:$random(0,99999999)$random(0,99999)。

  • 测试脚本中的以下位置支持输入变量:目标URL、BasicAuth认证、URL参数、HTTP头、表单参数、断言。

举例说明:

定义初始化变量,以$开头如下图所示:

1548659422537737.jpg

使用初始化变量,需要${},如下图所示:

1548659717495654.jpg

系统变量

系统变量可直接使用(无需初始化),并返回相应格式的数据。点击“设置初始化变量 -> 查看系统变量”查看可用的系统变量。

变量

使用方式

输出说明

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子元素。