Как не потерять важные проверки в долгих тестах: 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. В тексте она делится подходами, которые позволяют комплексно проверять работу систем в разных условиях — от сверхнагрузок до нестабильной среды.