Как построить архитектуру для автотестов?

Здравствуйте!

Возник достаточно сложный для меня вопрос о том, как подойти к автоматизации тестирования API нескольких микросервисов, которые написаны на python и go. Я уже пробовал подойти к этому решению с помощью python и pytest, но сразу понял, что поддерживать тесты и расширять их будет крайне тяжело. И не могу найти примеров, которые достойны внимания.

Дано: микросервисы А, Б, С. У каждого из них есть несколько (десятки) api endpoint. Есть задача покрыть все API функциональными тестами, а также интеграционными. В изначальном варианте я использовал фикстуры как обертки над логикой сервиса. Но в какой-то момент я подумал, что одной абстракции не хватает, потому что менять и дополнять приходится много. Но нужно ли добавить ещё один слой между логикой и тестами?

Я не могу найти материалов, которые в полной мере описывают подходы в решении задач и проблем по автоматизации. Может быть, я упустил какие-то материалы/книги/курсы? Подойдут любые стоящие вещи, платные и бесплатные.
  • Вопрос задан
  • 245 просмотров
Решения вопроса 2
OnYourLips
@OnYourLips
Ваша роль какая: программист, фуллстек или технический директор?
Вопрос одной стороной выходит из области работы программиста.

Юниттесты с моками. Максимальное количество таких тестов, они самые эффективные.
Интеграционные тесты примитивные (через пару компонентов) с моками, если такое возможно, остальные с фикстурами.
Системные тесты делаются уже вне питоновской экосистемы. Обычно стабятся внешние зависимости.
Ответ написан
Я насколько это возможно покажу как подхожу я к автотестам на АПИ.
У нас есть пулл АПИшек и пулл Авторизаций для них, каждый из них это отдельный микросервис, написанный на разных языках 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 тестами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы