接口测试 使用 httprunner 框架遇到的问题

bozeng · 2019年10月26日 · 最后由 小小阿狸、 回复于 2019年12月30日 · 2539 次阅读

教程https://cn.httprunner.org/examples/testerhome-login/

Demo:

config:
    name: testcase description
    variables: {}
teststeps:

-   name: /account/sign_in
    request:
        headers:
            DNT: '1'
            Sec-Fetch-Mode: cors
            Sec-Fetch-Site: same-origin
            Turbolinks-Referrer: https://testerhome.com/topics
            User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
        method: GET
        url: https://testerhome.com/account/sign_in
    extract:
        X_CSRF_Token: <meta name="csrf-token" content="(.*)" />
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - text/html; charset=utf-8

-   name: /account/sign_in
    request:
        data:
            commit: 登录
            user[login]: asdfasdfasdf1dfasdf6@163.com
            user[password]: ashdfasdfasdfasd
            user[remember_me]: '0'
            utf8: ✓
        headers:
            Content-Type: application/x-www-form-urlencoded; charset=UTF-8
            DNT: '1'
            Sec-Fetch-Mode: cors
            Sec-Fetch-Site: same-origin
            User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
            X-CSRF-Token: $X-CSRF-Token
            X-Requested-With: XMLHttpRequest
        method: POST
        url: https://testerhome.com/account/sign_in
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - text/javascript; charset=utf-8
  • 注意 : 按照 httprunner 教程的所给的 demo 来执行的时候会报错:

原因是下面这行代码

X-CSRF-Token: $X-CSRF-Token

** 正确的写法*:

X-CSRF-Token: $ X-CSRF-Token

也就是说,$ 和变量之间需要又一个空格。

共收到 10 条回复 时间 点赞

感觉大佬是不是可以优化这个点啊 @debugtalk

我测试了下,这个写法没问题。

完整用例:

- config:
    name: testcase description
    variables: {}


- test:
    name: /account/sign_in
    request:
        headers:
            If-None-Match: W/"bc9ae267fdcbd89bf1dfaea10dea2b0e"
            User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
        method: GET
        url: https://testerhome.com/account/sign_in
    extract:
        X_CSRF_Token: <meta name="csrf-token" content="(.*)" />
    validate:
        - eq: [status_code, 200]

- test:
    name: /account/sign_in
    request:
        data:
            commit: Sign In
            user[login]: chenhengjie123
            user[password]: xxx
            user[remember_me]: '1'
            utf8: ✓
        headers:
            Content-Type: application/x-www-form-urlencoded; charset=UTF-8
            User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
            X-CSRF-Token: $X_CSRF_Token
            X-Requested-With: XMLHttpRequest
        method: POST
        url: https://testerhome.com/account/sign_in
    validate:
        - eq: [status_code, 200]

不知道你贴上来的用例是否完整,如果是,那你少了第一步的 get 请求(打开登录页面),所以导致没有生成 $X_CSRF_Token 变量。

陈恒捷 回复

大佬,我补充了一下 case 和报错信息,你看一下,反正我 我加了一个空格就解决了。

bozeng 回复

具体原因我没有查出来,你看看是这个问题导致的吗,我猜可能更空格有关😂

这时候你应该找一下真的原因,
或者说明为何你这样修改有用,这才是🈶️收获得做法

$X_CSRF_Token 与 $ X-CSRF-Token 跟这个下划线和横杠有关系

感觉 2 楼 6 楼说的对,日志已经告诉你了变量"X"没定义,因为 httprunner 里变量名识别的正则规则里是不包含 “-”(中横)的,所以 “$X-CSRF-Token” 这个他先识别的变量名是 X,而为什么你加个空格就可以了,是因为 “$ X-CSRF-Token” 加了个空格正则已经不能识别为变量了,所以就是个普通字符串,才没有报错,当然也不是用例本身的意图了

明白了,多谢大佬 @cs_awater

花开 回复

哈哈,认同。

不是修改后问题消失了就是解决了,很可能问题其实没消失,只是变成另一个问题了,所以现象不同了。

你上面提取的是:
extract:
X_CSRF_Token:
下面使用的是:
X-CSRF-Token: $X-CSRF-Token
肯定有问题了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册