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 request
tep封装了请求日志功能,也可以用原生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部分组成。接口之间通过变量实现参数化和关联。
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句