EMACSWAY_LOG Telegram 1506
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Как я делаю fitness-functions для микросервисов. Мой способ ориентирован на системы среднего размера. Who Writes Fitness Functions? <...> In general, architects write fitness functions as they determine the objective measures for important architecture characteristics.…
Как я делаю fitness-functions для микросервисов. Продолжение. Начало здесь.

По хуку before_scenario() (или before_tag()) создается дамп изначального состояния БД (если он не был создан ранее) утилитой pg_dump в многопоточном режиме, с использованием аргументов:
--jobs=n, где n - количество ядер процессора, len(os.sched_getaffinity(0));
--format=directory (требуется для параллельного дампа);
--clean;

Composition Pattern отлично подошел для создания дампов баз данных нескольких микросервисов.

При необходимости, созданная директория с дампом архивируется и сохраняется в хранилище (тут есть разные варианты сохранения дампов между запусками тестов, от монтирования удаленной директории до отправки архива в S3).

По хуку after_scenario() (или after_tag()) дамп изначального состояния БД восстанавливается утилитой pg_restore так же в многопоточном режиме, с использованием аргументов:
--jobs=n
--clean

Некоторые коллеги из других компаний восстанавливают БД на уровне файлов PGDATA тестируемого сервиса. Работает быстрее, но менее универсально.

При исполенении шага "Given SUT with 10000000 objects" проверяется наличие актуального предзаполненного дампа БД для указанного объема данных и производится или его восстановление, или его создание путем генерации фэйковых данных. С целью сокращения времени генерации, я генерирую данные непосредственно в БД, хотя можно и через Public API сервиса. Для генерации используется собственный performance framework, позволяющий воспроизвести селективность индексов целевой системы. Коробочные решения мне неизвестны, но за основу можно взять:
- https://hypothesis.readthedocs.io/en/latest/strategies.html
- https://github.com/litestar-org/polyfactory

На следующем шаге создаем нагрузку. Я использую тот же собственный performance framework, который автоматически определяет создавать ли зависимый объект или реиспользовать ранее созданный в соответствии с заданной вероятностной распределенностью. Коробочные решения мне опять же неизвестны, но за основу можно взять:
- https://schemathesis.readthedocs.io/

Если используется JS (например, при использовании K6), то имеет смысл обратить внимание на:
- https://dredd.org/

Для изоляции сервиса можно использовать Mountebank, WireMock или Mockintosh (на Python), pytest-httpserver. На PyPi достаточно много реализаций mock-серверов. Вплоть до стандартного http.server. Некоторые из них позволяют генерировать данные на основе OpenAPI спецификации. На JS имеет смысл посмотреть в сторону Prism, openapi-sampler. См. так же OpenAPI Generator (docs), Swagger Codegen (HOWTO).

Для относительно небольших систем нагрузочный движок можно не использовать вообще, ограничившись простой многопоточностью multiprocessing.Pool.map().

В некоторых случаях подойдет минималистичный нагрузочный движок molotov.

Для крупных систем потребуется распределенный нагрузочный движок. Locust можно запускать как библиотеку (пример). О том, как подружить Locust и asyncio, см. здесь. K6, Gatling, JMeter можно запускать через субпроцессинг.

Результат каждого запроса записывается в Graphite или в Prometheus для детализированного анализа.

Используя Gherkin, удалось совместить хранение спецификаций как функциональных, так и нефункциональных требований. При этом функциональные требования в Gherkin формате очень хорошо ложатся на EventStorming диаграмму.

[UPDATE]: см. также:
- https://allurereport.org/docs/behave/
- https://allurereport.org/docs/pytestbdd/
👍7🔥411🤣1



tgoop.com/emacsway_log/1506
Create:
Last Update:

Как я делаю fitness-functions для микросервисов. Продолжение. Начало здесь.

По хуку before_scenario() (или before_tag()) создается дамп изначального состояния БД (если он не был создан ранее) утилитой pg_dump в многопоточном режиме, с использованием аргументов:
--jobs=n, где n - количество ядер процессора, len(os.sched_getaffinity(0));
--format=directory (требуется для параллельного дампа);
--clean;

Composition Pattern отлично подошел для создания дампов баз данных нескольких микросервисов.

При необходимости, созданная директория с дампом архивируется и сохраняется в хранилище (тут есть разные варианты сохранения дампов между запусками тестов, от монтирования удаленной директории до отправки архива в S3).

По хуку after_scenario() (или after_tag()) дамп изначального состояния БД восстанавливается утилитой pg_restore так же в многопоточном режиме, с использованием аргументов:
--jobs=n
--clean

Некоторые коллеги из других компаний восстанавливают БД на уровне файлов PGDATA тестируемого сервиса. Работает быстрее, но менее универсально.

При исполенении шага "Given SUT with 10000000 objects" проверяется наличие актуального предзаполненного дампа БД для указанного объема данных и производится или его восстановление, или его создание путем генерации фэйковых данных. С целью сокращения времени генерации, я генерирую данные непосредственно в БД, хотя можно и через Public API сервиса. Для генерации используется собственный performance framework, позволяющий воспроизвести селективность индексов целевой системы. Коробочные решения мне неизвестны, но за основу можно взять:
- https://hypothesis.readthedocs.io/en/latest/strategies.html
- https://github.com/litestar-org/polyfactory

На следующем шаге создаем нагрузку. Я использую тот же собственный performance framework, который автоматически определяет создавать ли зависимый объект или реиспользовать ранее созданный в соответствии с заданной вероятностной распределенностью. Коробочные решения мне опять же неизвестны, но за основу можно взять:
- https://schemathesis.readthedocs.io/

Если используется JS (например, при использовании K6), то имеет смысл обратить внимание на:
- https://dredd.org/

Для изоляции сервиса можно использовать Mountebank, WireMock или Mockintosh (на Python), pytest-httpserver. На PyPi достаточно много реализаций mock-серверов. Вплоть до стандартного http.server. Некоторые из них позволяют генерировать данные на основе OpenAPI спецификации. На JS имеет смысл посмотреть в сторону Prism, openapi-sampler. См. так же OpenAPI Generator (docs), Swagger Codegen (HOWTO).

Для относительно небольших систем нагрузочный движок можно не использовать вообще, ограничившись простой многопоточностью multiprocessing.Pool.map().

В некоторых случаях подойдет минималистичный нагрузочный движок molotov.

Для крупных систем потребуется распределенный нагрузочный движок. Locust можно запускать как библиотеку (пример). О том, как подружить Locust и asyncio, см. здесь. K6, Gatling, JMeter можно запускать через субпроцессинг.

Результат каждого запроса записывается в Graphite или в Prometheus для детализированного анализа.

Используя Gherkin, удалось совместить хранение спецификаций как функциональных, так и нефункциональных требований. При этом функциональные требования в Gherkin формате очень хорошо ложатся на EventStorming диаграмму.

[UPDATE]: см. также:
- https://allurereport.org/docs/behave/
- https://allurereport.org/docs/pytestbdd/

BY emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.




Share with your friend now:
tgoop.com/emacsway_log/1506

View MORE
Open in Telegram


Telegram News

Date: |

Hashtags The visual aspect of channels is very critical. In fact, design is the first thing that a potential subscriber pays attention to, even though unconsciously. Informative But a Telegram statement also said: "Any requests related to political censorship or limiting human rights such as the rights to free speech or assembly are not and will not be considered." Invite up to 200 users from your contacts to join your channel
from us


Telegram emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
FROM American