Печатные публикации

#2: Обмануть время: RunAsDate в помощь тестировщику

Анна Сергеева. Обмануть время: RunAsDate в помощь тестировщику // СА. 2014. № 1-2.Анна Сергеева. Обмануть время: RunAsDate в помощь тестировщику // Системный администратор. 2014. № 1-2. С.134-135.


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


Опубликовано в разделе "Разработка / Тестирование"

Эта же статья на сайте журнала


Пожалуй, на сегодняшний день с уверенностью можно говорить о том, что за последние десять лет в России полностью сформировался отлаженный цикл производства программных продуктов. И разумеется, тестирование в этом цикле заняло свое законное и немаловажное место. Ведь все, что как бы то ни было программируется, так или иначе подвергается проверке (тестированию).И какие только задачи не доводится решать специалистам службы обеспечения качества(Quality Assurance,QA).И тесты производительности, и проверки безопасности, и регрессионное тестирование, и удобство использования, и так далее[1].Постойте-ка, а как же тесты, связанные с обработкой даты и времени? Конечно, и это тоже необходимо!Среди таких тестов могут иметь место такие проверки:


  • срок используемой лицензии;
  • даты создания и редактирования файлов;
  • ведение журналов событий;
  • работа с записями базы данных;
  • срабатывание временных триггеров и многое-многое другое...

Не спорим, что существуют различные подходы к проведению подобных тестов. Самый очевидный среди них, так сказать, «прямо в лоб», - это перевести системное время на компьютере тестировщика. Однако согласитесь, что это может привести к нарушениям в работе целого ряда программ, параллельно запущенных на той же самой машине. Печальный итог, такой вариант развития событий явно не подходит. Нужно каким-то образом научиться переводить время в самих программах, не затрагивая системное. Как же этого добиться?

Различные источники в качестве средств заморозки времени предлагают несколько вариантов, у каждого из которых есть свои особенности.


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


Cracklock воспринимается многими антивирусами в качестве угрозы (поскольку для перехвата функций времени использует внедрение в процесс и «патч»).


SetDate, хоть и неплоха сама по себе, требует редактировать ярлыки программ вручную, что снижает ее удобство.

В качестве сравнительно простого и быстрого, а также, как показал опыт, весьма удобного средства для имитации «виртуального путешествия во времени» автор предлагает задействовать утилиту RunAsDate [2].


Знакомьтесь, RunAsDate


В отличие от аналогов она имеет ряд преимуществ:


  • весьма удобный и понятный интерфейс, позволяющий задать все нужные настройки;

  • проект регулярно обновляется, исправляются проблемы, добавляются новые опции;

  • имеется подробная документация;

  • поддержка работы с командной строкой, что дает возможность автоматизации запуска/останова.


Среди недостатков можно отметить, что RunAsDate работает только под Windows, так что о кроссплатформенном тестировании речи не идет, зато под Windows — все очень быстро и удобно.


Кстати, данной утилитой можно пользоваться, как любила говаривать Милновская Сова, абсолютно безвозмездно, то есть, даром, поскольку лицензия ее Freeware.


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


И вот здесь-то, пожалуй, начинается самое интересное, поскольку RunAsDate делает возможным одновременный запуск нескольких приложений, для каждого из которых будут настроены свои дата и время. Такая возможность значительно расширяет горизонты тестовых исследований.


Как же работает RunAsDate? Принцип работы утилиты следующий. Она отслеживает сигналы ядра API, которые возвращают текущие значения времени и даты:


(GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime)


и тут же подменяет данные на дату и время, указанные тестировщиком в настройках утилиты.


Как использовать RunAsDate


Инсталляция утилиты не нужна, а также нет никаких сторонних зависимостей.


Для использования RunAsDate достаточно скопировать в папку исполняемый файл (RunAsDate.exe) и запустить. На данный момент разработчиками представлена версия RunAsDate 1.21.


После запуска открывается окно настроек утилиты (Рис. 1), где настраиваются следующие опции:


  • Application to run — тестируемое приложение для запуска;

  • Date/Time — дата и время, которые будут установлены;

  • Parameters — задание параметров командной строки, с которыми будет запущена программа;

  • Move the time forward according to the real time — позволяет перевести часы вперед к реальному времени;

  • Return to the current date/time after xx seconds — возврат к текущей дате и времени по истечении указанного числа секунд;

  • Immediate Mode — изменение даты сразу после старта программы;

  • Run – запуск приложения в соответствии с указанными настройками даты и времени;

  • Create Desktop Shortcut — создание именованного ярлыка на рабочем столе;

  • Close – закрытие без сохранения изменений;

  • About вызов окна с информацией о программе.


Рис. 1. Интерфейс утилиты RunAsDate.


Возможность работы RunAsDate с командной строкой


Весьма удобным, особенно при написании скриптов автоматизации, является запуск тестовых утилит из командной строки. И для RunAsDate также реализована такая возможность. Для работы RunAsDate из командной строки используется следующий синтаксис:


RunAsDate.exe [ddmmyyyy] {hh:mm:ss} [Программа для запуска] {Параметры программы}


Пример использования


Для демонстрации в Borland C++ Builder написана программа, которая выводит форму с указанием текущей даты:


void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

ShortDateFormat = "d/m/yyyy";

Label1->Caption = DateToStr(Date());

}


Также форма содержит заголовок с указанием названия приложения и пути к нему. Это помогает отличить два запущенных приложения.


Одно запускается просто так («контрольная группа», с именем Project1):


D:\BCB_prj\Date\Project1.exe


А другое (тестируемое, которое является его полной копией, со сменой имени с Project1 на Project2) запускается программой RunAsDate.exe. Здесь вместо текущей даты (6 декабря 2013) установлена своя (7 ноября 2013).


D:\Test\RunAsDate.exe 07\11\2013 D:\BCB_prj\Date\Project2.exe


На рисунке 2 собраны результаты работы: формы приложений Project1 (отображает текущую дату) и Project2 (с измененной датой), окно утилиты RunAsDate (с настройками изменений даты для Project2), а также окно системного времени из панели задач Windows.



Рис. 2. Пример перевода времени в тестируемой программе с помощью RunAsDate.


Затем, вручную или с помощью инструментов автоматизации тестирования Windows-приложений, которые предпочитает использовать в своей работе конкретный тестировщик, можно проводить сверку значения даты, отображаемой на форме тестируемого приложения, с заданным в RunAsDate.


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


Важные дополнения


Во-первых, упомянем системные требования:


  • Windows 2000

  • Windows XP

  • Windows Server 2003

  • Windows Server 2008

  • Windows Vista

  • Windows 7

  • Windows 8.


Для более старых версий Windows поддержки нет. Кроме того, для тестирования x64 программ используется специальная версия RunAsDate x64.[2]


Также отметим, что одной из особенностей работы RunAsDate является то, что с ее помощьюможно воздействовать только на те приложения, которые не обращаются за значением даты и времени к другим ресурсам (среди таких исключений могут оказаться программы, загружающие время и дату с удаленного сервера). Будьте внимательны при составлении методик тестирования.


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


Заключение


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


Если читатель заинтересовался данным сюжетом и у него возникли какие-либо вопросы по данной теме, или же предложения по темам следующих статей, автор просит связаться по электронной почте annserge@rambler.ru.


Ссылки:


[1] Myers, G.J. The Art of Software Testing / G.J. Myers, C. Sandler, T. Badgett // John Wiley & Sons, Inc., 2011. - 3rd Edition - 240 с.

[2] Сайт программы RunAsDate - http://www.nirsoft.net/utils/run_as_date.html