Как вы тестируете программное обеспечение, чувствительное ко времени?

9

Под чувствительностью ко времени я подразумеваю, например, сценарий, который выполняется только один раз в месяц, или сценарий, который выполняется непрерывно, но дает определенный результат только один раз в месяц. Очевидно, что вы можете выполнить модульное тестирование во многих случаях, но есть исключения (в моем понимании).

Недавний пример, с которым я столкнулся, - настройка задания cron для запуска со второго по последний день каждого месяца. Это потребовало использования сценария оболочки с вкладкой cron, чтобы получить правильный день месяца для cron, например:

1 0 [shell command] * * [my script]

Я не был знаком со сценарием и вообще не был знаком со сценариями оболочки, поэтому у меня не было хорошего способа проверить его, кроме как ждать конца месяца и посмотреть, правильно ли выполнен сценарий (на самом деле мое решение заключалось в том, чтобы найти работник, который знал намного больше о cron и shell-скриптах, которые я сделал).

Поэтому мне любопытно, есть ли какие-нибудь полезные обходные пути для тестирования чувствительных ко времени сценариев.

DanLeaningphp
источник
3
Вы можете запустить это на виртуальной машине и установить для системного времени удобное время, например, полночь до дня запуска сценария или что-то в этом роде.
Вит Пи
2
crontab выполняет обычные сценарии оболочки, вы можете просто выполнить сценарий вручную (в песочнице или в vm, если вы боитесь того, что он будет делать), не дожидаясь crontab
авария
2
Мой ответ может быть излишним для вашего конкретного случая: просто запустите скрипт. Но для более крупного вопроса потребуются такие решения, как виртуализация и инструментарий.
Макнейл

Ответы:

7

В дополнение к модульному тестированию, есть две другие стратегии для настройки автоматических тестов для решения проблем, связанных с ОС:

  • Виртуализация : вы настраиваете несколько образов ОС (например, с использованием VMWare ) с точными конфигурациями, которые вам требуются, настраиваете способ автоматического извлечения двоичного файла для тестирования (обычно путем монтирования специального каталога в пространство виртуальной машины), а затем выполняете тестовое задание.

Или:

  • Инструментарий : Вручную добавьте ifв вашу программу специальные условия, которые заставят программу вести себя по-другому. В Unix это можно сделать, проверив, установлена ​​ли определенная переменная окружения, например FOOBAR_TEST_TIME_WITH_T=500. Ваши автоматизированные тесты будут тогда просто использовать разные настройки переменных среды и разные переменные среды, чтобы выполнить то, что вам нужно.

Вы также можете ссылаться на разные библиотеки, если ваши взаимодействия могут быть выражены на уровне библиотеки, который вы можете рассматривать как виртуализацию (если «библиотека» - это ядро ​​ОС) или как метод инструментария. Можно использовать оба термина, хотя используемый сегодня термин виртуализация почти всегда означает что-то вроде VMWare. Библиотека, специально предназначенная для возврата постоянных значений или повторного запуска определенных взаимодействий, была бы имитацией или заглушкой .

Есть также автоматические инструментальные средства, которые могут переписать ваши двоичные файлы, чтобы получить другие желаемые эффекты, такие как заполнение файловой системы.

В целом, ваша цель - найти ошибки. Чтобы проверить странные случаи, такие как переполнение файловой системы, проще и эффективнее всего лишь вручную применить инструмент в вашей программе, редко, если вообще когда-либо, идти по пути виртуализации или ручной настройки компьютера.

Макнейл
источник
я думаю, что ваша «виртуализация библиотеки» более известна как насмешка, или, скорее, использование ложной библиотеки.
Хавьер
10

Наиболее эффективный - изменить дату машины, на которой вы тестируете. Установите его немного раньше, когда он должен работать, и проверьте, когда он запускается и работает ли он правильно. Однако это не всегда возможно, если задействовано несколько машин или если требуются ресурсы, которые ваша компания не может контролировать. Убедитесь, что вы делаете это в течение нескольких месяцев, и убедитесь, что вы меняете год пару раз, чтобы проверить февраль.

Линдон Вруман
источник
1
если у вас установлено программное обеспечение с (n оценочной) лицензией в течение ограниченного времени, работа с часами может привести к блокировке их выполнения.
Марьян Венема
В некоторых компаниях все рабочие станции, подключенные к сети, не должны отклоняться от времени «сервера» на 5 минут, в противном случае рабочая станция заблокируется. Это случилось со мной :-)
OnesimusUnbound
1

Я не знаю о вашем сценарии, но я пытаюсь использовать какой-то параметр, где я могу установить дату. В вашем случае, если дата не указана, по умолчанию устанавливается конец месяца. В вашем коде возьмите параметр date и запустите, если сегодня два дня назад. Вы сможете не только проверить его (передать дату через два дня), но и запустить на следующий день в случае, если что-то помешало его работе в нормальных условиях (сбой питания, отключение сервера и т. Д.).

JeffO
источник
1

Поскольку вы упомянули crontab, я предполагаю, что вы работаете в среде nix. В этом случае, я думаю, вам стоит проверить libfaketime:
http://www.code-wizards.com/projects/libfaketime/

Благодаря магии LD_PRELOAD мы можем загружать пользовательские версии функций библиотеки, если они соответствуют интерфейсу. Libfaketime загружает версии системных вызовов времени, которые позволяют вам настраивать их поведение с помощью переменных среды. Вы можете заставить time () возвращать жестко запрограммированное значение или смещение по сравнению с текущим временем, и все это без воздействия на других пользователей.

frankc
источник
0

Нет необходимости тестировать cron, так как он довольно много раз тестировался («производственный тест») для многих поколений. Конечно, если вы работаете со сценарием оболочки, вы можете установить дату / время на виртуальной машине.

Предпочтительный способ справиться с этим - «издеваться над часами», используя один или несколько приемов программирования для фальсификации времени. В сценариях оболочки вы можете использовать синтаксис $ {: -}, чтобы использовать дату, установленную в переменной среды, и использовать реальное время, если оно не было принудительным.

В других языках мы используем фиктивные библиотеки или строим абстракцию за сутки.

Макетные часы хороши тем, что вы можете автоматизировать их, вместо того чтобы вручную настраивать тест. Это очень большое преимущество, когда дело доходит до изменения скрипта / кода позже, и вы можете легко определить, работает ли он по-прежнему или нет.

Тим Оттингер
источник