Я насколько это возможно покажу как подхожу я к автотестам на АПИ.
У нас есть пулл АПИшек и пулл Авторизаций для них, каждый из них это отдельный микросервис, написанный на разных языках python, jawa, go, в целом это не так важно. Есть документация по ним значит как формировать и отправлять и получать запросики понятно.
# Условно у меня есть одна абстрация для всех классов, куда я сложил какие-то базовые вещи для всех.
@dataclass
class ApiAbstraction(ABC):
config: Any = field(init=True)
session: ClientSession = field(init=True, default_factory=ClientSession)
async def close(self):
await self.session.close()
# И есть разные классы, для авторизации и апи
@dataclass
class ApiBLABLA(ApiAbstraction):
# Загрузить файл
async def send_file(self, filepath: str):
endpoint = f"app/files"
new_url = urljoin(self.config.api, endpoint)
headers = {"accept": JSON}
file = os.path.abspath(filepath)
data = {"file": open(file, "r")}
raw_result = await self.session.post(new_url, headers=headers, data=data)
result = await raw_result.json()
response = get_response_instance(result)
if response.success:
file = FileUploadModel.init_from_data(response.result)
return file
return response
# Условно класс для авторизации
@dataclass
class Auth(ApiAbstraction):
async def login(self):
endpoint = "auth/blabla"
new_url = urljoin(self.config.auth, endpoint)
headers = {}
raw_response = await self.session.get(new_url, headers=headers)
content = await raw_response.json(content_type=None)
response = get_response_instance(content, AuthModel)
return response
# Для ответов у меня есть модели, в которые конвертируется JSON ответ. можно и напрямую работать, но нам захотелось через модели.
@dataclass
class AuthModel(AbstractClass):
key: str = ''
И есть фикстуры которые мерджат нужные способы авторизации и апишки.
Соответственно в тестах я получаю уже готовые объект для работы с апишкой.
Для каких-то тестов, я сделал еще одну обертку для апишек, которая уже делает какие-то конкретные действия с разными апишками и выдает готовый результат.
В целом почти все тоже самое что и с UI тестами.