pytest 接口自动化 从百草园到三味书屋...

Posted android超级兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest 接口自动化 从百草园到三味书屋...相关的知识,希望对你有一定的参考价值。

底部会给出完整代码!,
⚠️:本篇不说废话,全是干货!

开发环境

  • pytest 6.2.5
  • python 2.7.16
  • PyCharm 2021.2.3
  • system mac
  • requests 2.26.0
  • flask 2.0.2
  • jsonpath 0.82

接上一篇:pytest web自动化从百草园到三味书屋…

本篇采用接口来自玩android

requests

安装requests

pip install requests

查看是否安装成功: pip show requests

GET 请求

最简单的使用:

url: str = "https://www.wanandroid.com/"

result = requests.get(url.format("article/list/0/json"))

print(result.text)

来看看结果:


可以看到虽然请求出来了,但是感觉有点丑,来格式化一下!
import json

url: str = "https://www.wanandroid.com/"

# TODO
result = requests.get(url.format("article/list/0/json"))

print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))

这里采用json来进行格式化

效果图:


可能会有同学问json.dumps的参数,分别是什么意思:
json.dumps("json数据", indent=4, ensure_ascii=False)
  • 参数一:json数据
  • 参数二:格式化后的空格
  • 参数三:是否解码

一张图搞清楚:


POST请求

post请求的话一定会携带参数,这里拿登陆来举例:

loginJson = 
    "username": "1********0", # 这里输入自己的,如果没有自己创建一个
    "password": "o******7",


resultData = requests.post(url.format("user/login"), params=loginJson)
resultData.encoding = 'utf-8'

# print(resultData.text)

# 格式化
print(json.dumps(json.loads(resultData.text), indent=4, ensure_ascii=False))

请求结果:

这里采用的是登陆的接口,如果没有账号的同学在这里注册!

最基本的使用就这么多

还有一些需要知道的参数:

添加header信息

什么是header?

header就是发送网络请求时候 请求头部的信息

比如说,在企业开发时,请求头(header)中必加的是token,token表示是每一位用户的信息.

参考文档

百度百科参考

如何添加head,以百度为例:

先来看看不加header的效果:


baiduUrl = 'https://www.baidu.com/'

response = requests.get(baiduUrl)

print(response.text)

会出现乱码:


添加header的效果:


可以看出,不仅不乱码了,而且还给格式化了一下!

⚠️: 这里的header内容不用记,一般要添加的话,让你添加的那个人都会告诉你需要添加什么!

结合pytest小实战

代码比较简单,直接看代码:


import pytest
import requests


@pytest.fixture
def requestUrl():
    return "https://www.wanandroid.com/"


class TestRequests:
    @pytest.mark.parametrize("index", ['0', '1', '2', '3', '4', '5',"test assert"])
    def test_demo01(self, requestUrl: str, index: str):
        result = requests.get(requestUrl.format("article/list//json").format(index))
        # 为了方便查看,先不格式化
        # print("result<>:".format(index) + json.dumps(json.loads(result.text), indent=4, check_circular=False))
        print("result<>:".format(index) + result.text)

        # 断言是否成功
        assert result.ok


if __name__ == '__main__':
    pytest.main(['-s'])

这里采用pytest的parametrize机制,一共测试7条数据

  • 0-5条数据是正确的
  • 第7条数据test assert 是错误的!

来看看效果:

flask

安装 flask

pip install flask

查看是否安装成功: pip show flask

什么是flask?

如果你觉得你们后台写的接口太丑,那么就可以用到flask,flask是用来本地自己写接口的!

最简单的flask

from flask import Flask

flask = Flask(__name__)


@flask.get('/')
def test_flask_demo1():
    return "hello flask"


if __name__ == '__main__':
    flask.run()

来看看效果:


⚠️:默认是get请求

flask - POST请求

post请求稍微麻烦一点点,post请求不能直接在浏览器访问,需要先开启服务,然后通过上面讲到的requests来访问!

例如这样:

在开发中没有人直接返回一个字符串的,都是返回的json格式的数据

例如这样:

咋们肯定不会写这么复杂,就先来个简单的.

先来了解一下json,生成json串我总结了三种方法:

  • 方式一:
    这是我最喜欢的方式,简单明了!
  • 方式二:
    这种需要手动写一点点代码,能实现,但是我个人不喜欢用
  • 方式三:
    这是最简单的方式,不推荐使用,不好维护

flask本地json接口

flask = Flask(__name__)


@flask.get('/')
def test_flask_demo1():
    bean = StudentFlaskBean("张三", "18", True)

    print("参数为:", json.dumps(bean.__dict__, indent=4, ensure_ascii=False))

    return json.dumps(bean.__dict__, indent=4, ensure_ascii=False)


if __name__ == '__main__':
    flask.run()

效果图:

动态写法

如果我们想要动态加载page页怎么来做呢?

只需要这样:

来看看效果图:

只要格式正确都可以输入监测到

flask一些常用的属性

  • 检测post输入的内容:

request.get_data()


这种一点也不好用,因为结果前面会带个b,例如:

b'username=12345678913&pwd=666666'

request.get_json()

这种方式比较好,因为可以直接获取到某个属性!


检测get的一些常用属性:

这里比较简单,因为是get请求,所以直接在浏览器访问即可

效果图为:

到这里flask就差不多了,如果你还想进阶一下,点我查看

走到这里同学们应该会自己请求一个接口并且直接搞一个本地的url了,但是呢,本地url都是一个json,如何解析json获取到对应的数据呢?

接下来我就给大家介绍jsonpath!

jsonpath

什么是jsonpath?

从名字就能看出来,是用来解析json数据的

先来规定json数据:


resultJsonData = 
    "schoolInfo": 
        "name": "实验一中",
        "time_start": "2000-1-1"
    ,
    "grade": [
        
            "name": "雄鹰班",
            "classData": [
                
                    "name": "张三",
                    "age": 13.5
                ,
                
                    "name": "杜子腾",
                    "age": 13.2
                
            ]
        ,
        
            "name": "猎鹰班",
            "classData": [
                
                    "name": "黄飞鸿",
                    "age": 13.7
                ,
                
                    "name": "郭德纲",
                    "age": 14.1
                
            ]
        
    ]

来看看使用,直接上效果图:

jsonpath 表达式规范

  • $ 表示根结点
  • . 表示取子节点
  • … 表示获取所有符合条件的内容
  • * 代表所有元素的节点
  • [] 表示迭代器的标识 用于处理下标等情况
  • [,] 多个结果选择
  • ?() 过滤操作
  • @ 当前节点

炫酷高端的查找方式


这里非常简单,仔细看看就明白了,这里就不过多多介绍啦!

小实战

总结:

  • requests 用来请求接口 get / post 等
  • flask 用来自己写本地接口
  • jsonpath 用来解析json数据

写了这么多代码,感觉还是有点懵懵的,来个小实战疏通一下.

需求:
通过flask本地写一个登陆功能,然后使用requests来请求,最后采用jsonpath解析数据,判断是否登陆成功!

相信大家已经了如指掌,直接看代码了:

接口(flask):

import json
import time

from flask import Flask, request

@flask.post('/login')
def testLogin():
    username = ""
    pwd = ""
    msg = ""
    data = None
    try:
        if request.json['username'] == "12345678913":
            username = request.json['username']

            if request.json['pwd'] == "666666":
                pwd = request.json['pwd']
                msg = "恭喜你,成功了,小伙子代码写的不赖啊!"
                data = Data("成功返回数据啊。。", getCurrentData())
            else:
                msg = "密码输入错误.. 仔细检查一下啊。。"
        else:
            username = request.json['username']
            pwd = "******"
            msg = "账号输入错误。。 密码无法查看"
    except Exception:
        data = None

    loginBean = LoginBean(username, pwd, msg, data)
    return json.dumps(loginBean.__dict__, indent=4, ensure_ascii=False)


# 获取当前时间
def getCurrentData() -> str:
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


if __name__ == '__main__':
    flask.run()

实体类:

class Data:
    def __init__(self, title: str, currentTime: str):
        self.title = title  # 成功返回标题
        self.currentTime = currentTime  # 成功返回当前时间


class LoginBean:
    def __init__(self, username: str, pwd: str, msg, data: None):
        self.username = username  # 账号
        self.pwd = pwd  # 密码
        self.msg = msg  # 登陆返回信息
        if data is not None:
            self.data = data.__dict__  # 具体登陆信息 失败返回null

客户端:(paramData)

import json

import requests

paramData = 
    "username": "12345678913",
    "pwd": "666666"


result = requests.post("http://127.0.0.1:5000/login", json=paramData)

print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))

来看看实现的几种效果吧:

说明图片展示
账号错误
密码错误
参数错误
输入正确

好了,就讲这么多,如果觉得哪一些知识点写的不全,需要补充请在评论区留言哦!

完整代码

原创不易,您的点赞就是对我最大的支持!


猜你喜欢:

以上是关于pytest 接口自动化 从百草园到三味书屋...的主要内容,如果未能解决你的问题,请参考以下文章

pytest 从百草园到三味书屋....

android 图解 PhotoView,从‘百草园’到‘三味书屋’!

我想自学laraver,请诸位前辈给一些建议,谢谢

Java笔记-网络编程

超详细从入门到精通,pytest自动化测试框架实战教程-allure测试报告

pytest接口自动化零基础入门到精通(01)入门基础篇