Под чувствительностью ко времени я подразумеваю, например, сценарий, который выполняется только один раз в месяц, или сценарий, который выполняется непрерывно, но дает определенный результат только один раз в месяц. Очевидно, что вы можете выполнить модульное тестирование во многих случаях, но есть исключения (в моем понимании).
Недавний пример, с которым я столкнулся, - настройка задания cron для запуска со второго по последний день каждого месяца. Это потребовало использования сценария оболочки с вкладкой cron, чтобы получить правильный день месяца для cron, например:
1 0 [shell command] * * [my script]
Я не был знаком со сценарием и вообще не был знаком со сценариями оболочки, поэтому у меня не было хорошего способа проверить его, кроме как ждать конца месяца и посмотреть, правильно ли выполнен сценарий (на самом деле мое решение заключалось в том, чтобы найти работник, который знал намного больше о cron и shell-скриптах, которые я сделал).
Поэтому мне любопытно, есть ли какие-нибудь полезные обходные пути для тестирования чувствительных ко времени сценариев.
Ответы:
В дополнение к модульному тестированию, есть две другие стратегии для настройки автоматических тестов для решения проблем, связанных с ОС:
Или:
if
в вашу программу специальные условия, которые заставят программу вести себя по-другому. В Unix это можно сделать, проверив, установлена ли определенная переменная окружения, напримерFOOBAR_TEST_TIME_WITH_T=500
. Ваши автоматизированные тесты будут тогда просто использовать разные настройки переменных среды и разные переменные среды, чтобы выполнить то, что вам нужно.Вы также можете ссылаться на разные библиотеки, если ваши взаимодействия могут быть выражены на уровне библиотеки, который вы можете рассматривать как виртуализацию (если «библиотека» - это ядро ОС) или как метод инструментария. Можно использовать оба термина, хотя используемый сегодня термин виртуализация почти всегда означает что-то вроде VMWare. Библиотека, специально предназначенная для возврата постоянных значений или повторного запуска определенных взаимодействий, была бы имитацией или заглушкой .
Есть также автоматические инструментальные средства, которые могут переписать ваши двоичные файлы, чтобы получить другие желаемые эффекты, такие как заполнение файловой системы.
В целом, ваша цель - найти ошибки. Чтобы проверить странные случаи, такие как переполнение файловой системы, проще и эффективнее всего лишь вручную применить инструмент в вашей программе, редко, если вообще когда-либо, идти по пути виртуализации или ручной настройки компьютера.
источник
Наиболее эффективный - изменить дату машины, на которой вы тестируете. Установите его немного раньше, когда он должен работать, и проверьте, когда он запускается и работает ли он правильно. Однако это не всегда возможно, если задействовано несколько машин или если требуются ресурсы, которые ваша компания не может контролировать. Убедитесь, что вы делаете это в течение нескольких месяцев, и убедитесь, что вы меняете год пару раз, чтобы проверить февраль.
источник
Я не знаю о вашем сценарии, но я пытаюсь использовать какой-то параметр, где я могу установить дату. В вашем случае, если дата не указана, по умолчанию устанавливается конец месяца. В вашем коде возьмите параметр date и запустите, если сегодня два дня назад. Вы сможете не только проверить его (передать дату через два дня), но и запустить на следующий день в случае, если что-то помешало его работе в нормальных условиях (сбой питания, отключение сервера и т. Д.).
источник
Поскольку вы упомянули crontab, я предполагаю, что вы работаете в среде nix. В этом случае, я думаю, вам стоит проверить libfaketime:
http://www.code-wizards.com/projects/libfaketime/
Благодаря магии LD_PRELOAD мы можем загружать пользовательские версии функций библиотеки, если они соответствуют интерфейсу. Libfaketime загружает версии системных вызовов времени, которые позволяют вам настраивать их поведение с помощью переменных среды. Вы можете заставить time () возвращать жестко запрограммированное значение или смещение по сравнению с текущим временем, и все это без воздействия на других пользователей.
источник
Нет необходимости тестировать cron, так как он довольно много раз тестировался («производственный тест») для многих поколений. Конечно, если вы работаете со сценарием оболочки, вы можете установить дату / время на виртуальной машине.
Предпочтительный способ справиться с этим - «издеваться над часами», используя один или несколько приемов программирования для фальсификации времени. В сценариях оболочки вы можете использовать синтаксис $ {: -}, чтобы использовать дату, установленную в переменной среды, и использовать реальное время, если оно не было принудительным.
В других языках мы используем фиктивные библиотеки или строим абстракцию за сутки.
Макетные часы хороши тем, что вы можете автоматизировать их, вместо того чтобы вручную настраивать тест. Это очень большое преимущество, когда дело доходит до изменения скрипта / кода позже, и вы можете легко определить, работает ли он по-прежнему или нет.
источник