实际测试中,我们很难避免登录系统,接口同样我们也需要通过登录获取认证信息之后才可以操作其他接口。本来还想找一个使用实际的网站来演示

但是为了方便还是自己创建一个服务吧。

post接口请求其实跟get差不多,参考:https://www.cnblogs.com/du-hong/p/10559603.html

import requests

payload = dict(key1='value1', key2='value2')
r = requests.post('https://httpbin.org/post', data=payload)
print(r.text)

查看输出 

C:\Python\python.exe G:/软件测试/接口测试/Robotest/common/test.py
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-5feb62cd-344be2d804fbb8d773295b0a"
  }, 
  "json": null, 
  "origin": "36.155.117.25", 
  "url": "https://httpbin.org/post"
}


Process finished with exit code 0

创建服务的是百度来的,加了一个userinfo接口

思路:登录成功后拿到token然后作为userinfo的token入参

import flask
import json
from flask import request
import random

'''
flask: web框架,通过flask提供的装饰器@server.route()将普通函数转换为服务
'''

# 创建一个服务,把当前这个python文件当做一个服务
server = flask.Flask(__name__)
# @server.route()可以将普通函数转变为服务 登录接口的路径、请求方式

seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-"
sa = []
for i in range(10):
    sa.append(random.choice(seed))
result = ''.join(sa)


@server.route('/login', methods=['get', 'post'])
def login():
    # 获取通过url请求传参的数据
    username = request.values.get('name')
    # 获取url请求传的密码,明文
    pwd = request.values.get('pwd')
    # 判断用户名、密码都不为空
    if username and pwd:
        if username == 'xiaoming' and pwd == '111':
            resu = {'code': 200, 'message': '登录成功', 'token': result}
            return json.dumps(resu, ensure_ascii=False)  # 将字典转换字符串
        else:
            resu = {'code': -1, 'message': '账号密码错误'}
            return json.dumps(resu, ensure_ascii=False)
    else:
        resu = {'code': 10001, 'message': '参数不能为空!'}
        return json.dumps(resu, ensure_ascii=False)


@server.route('/userinfo', methods=['get', 'post'])
def userinfo():
    # 获取通过url请求传参的数据
    username = request.values.get('name')
    # 获取url请求传的密码,明文
    token = request.values.get('token')
    # 判断用户名、密码都不为空
    if username and token:
        if username == 'xiaoming' and token ==result :
            resu = {'code': 200, 'name': username, 'info': '我长得可美了', 'message': '获取成功'}
            return json.dumps(resu, ensure_ascii=False)  # 将字典转换字符串
        else:
            resu = {'code': 401, 'message': '认证错误'}
            return json.dumps(resu, ensure_ascii=False)
    else:
        resu = {'code': 10001, 'message': '参数不能为空!'}
        return json.dumps(resu, ensure_ascii=False)


if __name__ == '__main__':
    server.run(debug=True, port=8888, host='127.0.0.1')

写两个数据文件分别写上

- url : http://127.0.0.1:8888/login
  name : xiaoming
  pwd : 111
- url : http://127.0.0.1:8888/userinfo
  name : xiaoming
  token : LDhEMW%fI_

新建一个postdemo

import unittest
import requests
import os
from ddt import ddt, file_data, unpack
from common.getpath import data_path
import random
test_post_demo_path = os.path.join(data_path, 'post_data.yaml')
test_post_demo_path2 = os.path.join(data_path, 'post_data2.yaml')

@ddt
class post_demo(unittest.TestCase):

    @file_data(test_post_demo_path)
    @unpack  # 二次分解元组
    def test_testcase1(self, **kwargs):
        url = kwargs['url']
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
            AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
        data = {"name": kwargs['name'],
                "pwd": kwargs['pwd']
                }
        response = requests.post(url=url, headers=headers, data=data)
        # res = json.loads(response.text)
        print(url)
        print(response.text)
        # print(response.headers)


    @file_data(test_post_demo_path2)
    @unpack  # 二次分解元组
    def test_testcase2(self, **kwargs):
        url = kwargs['url']
        data = {"name": kwargs['name'],
                "token": kwargs['token']
                }

        response = requests.post(url=url, data=data)
        # res = json.loads(response.text)
        print(url)
        print(response.text)
        # print(response.headers)




if __name__ == '__main__':
    unittest.main()

执行结果如下,然后大家发现第二个接口并没有获取成功而是提示错误了,那是因为我们文件中存入的token是【LDhEMW%fI_】,跟登录获取到的不一样,请求错误

其实我们真正项目中我们测试一个接口首先就需要获取token、cookie认证信息,然后放到需要请求的接口的healers,

还有就是请求一个接口有可能需要其他接口的一些数据,比如删除一个数据,你需要获取这个数据的ID,

获取这个数据你需要创建一个数据生成一个ID。然后你才可以去删除。

所以我们这里token不能从yaml文件中取值,需要从登录接口中获取然后传递到userinfo接口作为入参。那么我们怎么实现呢

…………….

…………….

…………….

…………….

…………….

…………….

下回见

如果你看懂了,就支持一下多少随意

 

本文地址:https://blog.csdn.net/u011640418/article/details/111873320