Рубрики
Без рубрики

🧪 Интеграционное тестирование с Python, TestProject.io и Действия GitHub

Поскольку я продолжаю строить WaylonWalker.com, я иногда сталкиваюсь с некоторыми ошибками, которые не пойманы, потому что … Tagged с Python, WebDev, тестирование.

Поскольку я продолжаю строить Waylonwalker.com Иногда я сталкиваюсь с некоторыми ошибками, которые не пойманы, потому что у меня нет хорошего тестирования. Я хочу изучить некоторые параметры интеграционного тестирования, используя действия Github.

Запуск интеграционных тестов не предотвратит полного происхождения ошибок, но это позволит мне быстро их заметить и отказываться.

🤔 Что сначала проверить?

Самое первое, что приходит мне в голову,-это все, что загружается или запускает клиентскую сторону. Здесь быстро пришли две вещи. Я управляю Гэтсби, поэтому большая часть моего контента статически отображается, и он кричит на меня, если что -то не так ожидается. По причинам производительности я ленивые загруженные карты на своем блогролле, загрузка всех изображений заголовка становится тяжелой и убивает маяк (если кто -то действительно заботится). Я также загружаю некоторую информацию из лучших библиотек с открытым исходным кодом, которые я создал. Чтобы предотвратить необходимость восстановления всего сайта, чтобы получить последнюю информацию, я просто использую клиентскую сторону GitHub.

Вещи, которые я искал, от функций для тестирования

  • взаимодействие на стороне клиента
  • Внешний API

Особенности в моем блоге, чтобы рассмотреть тестирование

  • Ленивые карты блога
  • GitHub Repos

Репокса

Я решил начать с репо GitHub, так как они казались немного более прямыми, и прошло много времени с тех пор, как я сделал какой -либо селен.

Вот как выглядят карты репозиции GitHub

TestProject.io

Я пробую TestProject.io Впервые в этом проекте. Мой опыт до сих пор был первоклассным. Был существующий набор изображений/файлов Docker, настроенных для запуска агента TestProject в контейнере Docker вместе с драйверами Chrome и Firefox. Первое, что вам понадобится, это Tp_dev_token и Tp_api_key . Они предоставит доступ к вашей учетной записи TestProject, чтобы он мог автоматически публиковать результаты на ваш приборная доска

Поместите их в секреты в своем репо

В вашем GitHub Repo перейти к Настройки> Секреты , или добавление Настройки/Секреты к URL в ваш репо и добавьте токены. Это даст GitHub безопасный доступ к ним, если они не будут доступны для публики, участников, журналов или чего -либо еще.

Настройка разработчика

Чтобы ускорить разработку, я пошел вперед и создал среду разработки, в которую я мог бы войти в цифровой океан. Это позволило мне получить все мои тесты работать немного быстрее, чем просто запустить их через GitHub, но быть как можно более похожим. Это позволило мне изучить вкоды и выходы на настройке тестового процесса без необходимости выполнять полную установку каждый раз с помощью действий GitHub.

Я не собираюсь заходить в полную настройку машины Dev здесь, но вы можете прочитать мой Настройки заметок Анкет

🐍 Pytest

Вы можете увидеть, как все тесты проходили с Pytest на GitHub

Я решил спуститься по пути использования Pytest. Мне очень понравилась идея использования светильников, автоматическое запуск моих функций тестирования и использование некоторых возможностей отчетности Pytest.

Примечание Per Pytest Standard Practice I назвала каталог, содержащий тесты Тесты Анкет Пока это работает, TestProject.io использует этого директора в качестве имени по умолчанию для проекта. Если бы я вернулся, я бы либо переименовал каталог на то, что я хочу отобразить на TestProject.io, либо настраивать имя проекта внутри конфигурации.

conftest.py

Вы можете увидеть conftest.py Живи на GitHub.

Pytest автоматически импортирует conftest.py Модули из того же каталога, с которым вы работаете. Обычно здесь можно размещать светильники в нескольких файлах. Я поместил приспособление драйвера в этом модуле, чтобы по умолчанию я создавал больше тестов, он был доступен повсюду.

conftest.py хранит светильники для всех модулей в каталоге.

# tests/conftest.py

import time
import pytest
from src.TestProject.sdk.drivers import web driver

