HttpRunner 2.x学习extract提取token值参数关联

本文详细介绍了如何使用Python的HttpRunner测试框架编写和运行测试用例。首先展示了如何将登录接口的信息转换为YAML和JSON格式的测试脚本,接着解释了如何从响应中提取token值并将其用于后续接口的请求参数,确保接口测试的连贯性。最后,提到了通过HttpRunner生成测试报告的过程。
摘要由CSDN通过智能技术生成

本文介绍了使用Python中的HttpRunner测试框架编写测试用例的过程。首先需要安装HttpRunner 2.5.7版本,然后使用登录接口作为案例进行说明。

登录接口相关信息如下:

访问地址:http://127.0.0.1:8000/api/v1/login/
请求类型:POST
请求头部:application/json
请求参数:{“username”:“test”, “password”:“123456”}
使用httpapi命令行工具访问后,可以得到以下请求和响应信息:

POST /api/v1/login/ HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 42
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/1.0.3

{
    "password": "123456",
    "username": "test"
}

HTTP/1.1 200 OK
Allow: POST, OPTIONS
Content-Length: 109
Content-Type: application/json
Date: Thu, 19 Sep 2019 15:15:18 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

{
    "code": 0,
    "msg": "login success!",
    "token": "000038efc7edc7438d781b0775eeaa009cb64865",
    "username": "test"
}

接下来,将请求和响应信息转换成HttpRunner的YAML格式脚本,保存为test_login.yml,如下所示:

config:
    name: logincase
    variables: {}

test:
    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.msg, login success!]
        - eq: [content.code, 0]

如果不喜欢YAML格式,可以使用JSON格式,新建一个test_login2.json文件,内容如下:

[
    {
        "config": {
            "name": "logincase",
            "variables": {}
        }
    },
    {
        "test": {
            "name": "login case1",
            "request": {
                "url": "http://127.0.0.1:8000/api/v1/login/",
                "method": "POST",
                "headers": {
                    "Content-Type": "application/json",
                    "User-Agent": "python-requests/2.18.4"
                },
                "json": {
                    "username": "test",
                    "password": "123456"
                }
            },
            "validate": [
                {
                    "eq": ["status_code", 200]
                },
                {
                    "eq": ["headers.Content-Type", "application/json"]
                },
                {
                    "eq": ["content.msg", "login success!"]
                },
                {
                    "eq": ["content.code", 0]
                }
            ]
        }
    }
]

最后,使用hrun命令运行测试用例,可以得到以下执行结果:

INFO     HttpRunner version: 2.5.7
INFO     Start to run testcase: logincase login case1
INFO     POST http://127.0.0.1:8000/api/v1/login/
INFO     status_code: 200, response_time(ms): 180.63 ms, response_length: 109 bytes
.
----------------------------------------------------------------------
Ran 1 test in 0.184s

OK
INFO     Start to render Html report ...
INFO     Generated Html report: reports\20200612T111815.719602.html

执行完成后,在当前目录下生成一个report文件夹,里面包含一个HTML格式的测试报告文件,可以查看测试详情,包括请求、响应和断言等信息。

extract提取token值参数关联(上个接口返回的token,传给下个接口请求参数)

如何将上个接口返回的token,传给下个接口当作请求参数?这是最常见的一个问题了。解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了。那么接下来就是解决两个问题:

  1. 如何取出token值?
  2. 如何参数关联?

环境:httprunner==2.5.7

场景案例:

我现在有一个登陆接口A,登陆成功后返回一个token值。有一个获取绑定卡号的接口B,但是接口B必须要先登录后传登录的token才能访问。

A接口登录接口文档基本信息:

访问地址:http://127.0.0.1:8000/api/v1/login/
请求类型:POST
请求头部:application/json
请求参数:{“username”:“test”, “password”:“123456”}

B接口获取绑定卡号的接口文档基本信息:

访问地址:http://127.0.0.1:8000/api/v1/userinfo/
请求类型:GET
请求头部:Content-Type: application/json
请求头部token参数:Authorization: Token xxxxx login token xxxxx

先不带token去访问接口B,使用命令行工具httpie测试接口:

C:\Users\dell>http http://127.0.0.1:8000/api/v1/userinfo/

