tep的设计理念是让人人均可以用Python写自动化,本文就来介绍如何用tep完成增删改查接口自动化。python
编辑fixtures/fixture_admin.py
:数据库
"qa": { "domain": "https://qa.com", },
修改qa
环境的domain
。json
由于非登陆接口须要从登陆接口拿token
,放在请求参数中,因此先在fixtures/fixture_admin.py
中实现登陆,修改url
和json
:api
response = request( "post", url=url("/api/users/login"), headers={"Content-Type": "application/json"}, json={ "username": "admin", "password": "123456", } )
根据实际响应数据结构,修改response_token
赋值:session
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的原则。app
完整代码dom
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
:post
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部分组成。接口之间经过变量实现参数化和关联。