Разветвление процесса JVM для каждого файла функций? - PullRequest
0 голосов
/ 07 августа 2020
• 1000 выполняется:
  • Мы создаем static экземпляр класса, который управляет жизненным циклом testcontainers для моих тестов с огурцом.
    • Это в настоящее время включает три контейнера: (i) Postgres DB (с примененной нашей схемой), (ii) Axon Server (хранилище событий), (iii) отдельный контейнер приложения.
    • Мы используем новый Spring @DynamicPropertySource, чтобы установить значения нашего источника данных, хранилища событий и т. Д. c. чтобы процесс огурца мог подключаться к контейнерам.
  • @Before в каждом сценарии мы выполняем некоторую очистку тестовых контейнеров.
    • Это сделано для того, чтобы у каждого сценария был чистый лист.
    • Он включает в себя усечение данных в таблицах (postgres контейнер), сброс всех событий в нашем хранилище событий (контейнер Axon Server) и некоторые другие работы для нашего приложения (сброс соответствующих обработчиков событий отслеживания) и т. д. c.

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

  • Добавление аргументов --threads <n> не будет работать, потому что контейнеры static будут конкурировать (и я пробовал это и как и ожидалось, он терпит неудачу).

Как я вижу, существуют разные варианты параллелизма, которые будут работать:

  1. Каждый сценарий запускает свой собственный контекст приложения Spring (по сути разветвление JVM), развертывает собственные контейнеры и запускает тесты таким образом. это было бы обычно).

Я думаю, что в идеальном мире мы бы go за 1 (см. *). Но для этого потребуется машина с большим количеством памяти и процессоров (к которым у меня нет доступа). И поэтому вариант 2, вероятно, будет для меня наиболее разумным.

Мои вопросы:

  • можно ли настроить огурец для разветвления JVM, которые запускаются назначенным файлы функций (которые соответствуют варианту 2 выше?)
  • как лучше всего распараллелить эту ситуацию (с тестовыми контейнерами)?

* Независимое развертывание и тестирование каждого сценария согласуется с документами по огурцу, в которых говорится: «Каждый сценарий должен быть независимым; вы должны иметь возможность запускать их в любом порядке или параллельно, при этом один сценарий не мешает другому. Каждый сценарий должен проверять ровно одну вещь, чтобы в случае сбоя он не прошел по понятной причине. Это означает, что вы не будете повторно использовать один сценарий в другом сценарии. "

1 Ответ

1 голос
/ 15 августа 2020

Это не вопрос переполнения стека. Нет однозначного правильного ответа - в основном это зависит от обстоятельств. Возможно, вы захотите попробовать https://softwareengineering.stackexchange.com/ в будущем.

Нет. Это невозможно. Cucumber не поддерживает разветвление JVM. Однако Surefire поддерживает разветвление, и вы можете использовать это, создав бегун для каждого файла функций.

Однако я бы пересмотрел стратегию тестирования и, возможно, дизайн приложения. Для параллельного выполнения тестов ваша система должна поддерживать параллельные вызовы. Поэтому я бы не стал считать хорошей практикой сброс вашей базы данных и хранилища событий для каждого теста. Вместо этого рассмотрите возможность написания тестов таким образом, чтобы каждый тест использовал свой собственный изолированный набор ресурсов. Так, например, если вы тестируете пользователей, вы создаете случайных пользователей для каждого теста. Если эти пользователи являются частью организации, вы создаете случайную организацию и т. Д. Это не всегда возможно. Некоторые приложения разработаны с использованием неявных одноэлементных ресурсов в коде. В этом случае вам придется провести рефакторинг приложения, чтобы сделать эти ресурсы явными.

В качестве альтернативы рассмотрите возможность передачи ваших тестов Cucumber вниз по стеку. Вы можете протестировать бизнес-логи c на любом уровне абстракции. Это не обязательно должен быть интеграционный тест. Затем вы можете использовать JUnit с Surefire вместо этого и использовать Surefire для создания нескольких вилок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...