Изоляция в тестах
! Хотел написать статью, но решил не дописывать - у Мартина все отлично и подробно расписано
В целом все отлично описано в Eradicating Non-Determinism in Tests.
A test is non-deterministic when it passes sometimes and fails sometimes, without any noticeable change in the code, tests, or environment. Such tests fail, then you re-run them and they pass. Test failures for such tests are seemingly random. In order to get tests to run reliably, you must have clear control over the environment in which they run, so you have a well-known state at the beginning of the test. There are a couple of ways to get isolation - either always rebuild your starting state from scratch, or ensure that each test cleans up properly after itself. Some people prefer to put less emphasis on isolation and more on defining clear dependencies to force tests to run in a specified order. I prefer isolation because it gives you more flexibility in running subsets of tests and parallelizing tests.
Фазы: given when then, Arrange-Act-Assert шаблон
Что такое изоляция
Когда изоляция может быть нарушена
Тестируемая функция. Если она не чиста, а есть сайд эффект. Но наличие такого сайд эффекта может нарушить изоляцию.
Примеры
- Допусти вы дергаете апи и это приводит к асинхронному процессу делающему хттп вызов. Так как этот вызов может вызвать дестабилизацию - обратиться к апи в тот момент когда у вас отрабатывает новый тест.
-
- что поможет - идентификация/шардирование - будет видно левый ид в вашем тесте, это значит что левый тест вмешался
-
- обработки для таких хвостов - Моки не завищясие от контекста приложения
-
- но если это событие в Кафку, то это контекстно независимо
-
- решение - стабилизация, достижение точки прохождения всех процессов. Лайнаризация!
Зачем нужна изоляция
Если тесты запускаются параллельно или использовают sharable resource. Race Condition?
Позволяют качество тестов повысить.
изоляция это одно - чтобы тесты не мешали друг другу
Что делать
Видна аналогия с транзакциями: фантомные чтения…
Поступим так же. Изоляция.
Можно ли сделать так, чтобы в рамках одной jvm тесты могли работать паралельно? Можно, но сложно. Самый простой пут - Лайнаризация.
Лайнаризация
Нужно чтобы до начала нового теста, все что связано с предыдущем было закончено.
Другие назнвания: Устаканивание, штиль, стоп зе ворлд - чтобы к моменту then все остановилось и замерло, закончился цикл, все умерло.
_
-
- почему request captor может работать, важно чтобы до then все успокоилось,
Arrange-Act-Assert шаблон
Arrange-Act-Assert является широко используемым шаблоном в написании тестов, особенно в модульном тестировании. Давайте подробнее рассмотрим каждый из этих шагов:
Arrange (Подготовка): На этом этапе вы настраиваете тестовую среду. Это включает в себя инициализацию объектов, создание моков, настройку необходимых данных и т.д. Цель этого шага - подготовить все необходимое для выполнения тестируемого действия.
Act (Выполнение): Здесь вы выполняете действие, которое хотите протестировать. Это может быть вызов метода или выполнение серии действий, которые приводят к определенному состоянию или результату, подлежащему тестированию.
Assert (Проверка результата): На последнем этапе вы проверяете результаты действия. Это включает в себя утверждения (assertions) относительно состояния объектов, возвращаемых значений, изменений в базе данных, отправленных сообщений и т.д. Цель этого шага - убедиться, что тестируемое действие дало ожидаемый результат.
_
В Drools этап, когда все правила были обработаны и больше ничего не происходит, называется “стадия стабилизации” или “фаза завершения”. Это момент, когда агенда (повестка дня, содержащая правила, готовые к выполнению) пуста, и движок правил Drools не имеет больше никаких действий для выполнения. В Drools, этап, когда все правила отработали и процесс ожидает, также может быть описан как “фаза покоя” или “состояние бездействия”. В некоторых контекстах, его также могут называть “точкой квиесценции” или “состоянием стабильности”, подразумевая, что система достигла стабильного состояния, где дальнейшие изменения не требуются или ожидаются.
А как там было в теории трех тел? Эпоха покоя?
Материалы по теме
- Eradicating Non-Determinism in Tests https://martinfowler.com/articles/nonDeterminism.html
A test is non-deterministic when it passes sometimes and fails sometimes, without any noticeable change in the code, tests, or environment. Such tests fail, then you re-run them and they pass. Test failures for such tests are seemingly random.