D01_用例中设置变量(variables)
在编写用例的时候,如果一项硬编码的数据,反复多次出现,可以将其提取出来设置为变量,然后分别进行调用,提高用例的灵活度。HttpRunner 支持变量申明(variables)和引用($var)的机制。
如某系统登录页面,其表单代码如下。
编写 YAML 格式的测试用例如下:
- 表单提交方式为 POST,没有指定enctype属性,即默认为 application/x-www-form-urlencoded,所以提交的请求实体直接写入 data 关键字下。
- 系统登录的用户名和密码: admin / admin
- config:
name: 用例 - 测试进销存系统登录
- test:
name: 步骤 - 完成登录操作
request:
url: http://localhost/myweb/jxc/index.asp?action=login
method: POST
data:
username: admin
pwd: admin
问题:以上用例中,用户名和密码直接写入请求实体 data 下,类似硬编码,如果以其他用户身份登录系统,或者其他补助也用到该用户名的时候,则每次都要修改用例文件,明显缺乏灵活性,所以我们将用户名和密码提取出来,设置为变量,做到一次修改多次使用。而且后面我们可以将其再存储到环境变量文件(.env)中,可以多个测试用例共用一套变量。
解决:将用户名和密码的输入存入变量中:
- 存入当前步骤的区间中。该变量的作用域只能在当前步骤以内,相当于局部变量。
- 存入config全局区域中。该变量的作用域为整个测试用例中,相当于全局变量。
变量的定义和使用:
- 变量定义放到 variables 关键字下,可以同时定义多个变量
- 定义变量方法: <变量名>: <变量值>, 如, p_username: admin
- 使用变量方法: $<变量名>, 即:变量名前加上一个“$”符号。如, $p_username
案例1: 变量定义于测试步骤(test)中
- config:
name: 用例 - 测试进销存系统登录
- test:
name: 步骤 - 完成登录操作
# 相当于定义局部变量,只能在当前步骤中被使用
variables:
p_username: admin
p_password: admin
request:
url: http://localhost/myweb/jxc/index.asp?action=login
method: POST
data:
# 引用变量:$<变量名>
username: $p_username
pwd: $p_password
validate:
# 断言,如果登录成功,登录后页面的HTML中会出现 “topFrame” 字符串
# contains: 包含判断,判断预期结果是否被包含在实际结果中
# content:实际结果,请求后返回的响应实体内容,即登录后打开的页面 HTML代码
# topFrame:预期结果,如果返回正确的页面,其 HTML 中会包含此字符串
- contains: [content, topFrame]
案例2:变量定义于 config 中
- config:
name: 用例 - 测试进销存系统登录
# 相当于全局变量,在当前测试用例的所有步骤中都可以被使用
variables:
p_username: admin
p_password: admin
- test:
name: 步骤 - 完成登录操作
request:
url: http://localhost/myweb/jxc/index.asp?action=login
method: POST
data:
# 在用例文件的任何位置都可以引用变量:$<变量名>
username: $p_username
pwd: $p_password
validate:
- contains: [content, topFrame]
如果 config 区域里面的变量和 test 区域里面的变量有冲突时会怎样呢?
实验1:变量同时定义于 config 和 测试步骤 中
- config 区域:使用 “正确” 的用户名和密码
- test 区域:使用 “错误” 的用户名和密码
- 实验结果: 运行成功,说明 config 区域的变量会替换 test 区域的同名变量
- config:
name: 用例 - 测试进销存系统登录
variables:
# 在 config 区域,变量中使用 “正确” 的用户名和密码
p_username: admin
p_password: admin
- test:
name: 步骤 - 完成登录操作
variables:
# 在步骤区域, 变量中使用 “错误” 的用户名和密码
p_username: admin2
p_password: admin2
request:
url: http://localhost/myweb/jxc/index.asp?action=login
method: POST
data:
username: $p_username
pwd: $p_password
validate:
- contains: [content, topFrame]
实验2:变量同时定义于 config 和 测试步骤 中
- config 区域:使用 “错误” 的用户名和密码
- test 区域:使用 “正确” 的用户名和密码
- 实验结果: 运行失败,证明: config 区域的变量优先级 > test 区域的同名变量
- config:
name: 用例 - 测试进销存系统登录
variables:
# 在 config 区域,变量中使用 “正确” 的用户名和密码
p_username: admin2
p_password: admin2
- test:
name: 步骤 - 完成登录操作
variables:
# 在步骤区域, 变量中使用 “错误” 的用户名和密码
p_username: admin
p_password: admin
request:
url: http://localhost/myweb/jxc/index.asp?action=login
method: POST
data:
username: $p_username
pwd: $p_password
validate:
- contains: [content, topFrame]