httprunner icon indicating copy to clipboard operation
httprunner copied to clipboard

变量会被已提取的变量覆盖

Open ArthurSmoke opened this issue 4 years ago • 9 comments

问题描述

变量会被已提取的变量覆盖

版本信息

  • 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 avatar Aug 10 '20 04:08 ArthurSmoke

@ArthurSmoke foo1 换个有意义的名字可以吗?不要都叫foo1

WandyYing avatar Aug 20 '20 08:08 WandyYing

@WandyYing 一样的,foo1只是写例子的时候随手写的

ArthurSmoke avatar Aug 20 '20 08:08 ArthurSmoke

@ArthurSmoke 抱歉,之前没看明白你的问题。 我明白你的意思了,导致这个问题的原因是因为Extract是session级别的优先级。

WandyYing avatar Aug 22 '20 06:08 WandyYing

@ArthurSmoke 注释runner.py line no. 368

# self.__session_variables.update(extracted_variables)

即可修复你的问题。 我暂时不会提交这个修改,如果需要,你可以自己先按上面的改一下。 @debugtalk 我觉得这是一个bug,extract的值不应该超出testcase的作用域。

WandyYing avatar Aug 22 '20 06:08 WandyYing

@WandyYing 恩,我也没太清楚这里上个版本改动的原因

ArthurSmoke avatar Aug 24 '20 06:08 ArthurSmoke

@ArthurSmoke 注释runner.py line no. 368

# self.__session_variables.update(extracted_variables)

即可修复你的问题。 我暂时不会提交这个修改,如果需要,你可以自己先按上面的改一下。 @debugtalk 我觉得这是一个bug,extract的值不应该超出testcase的作用域。

@WandyYing 按照你说的这个方法我试了下是不行的,会导致被关联的用例执行报错。这句话是为了保存提取出来的变量以便于依赖这个用例的下个用例提取变量。具体报错如下: image 大佬,能帮忙再看下问题在哪嘛?我觉得__session_variables是一个类变量,pytest在执行2个不同文件的用例时会初始化两个实例时,类变量共享了导致的?

mzbb avatar Mar 21 '21 05:03 mzbb

试了下,找到了解决办法。楼上说的这一行self.__session_variables.update(extracted_variables)还是不能注释掉。解决办法就是把 __session_variables变成实例变量。请看图: image

mzbb avatar Mar 21 '21 05:03 mzbb

@mzbb 你好,我这边按照你的方法修改后,依然还是出现变量覆盖。请问你最终解决了吗?

netcaty avatar Jun 28 '23 11:06 netcaty

@mzbb 你好,我这边按照你的方法修改后,依然还是出现变量覆盖。请问你最终解决了吗?

按我这个方法是可以解决的

mzbb avatar Jun 28 '23 11:06 mzbb