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

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,,版权归原作者所有,如有问题请及时联系我们以作处理

作者:dongfanger   来源:掘金

链接:https://juejin.cn/post/6910414324712996872

想要获取更多Python学习资料,了解更多关于Python的知识,可以加Q群630390733踊跃发言,大家一起来学习讨论吧!

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

环境变量

编辑fixtures/fixture_admin.py:

"qa": {

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

},

复制代码

修改qa环境的domain。

登录

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

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

复制代码

说明:

可以复制login为多个fixture,如login_admin、login_some_user,灵活运用。

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_ch、login、url是fixture_admin.py中定义好的fixture。

from loguru import logger用于在测试用例中打印日志

from tep.client import requesttep封装了请求日志功能,也可以用原生from requests import request

新增

请求参数为nickname和phone,使用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_id、created_at、updated_at。

删除

请求方法为delete,url中传入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部分组成。接口之间通过变量实现参数化和关联。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容