@pytest.fixture
def driver():
    "creates a webdriver and loads the homepage"
    driver = webdriver.Chrome()
    driver.get("https://waylonwalker.com/")
    yield driver
    driver.quit()

Посмотрите на полную версию conftest.py

Приведенный выше образец немного упрощен . Я столкнулся с некоторыми несоответствиями в реальной версии и обнаружил, что у некоторых тестов была лучшая скорость прохождения, если я добавлю ожидание. Я закончил с водитель и Slow_driver приспособление.

test_repos.py

Смотрите полное testrepos.py на GitHub

Первоначально я настроил 3 различных теста для карт репо. Я установил список репо, которые, как я ожидаю, появится на картах. Эти тесты довольно просты с TestProject.io, поскольку он использует селен и безголовный браузер для выполнения JavaScript под капюшоном.

Если вы не знакомы Безголовный браузер Запускает двигатель в качестве браузера без графического пользовательского интерфейса. JavaScript полностью загружается и анализируется, а DOM полностью интерактивно.

"""
Test that GitHub repo data dynamically loads the client-side.
"""

REPOS = [
    "find-kedro",
    "kedro-static-viz",
    "kedro-action",
    "steel-toes",
]

def test_repos_loaded(slow_driver):
    """
    Test that each repo-name exists as a title in one of the repo cards.

    On waylonwalker.com repo cards have a title with a class of "repo-name"
    """
    repos = slow_driver.find_elements_by_class_name("repo-name")
    # get innertext from elements
    header_text = [
        header.text for header in repos
    ]
    for repo in REPOS:
        assert repo in header_text


def test_repo_description_loaded(slow_driver):
    """
    Test that each repo has a description longer than 10 characters

    On waylonwalker.com repo cards have a descriptiion with a class of "repo-description"
    """
    repo_elements = slow_driver.find_elements_by_class_name("repo")
    for el in repo_elements:
        desc = el.find_element_by_class_name("repo-description")
        assert len(desc.text) > 10


def test_repo_stars_loaded(slow_driver):
    """
    Ensure that stars are properly parsed from the API and loaded client-side

    On waylonwalker.com repo cards have a stars element with a class of "repo-stars" and
    is displayed as "n stars"
    """
    repo_elements = slow_driver.find_elements_by_class_name("repo")
    for el in repo_elements:
        stars = el.find_element_by_class_name("repo-stars")
        num_stars, label = stars.text.split()
        assert int(num_stars) > 0
        assert label == 'stars'

Форум

forum.TestProject.io

Прежде чем прыгнуть в реальное действие. Я быстро хотел упомянуть Удивительно ✨ Discord Server, который у них есть.

Я был немного смущен тем, как настроить testproject.io внутри действий. Я был с быстрым ответом, связывающим меня с точным примером, который мне был нужен. Тесты были написаны на Java, но они установили необходимые мне шаги, которые мне нужны.

Действия GitHub 🎬

Test-WaylonWalker-Com.yml

Действия GitHub – это непрерывная интеграция, служба непрерывной доставки GitHub, которая будет раскручивать виртуальную машину и запустить набор шагов по ряду триггеров, включая Push, запрос на вытягивание и график.

Если вы новичок в действиях, ознакомьтесь с этой статьей об использовании действий.

Теперь, когда у меня есть настройка репо GitHub с моим Тесты Успешно работая в Pytest, давайте автоматически запустим его внутри действий GitHub.

name: Test WaylonWalker.com

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  schedule:
    - cron: '*/10 * * * *'

Вы можете видеть в вышеупомянутом разделе, я настроился на работу каждый раз, когда есть запрос на то, чтобы набрать или вытащить запрос на Main. Я также установил довольно агрессивный график испытаний, чтобы запустить каждый 10 минуты Анкет На данный момент это просто для того, чтобы укрепить уверенность в тестах и получить больше данных в отчетах для изучения. Я, вероятно, отключу это позже.

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@main
    - uses: actions/setup-python@v2
      with:
        python-version: '3.8'
    - run: pip install -r requirements.txt
    - name: Run TestProject Agent
      env:
        TP_API_KEY: ${{ secrets.TP_API_KEY }} # < Let Secrets handle your keys
      run: |
        envsubst < .github/ci/docker-compose.yml > docker-compose.yml
        cat docker-compose.yml
        docker-compose -f docker-compose.yml up -d
    - name: Wait for Agent to Register
      run: bash .github/ci/wait_for_agent.sh
    - run: pytest
      env:
        TP_DEV_TOKEN: ${{ secrets.TP_DEV_TOKEN }} # < Let Secrets handle your tokens
        TP_AGENT_URL: http://localhost:8585

