Поскольку я продолжаю строить 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”