HTTP/1.1 401 Unauthorized
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 58
Content-Type: application/json
Date: Sat, 21 Sep 2019 14:06:15 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept
WWW-Authenticate: Token
X-Frame-Options: SAMEORIGIN

{
    "detail": "Authentication credentials were not provided."
}

不带token会提示没权限访问:401 Unauthorized。

接口测试:

先使用接口测试工具测试下,用postman,或者fiddler都可以,我这里为了查看报文信息方便,用httpie命令行工具。

先访问接口A获取token值234af73571da46ade79ea6a74961b1d23d609b79:

D:\>http http://127.0.0.1:8000/api/v1/login/ username=test password=123456 -v

POST /api/v1/login/ HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 42
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/1.0.3

{
    "password": "123456",
    "username": "test"
}

HTTP/1.1 200 OK
Allow: POST, OPTIONS
Content-Length: 109
Content-Type: application/json
Date: Sat, 21 Sep 2019 15:37:06 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

{
    "code": 0,
    "msg": "login success!",
    "token": "234af73571da46ade79ea6a74961b1d23d609b79",
    "username": "test"
}

传给下个接口B:

D:\>http http://127.0.0.1:8000/api/v1/userinfo/ Authorization:"Token b7e02c959fbae4c2a0d9094f6f9b9a35fa8aaa1e" -v

GET /api/v1/userinfo/ HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Authorization: Token b7e02c959fbae4c2a0d9094f6f9b9a35fa8aaa1e
Connection: keep-alive
Host: 127.0.0.1:8000
User-Agent: HTTPie/1.0.3


HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 96
Content-Type: application/json
Date: Sat, 21 Sep 2019 16:04:25 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept
X-Frame-Options: SAMEORIGIN

{
    "msg":"sucess!",
    "code":0,
    "data":[
        {
            "id":105,
            "name":"test",
            "sex":"F",
            "age":24,
            "mail":"xxx@qq.com",
            "create_time":"2020-06-12"
        }]
}

传头部参数用xx:xxxx格式,中间用冒号:,如:User-Agent:demo-agent/1.0 ‘Cookie:a=b;b=c’,由于Authorization参数中间有空格,用双引号包起来。

extract提取token

提取登录接口返回的token值,使用extract提取器。

extract:
    - token: content.token

下个接口的用例引用token参数使用$token,完整的用例test_info.yml如下:

- config:
    name: logincase
    variables: {}

- test:
    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    extract:
        - token: content.token   # 提取token
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.msg, login success!]
        - eq: [content.code, 0]


- test:
    name: get user info case1
    request:
        url: http://127.0.0.1:8000/api/v1/userinfo/
        method: GET
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
            Authorization: Token $token   # 引用token
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.data.0.age, 24]
        - eq: [content.data.0.name, test]
        - eq: [content.data.0.mail, xxx@qq.com]

运行用例:

hrun test_info.yml

查看report报告:

打开report目录下生成的报告文件。打开报告详情,可以看到token引用成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.net.http.HttpResponse 类是用于表示 HTTP 响应的类,它包含一些与响应相关的信息和方法。然而,HttpResponse 并不直接提供获取 token 的方法,因为 token 的获取取决于你发送的 HTTP 请求以及服务器端的身份验证方式。 如果你想要获取一个需要身份验证的 API 的 token,一般的步骤如下: 1. 创建一个 HttpClient 对象,并配置它的身份验证信息(例如用户名和密码)或其他必要的请求头信息。 ```java HttpClient client = HttpClient.newBuilder() .authenticator(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); } }) .build(); ``` 2. 创建一个 HttpRequest 对象,并设置相关的请求信息,例如 URL、请求方法、请求头等。 ```java HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://example.com/api/token")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.noBody()) .build(); ``` 3. 使用 HttpClient 发送请求,并获取响应。 ```java HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); ``` 4. 从响应获取 token。 ```java String token = response.body(); ``` 需要注意的是,以上代码仅为示例,实际的身份验证和获取 token 的方式可能因具体情况而有所不同。你需要根据实际情况配置 HttpClient 和 HttpRequest 对象,以及处理响应的方式。 另外,如果你是在处理 OAuth2 或其他类似的身份验证流程,获取 token 的步骤可能更加复杂,需要涉及授权码、令牌刷新等。在这种情况下,建议参考相关身份验证协议的文档或使用专门的库来处理身份验证和令牌管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值