Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСкрипты и автоматизация

Нужны ли тесты для рабочих скриптов

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
1 января, 08:12первое сообщение

Разбираю чужую обвязку: 900 строк bash и ни одного теста. Правишь в одном месте, отваливается в соседнем, причём молча.

Свои скрипты я тестами тоже никогда не покрывал, всегда казалось, что пока пишешь тест, десять раз прогонишь руками. Но после этой обвязки задумался. Кто пишет тесты на рабочие скрипты и что именно проверяет?

разбираю чужие конфиги за печенье
stackfix
stackfix
Участник
сообщений 495
с окт
8 июня, 11:29#2

Проверяю ровно две вещи: разбор ответа и превращение данных перед выгрузкой. Всё, что ходит в сеть, тестами не трогаю совсем.

Разбор проще всего запереть на сохранённых ответах. Один раз положил в папку obrazcy десяток настоящих страниц, дальше любая правка разбора проверяется за секунду.

пишу скрипты, чтобы не писать скрипты
Лена Соболева
Лена Соболева
Участник
сообщений 385
с дек
15 ноября, 14:46#3

И это же спасает, когда разметка на сайте поедет: тест падает на старом образце, ты кладёшь рядом свежий и сразу видишь, что именно поменялось.

Образцы держу в репозитории рядом с кодом, весят они копейки, если выкинуть картинки и скрипты.

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
22 апреля, 17:03#4
stackfix: Всё, что ходит в сеть, тестами не трогаю совсем

Здесь и была моя ошибка. Я представлял себе тест как полный прогон с сетью, поэтому и не брался. Разбор, вынесенный в отдельную функцию, проверяется вообще без сети.

разбираю чужие конфиги за печенье
Егор Пастухов
Егор Пастухов
Новичок
сообщений 78
с июл, второй сезон
1 сентября, 08:20#5

а для bash такое как делать? там же функций почти нет

tabless
tabless
Участник
сообщений 800
с июл
8 февраля, 11:37#6

Егор, функции в bash есть, и тестируются так же, как везде: файл с функциями отдельно, запускающий скрипт отдельно.

# razbor.sh, только функции, сам ничего не запускает
vytashit_ostatok() {
  printf '%s' "$1" | python3 -c 'import sys,re; m=re.search(r"data-ostatok=\"(\d+)\"", sys.stdin.read()); print(m.group(1) if m else "")'
}
# test_razbor.sh
. ./razbor.sh
proverit() {
  got=$(vytashit_ostatok "$2")
  if [ "$got" = "$3" ]; then echo "ok   $1"; else echo "FAIL $1: ждал '$3', получил '$got'"; fi
}
proverit "обычная карточка" "$(cat obrazcy/karta.html)" "42"
proverit "поля нет"         "<div></div>"              ""

Плюс к этому две вещи, которые дают больше половины пользы от всех тестов вместе. Первая: set -euo pipefail в начале каждого скрипта, тогда упавшая команда посреди конвейера не утащит прогон дальше молча. Вторая: shellcheck на весь файл, он ловит незакавыченные переменные и подстановки, которые разваливаются на пробеле в пути.

У меня оба пункта висят в хуке перед отправкой в репозиторий, и поломок они поймали больше, чем написанные руками тесты.

Юля Ким
Юля Ким
Знаток
сообщений 1240
с мая
15 июля, 14:54#7

Ещё одно, чего в ветке пока нет: холостой прогон. Флаг --nichego-ne-delat, при котором скрипт проходит весь путь целиком, но в базу не пишет и писем не шлёт.

Ловит он другой класс поломок: порядок действий, права на файлы, отсутствие папки для выгрузки. Тесты разбора в эти места вообще не заглядывают. У меня спасал чаще тестов, честно говоря.

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
22 декабря, 17:11#8

Подвожу для себя:

  • разбор и превращение данных выношу в отдельный файл, туда же тесты на сохранённых образцах;
  • set -euo pipefail и shellcheck в хук, дешевле всего и ловит много;
  • холостой прогон флагом, беру у Юли целиком;
  • сеть в тестах не трогаю.

Чужую обвязку начал с shellcheck: 60 замечаний, из них четыре настоящие поломки на пробелах в путях и одна на незакавыченной переменной внутри rm. Один вечер работы, и правки перестали быть рулеткой.

разбираю чужие конфиги за печенье