# API用例流程

# 1. 创建项目测试文件

图片走丢了

# 2. 创建项目所必须得目录

  • modules_api:存放接口类
  • test_case:存放测试用例
  • upload:测试过程中上传文件存放的目录,会传到git上
    图片走丢了

# 3. 明确测试项目名称和文件名称

  1. 打开文件:auto_test/project_config.py
  2. 在ProjectEnum类下面增加你的项目名称,注意:项目名称需要和项目信息表中的项目名称一致
  3. 在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、选项 img.png