TestComplete: автоматическая пауза скриптов при блокировке компьютера

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

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

Полностью автоматизировать этот процесс не удастся, однако наше полуавтоматическое решение вполне подойдёт для большинства случаев:

  1. Прежде всего включим Call Stack для Warning-ов (это нам понадобится в дальнейшм). Для этого, например, в обработчик события OnStartTest напишем следующий код:
     Log.CallStackSettings.EnableStackOnWarning = true;
  2. Далее в меню Tools | Options | Engines | Log включим опцию Show Log on Pause
  3. Теперь в обработчик события OnLogError напишем следующее:
    if(LogParams.MessageText == 'The operation cannot be performed, because the user session is locked.') {
      Log.Warning(LogParams.MessageText, LogParams.AdditionalText);
      BuiltIn.ShowMessage('Screen is locked. Perform last action manually then continue test execution...');
      Runner.Pause();
      LogParams.Locked = true;
    }
  4. Теперь мы можем запускать тесты. Если компьютер заблокируется, TestComplete покажет сообщение. Нажимаем OK, TestComplete переходит в режим паузы.
  5. Далее нам нужно определить, что именно пытался сделать TestComplete, когда компьютер был заблокирован, и выполнить это действие вручную. Для этого мы можем воспользоваться вкладкой Additional Info, выбрав в логе наш Warning. Если этого недостаточно, можно воспользоваться вкладкой Call Stack, где можно просмотреть весь стек вызванных функций.
  6. После выполнения необходимого действия нажимаем Play в окне TestComplete или в TestComplete Indicator и выполнение тестов продолжается со следующей строки.
  7. Конечно, было бы хорошо, чтобы не приходилось искать и выполнять вручную последние действия скрипта, однако сделать это невозможно.

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