httprunner
httprunner copied to clipboard
变量会被已提取的变量覆盖
问题描述
变量会被已提取的变量覆盖
版本信息
- HttpRunner 版本 3.1.4
项目文件内容
test1.yml
config:
name: test variables
base_url: "https://postman-echo.com"
variables:
foo1: ${getRandomNumber()}
teststeps:
-
name: set cookie test
request:
method: GET
url: /cookies/set
params:
foo1: $foo1
validate:
- eq: ["status_code", 200]
extract:
- foo1: status_code
test2.yml(和1一样)
config:
name: test variables
base_url: "https://postman-echo.com"
variables:
foo1: ${getRandomNumber()}
teststeps:
-
name: set cookie test
request:
method: GET
url: /cookies/set
params:
foo1: $foo1
validate:
- eq: ["status_code", 200]
extract:
- foo1: status_code
test2不会再调用${getRandomNumber()}方法
实际场景
为了使测试准确,每个api执行时都会调用一个生成uuid的接口生成一个新的uuid,这个功能放在debugtalk里作为一个方法。 测试中本身也有uuid这个api的测试,同时有提取uuid做检测。 所以每次执行到uuid的api,下面的所有用例里的uuid,都会被覆盖成已提取的uuid。 又不能指定执行顺序,所以有大面积的失败...
@ArthurSmoke foo1 换个有意义的名字可以吗?不要都叫foo1
@WandyYing 一样的,foo1
只是写例子的时候随手写的
@ArthurSmoke 抱歉,之前没看明白你的问题。 我明白你的意思了,导致这个问题的原因是因为Extract是session级别的优先级。
@ArthurSmoke 注释runner.py line no. 368
# self.__session_variables.update(extracted_variables)
即可修复你的问题。 我暂时不会提交这个修改,如果需要,你可以自己先按上面的改一下。 @debugtalk 我觉得这是一个bug,extract的值不应该超出testcase的作用域。
@WandyYing 恩,我也没太清楚这里上个版本改动的原因
@ArthurSmoke 注释runner.py line no. 368
# self.__session_variables.update(extracted_variables)
即可修复你的问题。 我暂时不会提交这个修改,如果需要,你可以自己先按上面的改一下。 @debugtalk 我觉得这是一个bug,extract的值不应该超出testcase的作用域。
@WandyYing 按照你说的这个方法我试了下是不行的,会导致被关联的用例执行报错。这句话是为了保存提取出来的变量以便于依赖这个用例的下个用例提取变量。具体报错如下:
大佬,能帮忙再看下问题在哪嘛?我觉得__session_variables是一个类变量,pytest在执行2个不同文件的用例时会初始化两个实例时,类变量共享了导致的?
试了下,找到了解决办法。楼上说的这一行self.__session_variables.update(extracted_variables)还是不能注释掉。解决办法就是把
__session_variables变成实例变量。请看图:
@mzbb 你好,我这边按照你的方法修改后,依然还是出现变量覆盖。请问你最终解决了吗?
@mzbb 你好,我这边按照你的方法修改后,依然还是出现变量覆盖。请问你最终解决了吗?
按我这个方法是可以解决的