Python接口自动化测试之详解post请求

前言

HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递。

且协议中并没有规定post请求的请求数据必须使用什么样的编码方式,所以其请求数据可以有不同的编码方式,服务端通过请求头中的 Content-Type 字段来获知请求中的消息主体是何种编码方式,再以对应方式对消息主体进行解析。

post请求参数常用的编码方式如下:

  1. application/x-www-form-urlencoded # form表单格式,非常常见

  2. multipart/form-data # 一般用于上传文件,较为常见

  3. application/json # json字符串格式,非常常见

  4. text/xml # xml格式

关于post请求参数,后面会有文章专门讲述,这里不做过多的阐述。

requests.post()参数说明

使用requests库提供的post方法发送post请求,requests.post() 源码如下:

  1. def post(url, data=None, json=None, **kwargs):

  2. r"""Sends a POST request.

  3. :param url: URL for the new :class:`Request` object.

  4. :param data: (optional) Dictionary, list of tuples, bytes, or file-like

  5. object to send in the body of the :class:`Request`.

  6. :param json: (optional) json data to send in the body of the :class:`Request`.

  7. :param \*\*kwargs: Optional arguments that ``request`` takes.

  8. :return: :class:`Response <Response>` object

  9. :rtype: requests.Response

  10. """

  11. return request('post', url, data=data, json=json, **kwargs)

参数说明:

  1. url,请求网址

  2. data,字典、元组列表、字节或要发送到指定URL的文件对象,可选(即可填可不填)

  3. json,要发送到指定URL的JSON对象,可选

  4. **kwargs,可以添加其他请求参数,如headers、timeout、cookies等

post接口中常用的编码格式在python脚本中对应的请求参数的格式一般就是 dict (字典) 或 json,如 application/x-www-form-urlencoded 格式在python中对应为dict,application/json 在python中对应为json。

因此,接下来分别这种编码格式进行举例。

发送post请求(请求参数格式为dict)

我们以请求TesterHome网的登录接口为例,发送请求参数格式为dict的请求。

请求头中content-type为application/x-www-form-urlencoded;charset=UTF-8,如下图所示:

那么请求参数编码格式应为dict,代码如下:

  1. import requests

  2. def testerhome_login():

  3. # data为请求入参

  4. data = {

  5. "user[login]": "账号",

  6. "user[password]": "密码",

  7. "user[remember_me]": 0,

  8. "commit": "登录"

  9. }

  10. headers = {

  11. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\

  12. 7.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"

  13. }

  14. url = "https://testerhome.com/account/sign_in"

  15. # 编码格式为application/x-www-form-urlencoded;charset=UTF-8,所以请求参数为dict,使用data参数

  16. res = requests.post(url=url, headers=headers, data=data)

  17. print(res.text)

  18. print(res.status_code)

  19. if __name__ == '__main__':

  20. testerhome_login()

运行结果如下:

由打印出来的返回内容,我们可以判断该接口请求成功。

发送post请求(请求参数格式为json)

这里我用flask框架写了个简单的模拟接口来演示,接口代码如下:

  1. from flask import Flask, jsonify, request

  2. app = Flask(__name__)

  3. app.config["JSON_AS_ASCII"] = False

  4. @app.route("/login", methods=["POST"])

  5. def login():

  6. username = request.json.get("username").strip()

  7. password = request.json.get("password").strip()

  8. print(username, password)

  9. if username and password:

  10. if username == "lilei" and password == "123456":

  11. return jsonify(

  12. {"code": 1000, "msg": "登录成功!", "token": "sh34ljjl08s32730dj"}

  13. )

  14. elif username == "hanmeimei" and password == "888888":

  15. return jsonify(

  16. {"code": 1000, "msg": "登录成功!", "token": "hjf078977l08ert2323k"}

  17. )

  18. else:

  19. return jsonify(

  20. {"code": 1001, "msg": "账号或密码错误!"}

  21. )

  22. else:

  23. return jsonify(

  24. {"code": 1002, "msg": "账号或密码不能为空!"}

  25. )

  26. if __name__ == '__main__':

  27. app.run()

注意需要先安装flask框架,然后运行该模块,具体可参考我之前的文章使用Flask开发简单接口,运行后我们可以看到该接口服务的 host 地址,如下:

这个接口的请求参数格式需要为json,requests.post()请求这个接口代码如下:

 
  1. import requests

  2. import json

  3. headers = {"Content-Type": "application/json;charset=utf8"}

  4. url = "http://127.0.0.1:5000/login"

  5. _data = {

  6. "username": "lilei",

  7. "password": "123456"

  8. }

  9. # 这里使用json参数,即json=_data

  10. res = requests.post(url=url, headers=headers, json=_data).text

  11. # 当然还可以使用data参数,但需先将_data转换为json格式,即data=json.dumps(_data)

  12. # json.dumps()将dict格式转换成json格式

  13. res = requests.post(url=url, headers=headers, data=json.dumps(_data)).text

  14. print(res)

运行结果如下:

总结

post请求因为请求主体编码格式的原因,在使用 requests.post() 时需要根据接口请求头中Content-Type字段,为请求参数选择指定的编码格式,才能发送请求。其实get请求的请求参数也有其对应的编码格式,至于如何确定get、post请求参数的格式,且听下回详解。 

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python接口自动化测试是一种通过编写Python代码自动化执行接口测试的方法,通常采用Python的第三方库实现。接口测试是针对软件系统的API接口进行验证,包括请求和响应验证、参数验证、返回结果验证等,其目的是确保系统在实现业务功能时能够正确运行和正常响应。Python作为一种高级编程语言,具有良好的表现力和扩展性,广泛应用于接口测试领域。 Python接口自动化测试的实现过程通常包括以下步骤: 1. 安装相应的Python库:比如requests、unittest、pytest等。 2. 编写测试代码:使用相应的Python库编写测试用例,包括测试接口的请求参数、请求方式、响应状态码、响应体等内容。 3. 运行测试:执行测试代码并生成测试报告,通常采用Jenkins、Travis CI等持续集成工具进行自动化运行。 Python接口自动化测试具有以下优势: 1. 快速执行:通过编写Python代码,自动化执行接口测试能够快速完成测试,并且测试过程能够反复执行,提高测试的效率。 2. 灵活性高:Python具有良好的表现力和扩展性,可以自定义接口测试框架和各种测试用例。 3. 代码复用性强:Python代码可以模块化和封装,让测试代码能够被复用,在测试维护也更加方便。 总之,Python接口自动化测试是一个高效、灵活、可靠的测试方法,在新时代的软件测试具有非常重要的地位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值