Скажем так Бэкэнд услуги.
Ваша цель состоит в том, чтобы убедиться, что изменения в бэкэнде не сломают передний тренд … что «исправление» строки в коде PHP не нарушает встроенные приложения (угловой, реагировать или что -то еще) И вы не хотите иметь шесть разных трубопроводов Запуск тех же интеграционных тестов!
Если вы похожи на меня … вам также не нравится поддерживать несколько трубопроводов для тестирования интеграции. И если ты все еще Как и я … вы уже используете CodeFresh и Cypress. Итак, давайте сделаем трубопроводы CodeFresh немного более подлежащими обслуживанию.
На высоком уровне … у нас должны быть следующие контейнеры:
- приложение с комплексным реагированием (построено и обслуживается Nginx)
- приложение PHP
- Бэкэнд -прокси -сервис
- Бэкэнд внутренняя услуга
- (Наверное, база данных … Auth … может быть гораздо больше вещей …)
- Cypress Integration Tests
Приложение PHP тянет пакет React в … Приложение React связывается с прокси -службой … что связано с внутренней службой.
И допустим, что если вы внесете изменения в одну кодовую базу, вы хотите провести тест Cypress, который проходит полное сквозное тестирование на всех из них.
Технология используется
CodeFresh и Cypress 🔥 … зайдите на их сайты … Их документы хорошо написаны, и я не могу справиться с ними. Я некоторое время пользуюсь кипарисом (Эта статья на самом деле не об этом) И я использую CodeFresh в течение ~ 3 недели.
CodeFresh это инструмент CI/CD, который очень прост в использовании с Docker/Docker-Compose (среди прочего).
Кипарис это сквозное инструмент тестирования, который является сверхбыстрым и очень легким для использования.
Архитектура трубопровода
Цель состоит в том, чтобы каждый репо создавал свое собственное изображение, проделал свой собственный модульный тестирование, а затем «Первичный» трубопровод (репо с изменением кода) должен затем начать отдельный конвейер интеграционного тестирования, который втягивает другие изображения.
Если бы мы были ленивы … Легко сделать, чтобы провести тестирование интеграционного тестирования. это в том же конвейере по модульному тестированию. В конечном счете, у вас будет один меньший трубопровод и 100 -х линий YAML, дублированные по всей вашей кодовой базе. Это было бы безумно медленным.
Хитрость здесь состоит в том, чтобы убедиться, что вы не восстанавливаете каждое изображение каждый раз, когда вы запускаете свои интеграционные тесты … и ответ на это — использовать Команда CodeFresh Run Чтобы пройти в переменные среды, которые включают тег, которые должны использовать интеграционные тесты.
Трубопровод для тестируемого проекта
Вот упрощенный трубопровод для гипотетического приложения React, который имеет некоторые изменения кода.
… и ямл …
version: '1.0'
steps:
# clone step...
main_clone:
stage: build
git: github
title: Cloning main repository...
type: git-clone
repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}'
revision: '${{CF_REVISION}}'
# Dockerfile bundles the react app
react_image:
title: Building React app
stage: build
type: build
image_name: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}'
dockerfile: Dockerfile
tag: '${{CF_BRANCH_TAG_NORMALIZED_LOWER}}-${{CF_SHORT_REVISION}}'
# e2e_test uses the codefresh cli to launch a separate pipeline
e2e_test:
title: E2E Tests
stage: test
image: 'codefresh/cli:latest'
# the -v pass in separate environment variables to the next pipeline
command: >-
codefresh run codefresh_project_name/integration_pipeline -v
CYPRESS_TAG=latest -v
REACT_TAG=${{CF_BRANCH_TAG_NORMALIZED_LOWER}}-${{CF_SHORT_REVISION}} -v
PHP_TAG=latest -v PROXY_TAG=latest -v INTERNAL_TAG=latest
# PROBABLY some unit tests / other tests specific to this specific
# project in here... probably done in parallel...
# once the test passes while in master, tag this image with latest
publish_stable:
type: push
stage: publish
title: Tag Stable Project
candidate: '${{react_image}}'
tags:
- STABLE
image_name: martzcodes/project
when:
branch:
only:
- master
steps:
- name: e2e_test
'on':
- success
stages:
- build
- test
- publish
Ключ здесь являются параметры среды, передаваемые в конвейер интеграции. Тестируемое изображение помечено названием ветви и коротким хэш … Все остальное использует тег «Последний». Смотрите CodeFresh запустить документы Чтобы получить больше информации.
Интеграционная конвейер
Конвейер интеграции использует эти переменные среды, чтобы вытащить тег правильных изображений. Изображения, которые не были изменены, используют «последний» стабильный код, в то время как в тестировании изображения используется соглашение о тегах Branch-short_hash.
version: '1.0'
stages:
- test
steps:
e2e_composition:
title: The Actual End-to-End tests
stage: test
type: composition
description: Validate that one projects changes didn't break things
fail_fast: true
working_directory: ./
composition_candidates:
e2e_tests:
image: path/to/cypress/tests:${{CYPRESS_TAG}}
# sleep 30 is to wait for services to start up...
# ...could use something like wait-for-it instead
entrypoint: bash -c "sleep 30 && cypress run"
# these are helpful for debugging, but optional
environment:
- 'DEBUG=cypress:electron'
- ELECTRON_ENABLE_LOGGING=true
depends_on:
- react-app
- php-app
- proxy-service
- internal-service
networks:
martzcodes: null
# NOTE: A COMPOSITION IS BASICALLY A DOCKER-COMPOSE FILE
composition:
version: '2'
services:
react-app:
image: path/to/react/app/image:${{REACT_TAG}}
container_name: react-app
networks:
martzcodes:
php-app:
image: path/to/php/app/image:${{PHP_TAG}}
container_name: php-app
networks:
martzcodes:
proxy-service:
image: path/to/proxy/service/image:${{PROXY_TAG}}
container_name: proxy-service
networks:
martzcodes:
internal-service:
image: path/to/internal/service/image:${{INTERNAL_TAG}}
container_name: internal-service
networks:
martzcodes:
networks:
martzcodes:
Это всего лишь один шаг, но если у вас были другие виды тестов, которые вам нужно сделать во всем приложении (тестирование производительности, что угодно) … вы также можете сделать их здесь.
Одна аккуратная вещь, чтобы отметить: эта запись композиции в интеграции файла YAML … Это та же структура, что и файл с композитом Docker. Вы даже можете хранить его отдельно (с аналогичной настройкой, которую я могу просто сделать docker -compose -f codefresh -composition.yml up -d и быть полезным … единственное, о чем следует знать, это Codefresh и Docker Используйте разные строковые интерполяции
Резюме
Концепция отдельного конвейера по тестированию интеграции очень легко расширить … если вы можете логически разделить свое приложение (например … несколько отдельных приложений React внутри приложения PHP) … у каждого может быть собственная цепочка интеграции .. Анкет Но если бы что -то в приложении PHP изменилось бы, вы хотели бы проверить их все.
Полностью случайный пример будет что -то вроде …
Этот пример по-прежнему будет много трубопроводов, но, по крайней мере, они будут логически разбиты и легче повторно использовать.
Но есть проблема …
Это ломается, если вы работаете над историей/выполняете несколько запросов на тягу, которые проходят через несколько репо, которые зависят друг от друга … У меня действительно нет хорошего способа обойти это.
Если у вас есть какие -либо предложения по таким случаям … дайте мне знать!
Оригинал: «https://dev.to/martzcodes/integration-testing-across-multiple-repos-with-codefresh-1dh3»