Недавно я столкнулся (как мне показалось) со странным поведением.
Я использую pre-commit
для всех моих коммитов git, и одним из шагов является обеспечение прохождения всех модульных тестов.
У меня также есть make
target для запуска только модульных тестов.
Каждый раз, когда я пытался совершить коммит, шаг модульного теста в pre-commit
завершался неудачей, что указывает на то, что модульные тесты не прошли. Но когда я запускаю make unit
это пройдет. 🤷
Во время предварительной фиксации
pytest вернется с кодом выхода 5
– что указывает на отсутствие тестов
. Таким образом, не было того, что один или несколько тестов не прошли во время предварительной фиксации
-но ничего не было протестировано – и из – за ненулевого кода выхода предварительная фиксация
предотвратила фиксацию (как и должно быть)
первопричина
Оказывается, pre-commit
выполняет все шаги только для измененных файлов. Он передает список измененных файлов каждой команде – неявно. То есть, если вы не настроите его на это. 😀
Поэтому, когда я изменяю исходный файл (не тестовый файл), pytest “игнорирует” файл, поскольку он не будет содержать никаких тестов.
Решение
Теперь, когда мы понимаем “почему” – решение очевидно.
Пациент: Доктор, мне больно, когда я это делаю это
Доктор: Тогда не делай этого.
Для шага модульного теста попросите pre-commit не передавать имена файлов в качестве аргумента через pass_filenames: false
Ссылка
- [Stackoverflow](https://github.com/pre-commit/pre-commit/issues/1130
Кредит на изображение Пит Линфорт на Pixabay