专栏首页dongfanger如何用tep完成增删改查接口自动化

如何用tep完成增删改查接口自动化

tep的设计理念是让人人都可以用Python写自动化,本文就来介绍如何用tep完成增删改查接口自动化。

环境变量

编辑fixtures/fixture_admin.py

"qa": {
    "domain": "https://qa.com",
},

修改qa环境的domain

登录

因为非登录接口需要从登录接口拿token,放在请求参数中,所以先在fixtures/fixture_admin.py中实现登录,修改urljson

response = request(
    "post",
    url=url("/api/users/login"),
    headers={"Content-Type": "application/json"},
    json={
        "username": "admin",
        "password": "123456",
    }
)

根据实际响应数据结构,修改response_token赋值:

response_token = jmespath.search("token", response.json())

class Clazz:
        token = response_token
        jwt_headers = _jwt_headers(response_token)

return Clazz

参考_jwt_headers()实现自定义headers:

def _jwt_headers(token):
    return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}

_表示内部函数,外部无法访问,遵循conftest.py只对外提供fixture的原则。

完整代码

def _jwt_headers(token):
    return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}


@pytest.fixture(scope="session")
def login():
    # Code your login
    logger.info("Administrator login")
    response = request(
        "post",
        url=url("/api/users/login"),
        headers={"Content-Type": "application/json"},
        json={
            "username": "admin",
            "password": "123456",
        }
    )
    assert response.status_code < 400
    response_token = jmespath.search("token", response.json())

    class Clazz:
        token = response_token
        jwt_headers = _jwt_headers(response_token)

    return Clazz

说明:

  1. 可以复制login为多个fixture,如login_adminlogin_some_user,灵活运用。
  2. scope="session",表示只登录一次,所有测试用例使用同一个token。可以改为function,让每条用例使用不同token

写用例

新建测试

新建tests\crud_test.py

from loguru import logger
from tep.client import request


def test(faker_ch, login, url):

pytest的fixture作为参数传入test()函数来使用,faker_chloginurlfixture_admin.py中定义好的fixture。

  • from loguru import logger 用于在测试用例中打印日志
  • from tep.client import request tep封装了请求日志功能,也可以用原生from requests import request

新增

请求参数为nicknamephone,使用faker_ch造1条测试数据:

fake = faker_ch
nickname = fake.name()
phone = fake.phone_number()

请求方法为post,headers取登录返回值login.jwt_headers

response = request(
    "post",
    url=url("/api/users"),
    headers=login.jwt_headers,
    json={
        "nickname": nickname, "phone": phone
    }
)

添加断言,简单判断下响应状态码<400:

assert response.status_code < 400

也可以查数据库来断言。

提取修改接口需要的数据:

user_id = jmespath.search("id", response.json())
created_at = jmespath.search("createdAt", response.json())
updated_at = jmespath.search("updatedAt", response.json())

推荐用jmespath来提取json。

查询

请求参数传入刚才定义的局部变量nickname,使用get请求并断言,headers取登录返回值login.jwt_headers

response = request(
    "get",
    url=url("/api/users"),
    headers=login.jwt_headers,
    params={
        "page": 1,
        "perPage": 10,
        "keyword": nickname
    }
)
assert response.status_code < 400

get请求需要把json关键字改为params

修改

使用faker再造1条新数据:

nickname_new = fake.name()
phone_new = fake.phone_number()

请求方法为put,headers取登录返回值login.jwt_headers

response = request(
        "put",
        url=url(f"/api/users/{user_id}"),
        headers=login.jwt_headers,
        json={
            "id": user_id, "createdAt": created_at, "updatedAt": updated_at,
            "phone": phone_new, "nickname": nickname_new
        }
    )
assert response.status_code < 400

请求参数中用到了新增接口提取的数据user_idcreated_atupdated_at

删除

请求方法为deleteurl中传入user_id,headers取登录返回值login.jwt_headers

response = request(
    "delete",
    url=url(f"/api/users/{user_id}"),
    headers=login.jwt_headers
)
assert response.status_code < 400

删除接口没有json和params。