В тестовой работе вы видите, что мы отобрали Tp_api_key в Docker-compose.yml используя envsubst Файл так, чтобы TestProject имел к нему доступ. Мы также разоблачили наш Tp_dev_token к питесту.

Docker-Compose.yml

Docker-Compose.yml

Следующее Docker-compose.yml Файл был любезно внесен @vitalybu в TestProject-IO/Java-Sdk репо. Он устанавливает шаблон с Tp_api_key В качестве переменной для Envsubst, безголовых браузеров для Chrome и Firefox и агента TestProject.io.

version: "3.1"
services:
  testproject-agent:
    image: testproject/agent:latest
    container_name: testproject-agent
    depends_on:
      - chrome
      - firefox
    environment:
      TP_API_KEY: "${TP_API_KEY}"
      TP_AGENT_TEMP: "true"
      TP_SDK_PORT: "8686"
      CHROME: "chrome:4444"
      CHROME_EXT: "localhost:5555"
      FIREFOX: "firefox:4444"
      FIREFOX_EXT: "localhost:6666"
    ports:
    - "8585:8585"
    - "8686:8686"
  chrome:
    image: selenium/standalone-chrome
    volumes:
      - /dev/shm:/dev/shm
    ports:
    - "5555:4444"
  firefox:
    image: selenium/standalone-firefox
    volumes:
      - /dev/shm:/dev/shm
    ports:
    - "6666:4444"

⌚ В ожидании регистрации агента

ждать агента

Я думаю, что самая интересная часть рабочего процесса – это то, как мы ждем регистрации агента. Сценарий оболочки немного терпит, но он ищет превышение max_attempts разрешено или что агент начал с использования своего /api/status REST API. Это мешает нам тратить слишком много времени, установив большое ожидание или пытаясь двигаться дальше и запустить Pytest без бегового агента.

trap 'kill $(jobs -p)' EXIT
attempt_counter=0
max_attempts=100
mkdir -p build/reports/agent
docker-compose -f docker-compose.yml logs -f | tee build/reports/agent/log.txt&
until curl -s http://localhost:8585/api/status | jq '.registered' | grep true; do
    if [ ${attempt_counter} -eq ${max_attempts} ]; then
    echo "Agent failed to register. Terminating..."
    exit 1
    fi
    attempt_counter=$(($attempt_counter+1))
    echo
    sleep 1
done

TestProject.io Dashboard 〽

Одна из самых крутых функций, которые вы получаете от TestProject.io, – это Отчеты приборная доска. Для меня это было похоже на премиальную функцию для бесплатно Анкет Здесь вы можете увидеть график временных рядов с уровнем успеха тестов с течением времени. Это дает вам возможность нарезать, но не много. Некоторые из фильтров предварительно зарегистрированы, как и последние 2 дня, прошедшие 30 дней не могут быть настроены.

Один тестовый поток на приборной панели

Когда вы тренируете, вы можете увидеть отдельные тесты, которые были запускаются, выберите их и смотрите отдельные отчеты для каждого теста. Лично мне очень нравится макет на стороне. Он преобразует шаги, запускаемые водителем в читаемый на человеке Блок -схема и каждый шаг может быть открыт, чтобы увидеть их ценности. Было бы неплохо, если бы он поднял мои утверждения Pytest, но привлечение того, что это сделало, было здорово.

В целом 😄

Опыт, который у меня был настройка TestProject.io для выполнения действий GitHub, был отличным. Было довольно просто настроить и работать со многими из самых больших инструментов тестирования интеграции сегодня, Selenium, Chrome, Firefox.

Теперь я собираюсь немного перевернуть частоту испытаний.

Больше действий

Если вы новичок в действиях, ознакомьтесь с этой статьей об использовании действий.

Оригинал: “https://dev.to/waylonwalker/integration-testing-with-python-testproject-io-and-github-actions-4c1j”