本节主要涉及PyRestTest的高级特征的详细使用,主要指:generators(生成器), variable binding(变量绑定), data extraction(数据提取), content validators(文本验证)
它们是如何组合在一起的?
模板和上下文
- 测试和基准测试可以使用变量来模板化动态配置。
- 使用基础的Python string templating进行模板化
- 模板使用包含在上下文中的变量,而且每次测试运行或基准测试迭代都会对模板进行更新。
- 上下文要么传递到测试中,要么在测试中创建(如果没有提供)
- 上下文在TestSet是持久的。一旦在set中设置一个变量,该变量可以在当前set中的所有测试用例中使用。
- 可以通过下面3个方法跳调整上下文变量:
- 在TestSet的config或Test中使用variable_binds进行申明并赋值
- 在test中使用generator binds设置变量来获取generator的值
- generator必须在TestSet config中按名称声明才能使用它们
- generator绑定的值在每次HTTP调用时更新
- 一个测试用例只更新一次,一个Benchmark更新多次
- generator绑定的变量每次在Test/Benchmar中声明后会被重新更新赋值。一旦生成器生成数值,该数值能在所有子测试用例中使用(除非这个变量与其他变量绑定)
- 在一个test中可以使用extract_binds对HTTP响应报文进行数据提取
- 如果请求失败,变量中是没有设定数值的
- 不支持在benchmark进行变量提取,因为benchmark应该是相互独立的,进行数据抽取是没有必要的
Templating(模板), Generators(生成器), Binding (绑定)示例
如果你想benchmark创建/更新一组用户,但是用户必须要有唯一的ID进行登录,你会怎么做呢?
可以使用数字序列的生成器(generator),然后把生成器生成的数值绑定到一个PUT请求benchmark的ID域中。
为了演示静态变量的绑定,如下示例对first、lastname进行了绑定,示例文本内容如下:
---
- config:- testset: "Benchmark tests using test app"# Variables to use in the test set- variable_binds: {firstname: 'Gaius-Test', lastname: 'Baltar-Test'}# Generators to use in the test set- generators: # Generator named 'id' that counts up from 10- 'id': {type: 'number_sequence', start: 10}- benchmark: # create new entities- generator_binds: {user_id: id}- name: "Create person"- url: {template: "/api/person/$user_id/"}- warmup_runs: 0- method: 'PUT'- headers: {'Content-Type': 'application/json'}- body: {template: '{"first_name": "$firstname","id": "$user_id","last_name": "$lastname","login": "test-login-$id"}'}- 'benchmark_runs': '1000'- output_format: csv- metrics:- total_time: total- total_time: mean
当前tempate只支持请求体、请求URL、请求头。
生成器概述
下表给出了所有 generator及它们的配置元素(必须、可选以及含义):
含义 | 在YAML的名称 | 输出类型 | 参数 |
---|---|---|---|
获取宿主机的环境变量的值 | env_variable | any | required: ‘variable_name’, type: string (环境变量使用不需要添加前缀( $ 或 % )** |
重置环境变量值 | env_string | string | required: ‘string’, type: string(可以根据需要对环境变量中的值进行组合拼接获取需要的字符变量,获取系统环境变量需要前缀$) |
类型为整形的序列 | number_sequence | integer | optional: ‘start’, type: integer, default: 1 optional: ‘increment’, type: integer, default 1 |
随机整数(32位) | random_int | integer | |
随机字符串 | random_text | string | optional: ‘character set’ OR ‘characters’, type: string, default: string.ascii_letters optional: ‘min_length’, type: integer, default: 8 optional: ‘max_length’, type: integer, default: 8 optional: ‘length’, (can either have length or min/min), type integer |
随机获取给定list中的数值 | choice | any | required: ‘values’, type: array of anything |
给定一个有序列表,顺序获取给定列表的值 | fixed_sequence | any | required: 'values, type: array of anything |
Generators简介
env_variable
该变量名是使用宿主机定义的环境变量名。例如:如果你在shell脚本中使用宿主机的host可以通过$HOST获取,但如果使用env_variable类型的生成器,只需要在variable_name值设置为‘HOST’就可以。
{type: 'env_variable', 'string': "HOST"}
env_string
可以根据业务需要把多个系统环境变量与其他元素组合成一个字符串值。例如:
在shell脚本中: echo "$USER logged into $HOSTNAME"
是这样,在env_string类型的生成器变成了这样:
{type: 'env_string', 'string': "$USER logged into $HOSTNAME"}
random_text
生成随机的字符串,需要指定下列选项:
- 合法的字符长度:
- length:设置一个常量,指定长度
- min_length和max_length:允许生成字符串的长度范围区间
- 使用有效的字符,可以按下面两种方法定义:
- **characters:**指定使用生成的有效字符,characters类型为字符型。示例:characters:‘abceefj’
- character_set: 指定使用的字符集。示例如下:character_set:string.ascii_letters.支持的字符集如下表:
描述 | 文本名称 | 来源 |
---|---|---|
ASCII 码:大小写字母,不包括空格 | ascii_letters | Python internal |
ASCII 码:小写字母,不包括空格 | ascii_lowercase | Python internal |
ASCII码:大写字母,不包括空格 | ascii_uppercase | Python internal |
数字: 0-9 | digits | Python internal |
十六进制数字、大小写字母的组合 | hexdigits | Python internal |
十六进制数字, 所有小写字母 | hex_lower | string.digits+abcdef, |
十六进制数字, 所有大写写字母 | hex_upper | string.digits+ABCDEF, |
字母 | letters | Python internal, locale-dependent |
小写字母 | lowercase | Python internal, locale-dependent |
八进制数字 (0-7) | octdigits | Python internal |
标点符合, 管道符及 !"#$%&'()*+,-./:;<=>?@[]^_`{}~ | punctuation | Python internal |
所有可打印字符包括空格 | printable | Python internal, locale-dependent |
大写字母 | uppercase | Python internal, locale-dependent |
空格 | whitespace | Python internal, locale-dependent |
URL字符(ASCII小写字母和破折号/) | url.slug | string.ascii_lowercase + string.digits + ‘-’ |
URL Safe (RFC3986中的未保留字符) | url.safe | string.ascii_letters + string.digits + ‘-~_.’ |