在创建测试任务之前,首先需要准备测试脚本。测试脚本,即Testing script,一般指一个特定测试的一系列指令,这些指令可以被自动化测试工具执行。为了提高测试脚本的可维护性和可复用性,必须在执行测试脚本之前对它们进行构建,测试脚本是自动执行测试过程(或部分测试过程)的计算机可读指令。

目前,压测宝主要提供面向移动互联网API后端接口的性能测试,一个测试脚本可以理解为一个事务,一个事务可以包含一个或一系列请求。


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

事务管理

验证脚本

设置初始化变量

JsonPath说明

XPath说明


事务管理

点击<添加新请求>按钮为事务添加请求,需要设置基本信息、断言和变量。

基本信息

在“基本信息”中,可以根据需要设置目标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时,还可以设置表单参数。

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

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

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

断言

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

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

  • 位置:目前支持的获取位置包括: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秒后再发送下一条请求。

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

将鼠标悬停在已添加的请求或请求间隔上,点击右上方的<1463022328816047.png>图标并按住鼠标可将对应的请求或请求间隔移动到合适的位置,松开鼠标即可。

1463022440539179.png       

删除请求或间隔

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


验证脚本

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

1463022494881414.png

测试结果说明

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

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

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

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

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

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

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

查看请求的测试结果详情

点击<展开>按钮可以查看单个请求的测试结果详情,包括参数信息、变量与断言和返回结果。

1463022548787321.png

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


设置初始化变量

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

自定义变量

点击<添加初始化变量>按钮添加一个变量,设置变量名称和变量值。变量名称必须以$符号开头,并且是纯字母组成。

系统变量

除自定义变量外,您可以使用系统变量,系统变量可用于所有监控项目的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子元素。