Как не потерять важные проверки в долгих тестах: soft-assert на практике
В длительных системных тестах, особенно для систем хранения данных, важна не только проверка, но и устойчивость самого теста. Обычные assert в Python останавливают выполнение при первой ошибке, что неприемлемо для многокомпонентных и продолжительных тестов, где важно собрать максимум информации о сбоях.
Решение — использовать soft-assert, которые не прерывают выполнение. В команде мы используем Pytest плагин pytest-check, которая позволяет писать soft-assert через контекстный менеджер with check. Это дает возможность:
продолжить тест даже при частичных ошибках,
собрать диагностику по множеству компонентов (например, контроллеры, кэши, пулы),
минимизировать потери времени при дорогостоящих прогонах.
Пример soft-assert с pytest-check:
from pytest_check import check def object_stack(): pool_stack = ExitStack() yield pool_stack for host in hosts: with check: result = None try: PoolsService.get_pools_info(host) except HostUnavailableException as err: result = err assert not issubclass(type(result), HostUnavailableException), f'Failed to get pool: {result}'
Soft-assert полезен, когда нужно получить статус всех компонентов, несмотря на сбои отдельных, одна ошибка не делает тест недействительным и тест длится часами и его повтор — затратен.
Однако soft-assert не заменяет критические проверки — в местах, где сбой должен останавливать выполнение, следует использовать assert.
О том, как устроен процесс проверки надежности СХД TATLIN.UNIFIED, рассказала Наталья Грязнова, ведущий инженер по разработке ПО в YADRO. В тексте она делится подходами, которые позволяют комплексно проверять работу систем в разных условиях — от сверхнагрузок до нестабильной среды.