Pull to refresh

Comments 9

Было интересно! Спасибо за материал! Подскажите пожалуйста как в GitHub action исключить копирование одной директории? Например после прогона тестов на GitHub хочу закинуть весь код на vps, но папка tests там не нужна.

Спасибо большое, рад, что материал оказался полезным!

Что касается исключения папки (например, tests) при копировании кода на VPS в GitHub Actions — тут всё зависит от того, каким именно способом копируются файлы. Ниже пару вариантов:

Вариант 1: rsync

- name: Copy files to VPS
  run: |
    rsync -avz --exclude 'tests' ./ user@your-vps:/path/to/project

Можно исключать несколько папок:

--exclude 'tests' --exclude '.git' --exclude 'node_modules'

Вариант 2: scp

scp сам по себе не умеет исключать директории, но можно воспользоваться tar:

- name: Archive and copy files excluding tests
  run: |
    tar --exclude='./tests' -czf code.tar.gz .
    scp code.tar.gz user@your-vps:/path/to/project
    ssh user@your-vps "cd /path/to/project && tar -xzf code.tar.gz && rm code.tar.gz"

Спасибо! Буду пробовать первый вариант 👍🏻

До этого использовал action -uses: appleboy/scp-action@master

И не нашел в нем такой возможности

Привет.

Хочу прояснить пару моментов.

  1. Как формируется полный URI для запросов в HTTPX? Вижу base и вижу эндпойнты отдельно.

  2. Валидация ответов json-схемой. Почему не тем же расхваленым pydantic?

Добрый день! Давайте разбираться

  1. Как формируется полный URI для запросов в HTTPX? Вижу base и вижу эндпойнты отдельно.

Когда мы формируем Client мы можем передать в качестве аргумента base_url. При использовании Client для выполнения запросов, полный URL будет формировать автоматически "под капотом" httpx. Например:

# Указываем base_url при инициализации клиента
client = httpx.Client(base_url="http://localhost:8000")
# Теперь при выполнении запроса можем указывать только маршрут эндпоинта
# HTTPX сам сформирует полный URL под капотом
# base_url + endpoint => "http://localhost:8000/api/v1/users"
client.get("/api/v1/users")
  1. Валидация ответов json-схемой. Почему не тем же расхваленым pydantic?

Можно делать и через pydantic. По факту валидация через Pydantic уже выполняется, например тут

operation = OperationSchema.model_validate_json(response.text)

Pydantic действительно проверяет структуру данных и выдаст ошибку, если каких-то обязательных полей не будет. Однако у него есть один нюанс: он автоматически преобразует данные, если они пришли не в том формате. Например, если ожидается поле number: int, а в JSON пришло "number": "100" (строка), Pydantic без ошибок преобразует строку в число.

Да, начиная с Pydantic v2, в метод model_validate_json можно передать strict=True, чтобы включить строгую проверку типов:

my_model = MyModel.model_validate_json(data_json, strict=True)  # Ошибка, если типы не совпадают

Но у этого подхода есть недостатки:

  • Нужно каждый раз явно передавать strict=True, что может быть забыто.

  • Можно создать кастомную базовую модель, которая всегда включает strict=True, но это усложняет проект. Даже если сделать кастомную модель, то у вас уже будет два метода: один из Pydantic для валидации модели из JSON, а второй ваш кастомный, и придется постоянно держать это в голове. А если придет новичок, то он точно про это не узнает.

В итоге более надежное решение —

  1. Использовать Pydantic для работы с данными (преобразование JSON → объект Python).

  2. Использовать jsonschema для строгой проверки схемы.

Кроме того, вынесение проверки JSON-схемы в отдельную функцию позволяет:

  • Легко добавлять логирование и шаги Allure.

  • Гарантировать, что валидация всегда выполняется правильно.

  • Добавление Allure шагов и логирования на уровень методов pydantic, как будто идиоматически неверное решение

Как правильно и где объявлять кастомный data-testid, если по умолчанию web разработчики используют просто "id"? Если я не ошибаюсь, то это нужно сделать в fixtures в settings в chromium_page?

Похоже, вы немного ошиблись статьёй — тут речь идёт про API тесты, а не про UI и работу с data-testid

Верно, две ваши статьи открыл, не там написал.

Sign up to leave a comment.

Articles