完整用例

"""
@Author  :  Don
@Date    :  12/25/2020 1:02 PM
@Desc    :  增删改查
"""
import jmespath
from loguru import logger
from tep.client import request


def test(faker_ch, login, url):
    fake = faker_ch
    logger.info("新增")
    nickname = fake.name()
    phone = fake.phone_number()
    response = request(
        "post",
        url=url("/api/users"),
        headers=login.jwt_headers,
        json={
            "nickname": nickname, "phone": phone
        }
    )
    assert response.status_code < 400
    user_id = jmespath.search("id", response.json())
    created_at = jmespath.search("createdAt", response.json())
    updated_at = jmespath.search("updatedAt", response.json())

    logger.info("查询")
    response = request(
        "get",
        url=url("/api/users"),
        headers=login.jwt_headers,
        params={
            "page": 1,
            "perPage": 10,
            "keyword": nickname
        }
    )
    assert response.status_code < 400

    logger.info("修改")
    nickname_new = fake.name()
    phone_new = fake.phone_number()
    response = request(
        "put",
        url=url(f"/api/users/{user_id}"),
        headers=login.jwt_headers,
        json={
            "id": user_id, "createdAt": created_at, "updatedAt": updated_at,
            "phone": phone_new, "nickname": nickname_new
        }
    )
    assert response.status_code < 400
    logger.info(f"用户姓名手机 {nickname} {phone} 修改后 {nickname_new} {phone_new}")

    logger.info("删除")
    response = request(
        "delete",
        url=url(f"/api/users/{user_id}"),
        headers=login.jwt_headers
    )
    assert response.status_code < 400

小结

本文介绍了tep的基本使用,先配置环境变量,再修改登录代码,然后新增测试,最后编写增删改查的接口请求。每条用例放在一个函数中,通过函数参数引用fixture来使用全局环境变量,函数内部可以定义测试需要的局部变量。每个接口是一个代码块,由接口描述、测试数据、请求、断言和数据提取5部分组成。接口之间通过变量实现参数化和关联。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何优雅的封装requests

    后面定义了get/options/head/post/put/patch/delete 6个函数。

    dongfanger
  • Django匆匆一眼却解答了多年疑惑

    Django 是 Python 的 一款 Web 开发框架,另外还有 Tornado,Flask,Twisted。为什么我要选择学 Django?原因很简单,上...

    dongfanger
  • 测试平台开发(二) 高逼格登录页面

    怎么样?哎哟,不错哦。本文就带大家一起用 Vue + Element-UI 把这个不错的登录页面开发出来。

    dongfanger
  • 爬虫性能相关

    这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些url需要我们获取相关数据,我们首先想到的是循环 简单的循环串行 这一种方法相对来说是最...

    coders
  • 经典SQL语句大全之基础

    1、说明:创建数据库 CREATE DATABASE database-name

    陈珙
  • 用 Python 爬微信公众号的数据

    0 前言 最近想搞一点秘密的小东西,然后就发现了一个非常有用的库 wechatsogou,听个名字你就大概能猜出是什么来的了,基于搜狗微信搜索的微信公众号爬虫...

    伪君子
  • 10分钟用Python爬取最近很火的复联4影评

    《复仇者联盟4:终局之战》已经上映快三个星期了,全球票房破24亿美元,国内票房破40亿人民币。

    短短的路走走停停
  • 还学的动吗? 盘点下Vue.js 3.0.0 那些让人激动的功能

    路漫漫其修远兮,吾将上下而求索。——献给所有为 Vue的发展而默默付出的开发者们。

    葡萄城控件
  • Python3网络爬虫(十二):初识Scrapy之再续火影情缘

    版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 ...

    Jack_Cui
  • 如何通过Kibana、Wazuh和Bro IDS提高中小企业的威胁检测能力?

    近来,我们一直都在通过一些开源免费的工具,来帮助中小企业提升其网络威胁检测能力。在本文中,我们将手把手的教大家通过Kibana,Wazuh和Bro IDS来提高...

    FB客服

扫码关注云+社区

领取腾讯云代金券