# API用例流程
# 1. 创建项目测试文件
# 2. 创建项目所必须得目录
- modules_api:存放接口类
- test_case:存放测试用例
- upload:测试过程中上传文件存放的目录,会传到git上
# 3. 明确测试项目名称和文件名称
- 打开文件:auto_test/project_config.py
- 在ProjectEnum类下面增加你的项目名称,注意:项目名称需要和项目信息表中的项目名称一致
- 在auto_test_project_config中添加一行,明确自动化的类型、项目名称和目录名称,目录名称就是上面创建的目录名称
# 4. 初始化项目基础数据
- 在创建的目录__init__.py中粘贴以下代码,按照代码提示进行修改
from urllib.parse import urljoin
from mangokit import singleton, requests
from pydantic import BaseModel, ConfigDict
from auto_test.project_config import ProjectEnum
from enums.tools_enum import EnvironmentEnum, AutoTestTypeEnum
from models.api_model import ApiBaseDataModel
from tools.log import log
from tools.obtain_test_data import ObtainTestData
from tools.project_public_methods import ProjectPublicMethods
@singleton # 固定写法
class WanAndroidDataModel(BaseModel): # 固定写法,请修改类名称保持类名在全局唯一
model_config = ConfigDict(arbitrary_types_allowed=True) # 固定写法
user_info: dict = {"username": "maopeng", "password": "729164035"} # 项目基础数据,如登录用户。写在这里后面所有的用例都可以来获取,通常创建一个属于自动化测试的账号
headers: dict = {'Content-Type': 'application/x-www-form-urlencoded'}# 固定写法,该类必须要写一个headers,用于全局测试用例
test_environment: EnvironmentEnum # 固定写法,项目环境
base_data: ApiBaseDataModel # 固定写法,API自动化测试的基础数据,详情请查看该类的属性
test_data: ObtainTestData = ObtainTestData() # 固定写法,整个项目的测试数据,如需夸类传参,请使用这里进行
cache_data: dict = {} # 固定写法,其他数据
def data_init(): # 固定写法
"""
登录接口,获取通用token
"""
data_model: WanAndroidDataModel = ProjectPublicMethods.get_data_model(WanAndroidDataModel, WanAndroidEnum,
AutoTestTypeEnum.API) # 固定写法,初始化WanAndroidDataModel
# 请在下面处理全局的权限,通常是在这里进行登录,然后把token放到上面的headers中,后面的接口全部都会用这里的headers,避免每个用例都进行登录
login_url = f'user/login'
response = requests.request(url=urljoin(data_model.base_data.test_object.get('host'), login_url),
method="POST",
headers=data_model.headers,
data=data_model.user_info)
cookies = ''
for k, v in response.cookies.items():
_cookie = k + "=" + v + ";"
cookies += _cookie
data_model.headers['cookie'] = cookies
data_model.base_data.headers = data_model.headers
log.info(f'{WanAndroidEnum.NAME.value}的API在自动化基础信息设置完成!')
data_init() # 固定调用
# 4. 在modules_api中创建属于自己的接口类,固定写法如下:
from auto_test.api_wan_android import WanAndroidDataModel
from models.api_model import ApiDataModel
from tools.base_request.request_tool import RequestTool
from tools.decorator.response import request_data
class LoginAPI(RequestTool): # 固定写法,继承RequestTool
data_model = WanAndroidDataModel() # 固定写法,ZToolDataModel是项目基础数据模型
@request_data(14) # 传入接口ID
def api_login(self, data: ApiDataModel) -> ApiDataModel: # 固定写法
"""
登录接口
"""
# 可以在这里对data.request 中进行修改请求数据
# 加密,解密等接口通用操作请写在这里
return self.http(data) # 固定写法,返回:data
# 4. 在test_case中编写测试用例,固定写法如下:
import allure
import pytest
from auto_test.api_wan_android.modules_api.login import LoginAPI
from models.api_model import ApiDataModel
from tools.base_request.case_tool import CaseTool
from tools.decorator.response import case_data
from tools.obtain_test_data import ObtainTestData
@allure.epic('项目') # 项目名称
@allure.feature('模块') # 一级模块
@allure.story('测试场景或二级模块') # 二级模块或者属于这个模块的测试场景
class TestLogin(LoginAPI, CaseTool): # 继承你写的接口类,固定:继承CaseTool
test_data: ObtainTestData = ObtainTestData() # 固定写法:数据处理类,这个类提供加密,解密获取各种测试数据,参照帮助文档->公共方法->随机数据
@classmethod
def setup_class(cls): # pytest 测试类执行前执行 可以忽略写
pass
@case_data(1)
def test_01(self, data: ApiDataModel):
data = self.api_login(data)
assert data.response.response_dict['data']['nickname'] == "maopeng"
@case_data([14, 15]) # 示例传入列表的用例ID,传入多个则每个用例都会执行一次
@case_data(160) # 示例传入用例ID,执行一次
@allure.description('用例描述') # 用例描述 可以忽略写
@pytest.mark.run(order=1) # 根据顺序执行,可以忽略写,通常用在流程用例中,如:创建->修改->删除
def test_02(self, data: ApiDataModel): # 固定写法
assert True # 编写你的测试用例,调用接口类,获取测试结果
@case_data(case_name=['用例名称A', '用例名称B']) # 例传入列表的用例ID,传入多个则每个用例都会执行一次
@case_data(case_name='用例名称') # 示例传入用例名称,执行一次
@allure.description('用例描述')
@pytest.mark.run(order=2)
def test_03(self, data: ApiDataModel):
assert False
# 执行main.py查看测试结果
- test_project列表固定接收一个字典,字典固定接收3个值:
- project:本次执行的测试项目名称
- test_environment:本次执行的测试环境
- type:本次执行的测试类型,目前支持:API、UI、选项