Comments 2
Хорошо разложено, особенно мысль про то, что восстановление зависимости и восстановление системы — разные события: 12:00 сервис здоров, 12:03 разобрана очередь.
Добавлю то, чего мне не хватило в разделе про fault injection, — воспроизводимость. Хаос-эксперимент ловит нарушение инварианта один раз, а дальше начинается самое дорогое: попытка повторить. Если задержки, потери и порядок доставки берутся из настоящей сети, конкретное расписание не повторяется, и находка превращается в «мы такое однажды видели». Практический выход — сделать источник недетерминизма своим: время, таймеры, порядок готовых колбэков и решения «доставить / потерять / продублировать» брать из генератора с сидом. Тогда упавший прогон адресуется одним числом, кладётся в регрессию и воспроизводится на чужой машине.
И второе, ближе к вашему списку инвариантов. У набора инвариантов та же беда, что у любых тестов: если он всегда зелёный, по цвету не отличить «ловит» от «не смотрит». Дешёвая проверка — временно выключить в системе правило, которое эти инварианты обязаны защищать (например, атомарность проверки ключа идемпотентности), и потребовать, чтобы тесты покраснели с конкретным именем нарушенного инварианта, а не просто упали. Если не покраснели — проверяется не то, что кажется.
Спасибо, хорошее дополнение. Про воспроизводимость согласен — в статье я остановился на управляемости самого отказа, но не дошел до следующего шага: управляемым должен быть и сценарий, который к нему привел. Иначе действительно получаем классическое «один раз поймали, второй раз не можем повторить». Подход с seed здесь хорошо превращает случайный эксперимент в нормальный регрессионный тест.
Вторая мысль про инварианты тоже важная. Зеленый тест сам по себе ничего не доказывает, если мы ни разу не проверили, способен ли он стать красным при нарушении защищаемого свойства. Это хороший способ валидировать уже саму систему проверок: намеренно нарушить правило и убедиться, что падает именно нужный инвариант, а не что-то рядом.
Отлично, это как раз два пункта, которыми стоило бы дополнить раздел про fault injection.
Как тестировать распределенные системы: тайм-ауты, дубликаты, Saga и частичные отказы